您的位置 首页 培训

详解根据51单片机的small rtos(1)

陈明计,这个人有必要要认识下,因为smallrtos是他写的,他根据ucos的原理写的。这个smallrtos是可以再51单片机上运行的,但是

陈明计,这个人有必要要知道下,由于small rtos 是他写的,他依据ucos的原理写的。这个small rtos是能够再51单片机上运转的,可是受ARM内存的约束。作为单片机开发的时间都得想着内存的问题,由于51芯片资源有限。 好了不废话开端学习的旅程

首要你能够在51hei下个small rtos 源代码http://www.51hei.com/f/small_rtos1.12.1.zip或许跟我一步一步写。 keil51的东西编译代码后会生成一个.m51的文件,这个文件要学会去看,由于他把你的一些内存分配的地址和函数的地址都会以列表显示出来。
操作体系的使命其实都是一个死循环。咱们写的操作体系其实便是把$P单片机的指针指向使命的首地址罢了。那么首地址咱们必需要保存下来以便使命切换的时分运用在small rtos 中时保存在 OSTsakStackBotton[]这个数组内部的。那么咱们怎样获取到使命的首地址呢,在这儿 他是静态寄存到数组内的。即 void (*code TaskFuction[OS_MAX_TASKS])(void)={TaskA,TaskB,TaskC}; 这个事一个函数指针寄存的数组,看不了解的你能够查下材料。 这儿他保存了3个函数的地址 。
经过编译后检查.m51文件也能够看到相关信息。(这个是我编译后的文件默许是在E: emp当然你能够改下途径)
CODE 03A4H 000AH UNIT ?PR?TASKA?EXT1
CODE 03AEH 000AH UNIT ?PR?TASKB?EXT1
CODE 03B8H 000AH UNIT ?PR?TASKC?EXT1
C:03B7H PUBLIC TaskFuction
经过上述的能够看出 TaskFuction首地址在 C:03CBH 那么程序运转后能够直接翻看C:03B7H地址 看接下来的地址内是否寄存
核对下应该是和.m51共同的。 使命首地址有了,然后咱们看下他的代码。mian()里边没什么代码便是定时器0的初始化,还有便是OSStart() 这个函数.这个函数其实便是初始化仓库并把体系切到使命A 的函数。至于怎样处理要害的仓库怎么处理。咱们来细心看下. 我这儿运转到mian()函数栈顶指针
至于你想知道为什么是0x15看下.m51


这儿其实现已告知你了。第0组作业寄存器8个+8个DATA数据界说。然后mian()调用OSStart()


跳转到OSStart() 里
这儿看出压入了2个字节(51是字节),
从内存中能够看出压入的是下个代码的地址。 聪明的或许现已看出来了,吧使命A的地址替换这儿的86 03 ,那么履行RET就能够跳转到使命A中去履行代码。到这儿是不是让你来劲了? 然后咱们持续。这个STACK 是什么,呵呵在汇编部分的代码如下:


这儿重定位仓库,并界说了一个内存单元,至于他的方位看.m51
是不是很偶然,刚好在寄存main()函数指针的RAM地址那,可是细心想想这是天经地义的,可是你也能够也能够想办法不怎样偶然,可是这样充分利用 RAM空间吧使命A的掩盖main入栈的指针式最好的。 然后下面代码应该很好了解。吧使命的首地址存到随机变化的OSTsakStackBotton中,这儿还加了个闲暇使命的函数指针。然后开端布置各个使命的仓库空间。 他压入使命A的首地址然后把栈顶指针知道使命A的高地址中,然后从尾部开端寄存底0,优先级使命,0,使命C,0,使命B。那么中心的空代码部分就能够作为使命A能够运用的内存块。然后就跳转到使命A中履行代码

至此我现已把第一个使命切换,解析出来了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/255287.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部