- 1、本文档共32页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
写的不错~~本人正在学习中~~有兴趣的顶下~`我将继续补发后面的~~~ 第一篇:函数的运行? ?????????????????????????????????第一篇:函数的运行? ????在一般的单片机系统中,是以前后台的方式(大循环+中断)来处理数据和作出反应的。? ????例子如下:? ????? ????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如何才能有效地利用函数的地址呢?? 第二篇:?人工堆栈??? ????在单片机的指令集中,一类指令是专门与堆栈和PC指针打道的,它们是? ????rcall???相对调用子程序指令? ????icall???间接调用子程序指令? ????ret?????子程序返回指令? ????reti????中断返回指令????? ????对于ret和reti,它们都可以将堆栈栈顶的两个字节被弹出来送入程序计数器PC中,一般用来从子程序或中断中退出。其中reti还可以在退出中断时,重开全局中断使能。? ????有了这个基础,就可以建立我们的人工堆栈了。? ???
文档评论(0)