这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » AVR的RTOS(函数的运行)

共1条 1/1 1 跳转至

AVR的RTOS(函数的运行)

助工
2014-10-05 14:47:15     打赏
   在一般的单片机系统中,是以前后台的方式(大循环+中断)来处理数据和作出反应的。 
    例子如下: 
    
    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 RunFun(void (*pfun)())  //获得了要传递的函数的地址 
{ 
  (*pfun)();                 //在RunFun中,运行指针所指向的函数 
} 

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

    以下是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如何才能有效地利用函数的地址呢?


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]