欢迎来到天天文库
浏览记录
ID:15797157
大小:232.69 KB
页数:50页
时间:2018-08-05
《建立一个属于自己的avr的rtos》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、教程:建立一个属于自己的AVR的RTOS作者:黄健昌序自从03年以来,对单片机的RTOS的学习和应用的热潮可谓一浪高过一浪.03年,在离开校园前的,非典的那几个月,在华师的后门那里买了本邵贝贝的《UCOSII》,通读了几次,没有实验器材,也不了了之。在21IC上,大家都可以看到杨屹写的关于UCOSII在51上的移植,于是掀起了51上的RTOS的热潮。再后来,陈明计先生推出的smallrots,展示了一个用在51上的微内核,足以在52上进行任务调度。前段时间,在ouravr上面开有专门关于AVR的Rtos的专栏,并且不少的兄弟把自己的作品拿出来,
2、着实开了不少眼界。这时,我重新回顾了使用单片机的经历,觉得很有必要,从根本上对单片机的RTOS的知识进行整理,于是,我开始了编写一个用在AVR单片机的RTOS。当时,我所有的知识和资源有:Proteus6.7可以用来模拟仿真avr系列的单片机WinAVRv2.0.5.48基于GCCAVR的编译环境,好处在于可以在C语言中插入asm的语句mega81K的ram有8K的rom,是开发8位的RTOS的一个理想的器件,并且我对它也比较熟悉。写UCOS的JeanJ.Labrosse在他的书上有这样一句话,“渐渐地,我自然会想到,写个实时内核直有那么难吗?
3、不就是不断地保存,恢复CPU的那些寄存器嘛。”好了,当这一切准备好后,我们就可以开始我们的Rtosformega8的实验之旅了。本文列出的例子,全部完整可用。只需要一个文件就可以编译了。我相信,只要适当可用,最简单的就是最好的,这样可以排除一些不必要的干扰,让大家专注到每一个过程的学习。第一篇:函数的运行在一般的单片机系统中,是以前后台的方式(大循环+中断)来处理数据和作出反应的。例子如下:makefile的设定:运行WinAvr中的Mfile,设定如下MCUType:mega8Optimizationlevel:sDebugformat:AV
4、R-COFFC/C++sourcefile:选译要编译的C文件#includevoidfun1(void){unsignedchari=0;while(1){PORTB=i++;PORTC=0x01<<(i%8);}}intmain(void){fun1();}首先,提出一个问题:如果要调用一个函数,真是只能以上面的方式进行吗?相信学习过C语言的各位会回答,No!我们还有一种方式,就是“用函数指针变量调用函数”,如果大家都和我一样,当初的教科书是谭浩强先生的《C程序设计》的话,请找回书的第9.5节。例子:用函数指针变量调用函
5、数#includevoidfun1(void){unsignedchari=0;while(1){PORTB=i++;PORTC=0x01<<(i%8);}}void(*pfun)();//指向函数的指针intmain(void){pfun=fun1;//(*pfun)();//运行指针所指向的函数}第二种,是“把指向函数的指针变量作函数参数”#includevoidfun1(void){unsignedchari=0;while(1){PORTB=i++;PORTC=0x01<<(i%8);}}void
6、RunFun(void(*pfun)())//获得了要传递的函数的地址{(*pfun)();//在RunFun中,运行指针所指向的函数}intmain(void){RunFun(fun1);//将函数的指针作为变量传递}看到上面的两种方式,很多人可能会说,“这的确不错”,但是这样与我们想要的RTOS,有什么关系呢?各位请细心向下看。以下是GCC对上面的代码的编译的情况:对main()中的RunFun(fun1);的编译如下ldir24,lo8(pm(fun1))ldir25,hi8(pm(fun1))rcallRunFun对voidRunFun
7、(void(*pfun)())的编译如下/*voidRunFun(void(*pfun)())*//*(*pfun)();*/.LM6:movwr30,r24icallret在调用voidRunFun(void(*pfun)())的时候,的确可以把fun1的地址通过r24和r25传递给RunFun()。但是,RTOS如何才能有效地利用函数的地址呢?第二篇:人工堆栈在单片机的指令集中,一类指令是专门与堆栈和PC指针打道的,它们是rcall相对调用子程序指令icall间接调用子程序指令ret子程序返回指令reti中断返回指令对于ret和reti,它
8、们都可以将堆栈栈顶的两个字节被弹出来送入程序计数器PC中,一般用来从子程序或中断中退出。其中reti还可以在退出中断时,重开全局中断使能。有了这个基础
此文档下载收益归作者所有