<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 詳解基于51單片機的small rtos(1)

詳解基于51單片機的small rtos(1)

作者: 時(shí)間:2016-11-29 來(lái)源:網(wǎng)絡(luò ) 收藏
陳明計,這個(gè)人有必要要認識下,因為small rtos 是他寫(xiě)的,他根據ucos的原理寫(xiě)的。這個(gè)small rtos是可以再51單片機上運行的,但是受ARM內存的限制。作為單片機開(kāi)發(fā)的時(shí)刻都得想著(zhù)內存的問(wèn)題,因為51芯片資源有限。 好了不廢話(huà)開(kāi)始學(xué)習的旅程
首先你可以在51hei下個(gè)small rtos 源代碼http://www.51hei.com/f/small_rtos1.12.1.zip或者跟我一步一步寫(xiě)。 keil51的工具編譯代碼后會(huì )生成一個(gè).m51的文件,這個(gè)文件要學(xué)會(huì )去看,因為他把你的一些內存分配的地址和函數的地址都會(huì )以列表顯示出來(lái)。
操作系統的任務(wù)其實(shí)都是一個(gè)死循環(huán)。我們寫(xiě)的操作系統其實(shí)就是把$P單片機的指針指向任務(wù)的首地址而已。那么首地址我們必須要保存下來(lái)以便任務(wù)切換的時(shí)候使用在small rtos 中時(shí)保存在 OSTsakStackBotton[]這個(gè)數組內部的。那么我們怎樣獲取到任務(wù)的首地址呢,在這里 他是靜態(tài)存放到數組內的。即 void (*code TaskFuction[OS_MAX_TASKS])(void)={TaskA,TaskB,TaskC}; 這個(gè)事一個(gè)函數指針存放的數組,看不明白的你可以查下資料。 這里他保存了3個(gè)函數的地址 。
通過(guò)編譯后查看.m51文件也可以看到相關(guān)信息。(這個(gè)是我編譯后的文件默認是在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
通過(guò)上述的可以看出 TaskFuction首地址在 C:03CBH 那么程序運行后可以直接翻看C:03B7H地址 看接下來(lái)的地址內是否存放
核對下應該是和.m51一致的。 任務(wù)首地址有了,然后我們看下他的代碼。mian()里面沒(méi)什么代碼就是定時(shí)器0的初始化,還有就是OSStart() 這個(gè)函數.這個(gè)函數其實(shí)就是初始化堆棧并把系統切到任務(wù)A 的函數。至于怎么處理關(guān)鍵的堆棧如何處理。我們來(lái)仔細看下. 我這里運行到mian()函數棧頂指針
至于你想知道為什么是0x15看下.m51


這里其實(shí)已經(jīng)告訴你了。第0組工作寄存器8個(gè)+8個(gè)DATA數據定義。然后mian()調用OSStart()

本文引用地址:http://dyxdggzs.com/article/201611/323318.htm


跳轉到OSStart() 里
這里看出壓入了2個(gè)字節(51是字節),
從內存中可以看出壓入的是下個(gè)代碼的地址。 聰明的可能已經(jīng)看出來(lái)了,吧任務(wù)A的地址替換這里的86 03 ,那么執行RET就可以跳轉到任務(wù)A中去執行代碼。到這里是不是讓你來(lái)勁了? 然后我們繼續。這個(gè)STACK 是什么,呵呵在匯編部分的代碼如下:


這里重定位堆棧,并定義了一個(gè)內存單元,至于他的位置看.m51
是不是很巧合,剛好在存放main()函數指針的RAM地址那,但是仔細想想這是理所當然的,但是你也可以也可以想辦法不怎么巧合,但是這樣充分利用 RAM空間吧任務(wù)A的覆蓋main入棧的指針式最好的。 然后下面代碼應該很好理解。吧任務(wù)的首地址存到隨機變動(dòng)的OSTsakStackBotton中,這里還加了個(gè)空閑任務(wù)的函數指針。然后開(kāi)始部署各個(gè)任務(wù)的堆??臻g。 他壓入任務(wù)A的首地址然后把棧頂指針知道任務(wù)A的高地址中,然后從尾部開(kāi)始存放底0,優(yōu)先級任務(wù),0,任務(wù)C,0,任務(wù)B。那么中間的空代碼部分就可以作為任務(wù)A可以使用的內存塊。然后就跳轉到任務(wù)A中執行代碼

至此我已經(jīng)把第一個(gè)任務(wù)切換,解析出來(lái)了。



關(guān)鍵詞: 51單片機smallrto

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>