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