詳解基于51單片機(jī)的small rtos(1)
CODE 03AEH 000AH UNIT ?PR?TASKB?EXT1
CODE 03B8H 000AH UNIT ?PR?TASKC?EXT1
核對(duì)下應(yīng)該是和.m51一致的。 任務(wù)首地址有了,然后我們看下他的代碼。mian()里面沒(méi)什么代碼就是定時(shí)器0的初始化,還有就是OSStart() 這個(gè)函數(shù).這個(gè)函數(shù)其實(shí)就是初始化堆棧并把系統(tǒng)切到任務(wù)A 的函數(shù)。至于怎么處理關(guān)鍵的堆棧如何處理。我們來(lái)仔細(xì)看下. 我這里運(yùn)行到mian()函數(shù)棧頂指針
至于你想知道為什么是0x15看下.m51
這里其實(shí)已經(jīng)告訴你了。第0組工作寄存器8個(gè)+8個(gè)DATA數(shù)據(jù)定義。然后mian()調(diào)用OSStart()
跳轉(zhuǎn)到OSStart() 里
這里看出壓入了2個(gè)字節(jié)(51是字節(jié)),
從內(nèi)存中可以看出壓入的是下個(gè)代碼的地址。 聰明的可能已經(jīng)看出來(lái)了,吧任務(wù)A的地址替換這里的86 03 ,那么執(zhí)行RET就可以跳轉(zhuǎn)到任務(wù)A中去執(zhí)行代碼。到這里是不是讓你來(lái)勁了? 然后我們繼續(xù)。這個(gè)STACK 是什么,呵呵在匯編部分的代碼如下:
這里重定位堆棧,并定義了一個(gè)內(nèi)存單元,至于他的位置看.m51
是不是很巧合,剛好在存放main()函數(shù)指針的RAM地址那,但是仔細(xì)想想這是理所當(dāng)然的,但是你也可以也可以想辦法不怎么巧合,但是這樣充分利用 RAM空間吧任務(wù)A的覆蓋main入棧的指針式最好的。 然后下面代碼應(yīng)該很好理解。吧任務(wù)的首地址存到隨機(jī)變動(dòng)的OSTsakStackBotton中,這里還加了個(gè)空閑任務(wù)的函數(shù)指針。然后開(kāi)始部署各個(gè)任務(wù)的堆棧空間。 他壓入任務(wù)A的首地址然后把棧頂指針知道任務(wù)A的高地址中,然后從尾部開(kāi)始存放底0,優(yōu)先級(jí)任務(wù),0,任務(wù)C,0,任務(wù)B。那么中間的空代碼部分就可以作為任務(wù)A可以使用的內(nèi)存塊。然后就跳轉(zhuǎn)到任務(wù)A中執(zhí)行代碼
至此我已經(jīng)把第一個(gè)任務(wù)切換,解析出來(lái)了。
評(píng)論