网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> 技术文库 >> 嵌入式 >> 文章正文
  第一篇:函数的运行         ★★★ 【字体:
第一篇:函数的运行
作者:61IC录入    文章来源:本站原创    点击数:    更新时间:2006-4-7    
在一般的单片机系统中,是以前后台的方式(大循环+中断)来处理数据和作出反应的。
    例子如下:
   
    makefile的设定:运行WinAvr中的Mfile,设定如下
    MCU Type: mega8
    Optimization level: s
    Debug format :AVR-COFF
    C/C++ source file: 选译要编译的C文件

#include <avr/io.h>
void fun1(void)
{
  unsigned char i=0;
  while(1)
  {
    PORTB=i++;
    PORTC=0x01<<(i%8);
  }
}

int main(void)
{
  fun1();
}

    首先,提出一个问题:如果要调用一个函数,真是只能以上面的方式进行吗?
    相信学习过C语言的各位会回答,No!我们还有一种方式,就是“用函数指针变量调用函数”,如果大家都和我一样,当初的教科书是谭浩强先生的《C程序设计》的话,请找回书的第9.5节。
    
    例子:用函数指针变量调用函数


#include <avr/io.h>
void fun1(void)
{
  unsigned char i=0;
  while(1)
  {
    PORTB=i++;
    PORTC=0x01<<(i%8);
  }
}
void (*pfun)();  //指向函数的指针

int main(void)
{

  pfun=fun1;    //
  (*pfun)();    //运行指针所指向的函数
}
    
     第二种,是“把指向函数的指针变量作函数参数”
     
#include <avr/io.h>
void fun1(void)
{
  unsigned char i=0;
  while(1)
  {
    PORTB=i++;
    PORTC=0x01<<(i%8);
  }
}

void RunFun(void (*pfun)())  //获得了要传递的函数的地址
{
  (*pfun)();                 //在RunFun中,运行指针所指向的函数
}

int main(void)
{
   RunFun(fun1);            //将函数的指针作为变量传递
    
}

    看到上面的两种方式,很多人可能会说,“这的确不错”,但是这样与我们想要的RTOS,有什么关系呢?各位请细心向下看。

    以下是GCC对上面的代码的编译的情况:
    
    对main()中的RunFun(fun1); 的编译如下
  ldi r24,lo8(pm(fun1))
  ldi r25,hi8(pm(fun1))
  rcall RunFun
    
对void RunFun(void (*pfun)())的编译如下
                /*void RunFun(void (*pfun)())*/
               /*(*pfun)();*/
.LM6:
  movw r30,r24
  icall
  ret

    在调用void RunFun(void (*pfun)())的时候,的确可以把fun1的地址通过r24和r25传递给RunFun()。但是,RTOS如何才能有效地利用函数的地址呢?
  

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    没有相关文章
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号