我們繼續(xù)上篇。上篇我漏了個(gè)開總中斷忘說了。

開中斷。 對(duì)了調(diào)試的時(shí)候吧任務(wù)A的睡眠給隱掉。因?yàn)橐徊揭徊絹韺W(xué)習(xí)嘛! 當(dāng)開了中斷,于是開始執(zhí)行定時(shí)器0中斷,定時(shí)器中的代碼一個(gè)是OSTimeTick(); 執(zhí)行任務(wù)時(shí)間片的分配。這里注意了,我自個(gè)寫的時(shí)候調(diào)試出現(xiàn)問題才發(fā)現(xiàn)的。他是先判斷是否有時(shí)間片,有則--,然后再判斷是否為0為0則 OSIntSendSignal(TaskId)。 OSIntSendSignal就是把任務(wù)置為就緒的沒什么,有必要提的就是關(guān)中斷和開中斷。這個(gè)為了避免產(chǎn)生中斷導(dǎo)致不可預(yù)知的錯(cuò)誤。 然后回到定時(shí)器0的中斷服務(wù)程序中,執(zhí)行OSIntExit()。然后轉(zhuǎn)到==》OSIntCtxSw ==》 C_OSCtxSw ==》LoadCtx 然后就切換到任務(wù)B 。現(xiàn)在我開始慢慢的分析這幾個(gè)函數(shù),因?yàn)檫@里是需要慢慢講解的。首先從原理上講下。定時(shí)器中斷時(shí)依次把
中斷后 然后查看 內(nèi)存 按推斷應(yīng)該是sp-15 個(gè)字節(jié) =i:0x16 如圖
你可以看出 中斷服務(wù)程序保存環(huán)境是按什么次序入棧的。帥吧~~~
然后執(zhí)行OSIntExit()壓入 0x0256
15+2 =17個(gè)字節(jié)然后 再跳轉(zhuǎn)到 OSIntCtxSw
這里開始用51
匯編寫的,這里是經(jīng)常執(zhí)行的代碼必須有效率。 在OSIntCtxSw 判斷當(dāng)前任務(wù)是什么性質(zhì)的,現(xiàn)在這個(gè)是任務(wù)A隨意是sp=sp-4 并置中斷類型標(biāo)志位,清任務(wù)運(yùn)行標(biāo)志位,LMJP OSCtxSw 首先壓入一個(gè)中斷計(jì)數(shù),然后開始吧 【前任務(wù)+1的存放地址 ----下個(gè)任務(wù)+1的地址】 這里有個(gè)第優(yōu)先級(jí)上還存放了個(gè)任務(wù)就是為符合這個(gè)處理方式。吧括號(hào)中的數(shù)據(jù)整個(gè)搬到上圖sp后面,然后吧修改后的函數(shù)首地址重新分配 OSTsakStackBotton存放 然后把下個(gè)任務(wù)切換成當(dāng)前任務(wù),他的內(nèi)存空間就是現(xiàn)在SP ---任務(wù)+1之間的空間。 這里的堆棧是從低到高分配的和PC里不一樣。然后還做了個(gè)清中斷標(biāo)志的操作 壓入 LoadCtx 的函數(shù)地址的棧然后RETI 這個(gè)主要是清掉中斷標(biāo)志,然后跳轉(zhuǎn)到環(huán)境加載函數(shù) 。然后LoadCtx 就把堆棧中下個(gè)任務(wù)的地址直接RET返回給$P于是就切換到下個(gè)任務(wù)了。 優(yōu)先級(jí)低的也差不對(duì)這樣處理的。
為了模擬跳轉(zhuǎn)到任務(wù)B 在中斷前加 extern uint8 OSTaskRuning; 在 OSIntExit(); 前+OSTaskRuning &=~OSMapTbl[0]; 這樣就模擬跳轉(zhuǎn)到任務(wù)B
嘿嘿,不好意思 +了那么入棧的數(shù)據(jù)就有變化了。但是數(shù)目應(yīng)該沒變,我就不重新截圖了。
OSIntCtxSw 執(zhí)行后SP-4
放B的地址可以通過
看到i:0xF7是存儲(chǔ)的B的首地址,
數(shù)據(jù)塊應(yīng)該是 【A+1】- 【B+1】之間的數(shù)據(jù)整個(gè)搬到當(dāng)前sp+1后面 搬移后的內(nèi)存分布
后面 中斷計(jì)數(shù) 00 +搬過來的B-C間的2個(gè)字節(jié) C7 03這個(gè)正好是B任務(wù)的首地重新修改存放函數(shù)首地址的數(shù)組
這里可以跳轉(zhuǎn)到LoadCtx 吧任務(wù)切到任務(wù)B中。
至此通過中斷任務(wù)切換已經(jīng)完畢,此時(shí)可以向下如果任務(wù)中有數(shù)據(jù)在其中,那么這樣做會(huì)不會(huì)丟失數(shù)據(jù),其實(shí)仔細(xì)想想就可以了解,不會(huì)的。
本例源代碼下載:http://www.zg4o1577.cn/f/small_rtos1.12.1.zip
接下篇: