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