打造自己的rtos(1)

从网上转转载的一片文章,原作者好像叫 黄建昌 ,觉得很有价值。

                                 第一篇:函数的运行

     在一般的单片机系统中,是以前后台的方式(大循环+中断)来处理数据和作出反应的。
     例子如下:
     
     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如何才能有效地利用函数的地址呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值