陳明計,這個人有必要要認識下,因為small rtos 是他寫的,他根據ucos的原理寫的。這個small rtos是可以再51單片機上運行的,但是受ARM內存的限制。 作為單片機開發的時刻都得想著內存的問題,因為51芯片資源有限。 好了不廢話開始學習的旅程
CODE 03AEH 000AH UNIT ?PR?TASKB?EXT1
CODE 03B8H 000AH UNIT ?PR?TASKC?EXT1

核對下應該是和.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中執行代碼
至此我已經把第一個任務切換,解析出來了。