久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: UCOS的初始化后加載任務(wù)過程匯編代碼 [打印本頁]

作者: xuwei    時(shí)間: 2015-6-13 16:44
標(biāo)題: UCOS的初始化后加載任務(wù)過程匯編代碼
昨晚看到了任務(wù)切換時(shí)的匯編文件,才終于知道人為怎么才可以制造一次模擬中斷,任務(wù)切換時(shí)就是模擬發(fā)生了一次中斷,其實(shí)!他工作的原理是什么呢?
這就要看匯編文件:
MOV DPH,#HIGH (OSRunning)
MOV DPL,#LOW  (OSRunning)
MOV A,#1
MOVX @DPTR,A

SETB TR0
這一段是把系統(tǒng)狀態(tài)改成運(yùn)行
并且開啟系統(tǒng)定時(shí)器
MOV DPH,#HIGH(OSTCBHighRdy)
MOV DPL,#LOW (OSTCBHighRdy)
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
MOV DPH,R0
MOV DPL,A

;Move OSTCBStkPtr to dptr
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
MOV DPH,R0
MOV DPL,A

上面的一段是用DPTR指向任務(wù)的堆棧,這一點(diǎn)非常重要。這里不得不說他分兩次查找,第一次它裝載指向堆棧的指針,找到這指針變量的位置后他再一次的吧指針里面的地址取出來裝載到DPTR中,所以看到的是兩次對DPTR進(jìn)行賦值,R0作為暫存無實(shí)際意義
MOVX A,@DPTR
MOV ?C_IBP,A

JZ OSCPUASmltRstOver ;
INC DPTR
MOVX A,@DPTR  

MOV R0,#StkBottom - 1 ;
MOV R1,A   ;
ADD A,R0   ;sp
MOV SP,A

這一段非常重要他做了什么?
他首先取出用戶堆棧的第一個數(shù)據(jù),這個數(shù)據(jù)叫做IBP,
然后取出堆棧的第二個數(shù)據(jù),就是初始化的時(shí)后定義的堆棧的大小,
然后又取出系統(tǒng)設(shè)定好的堆棧開始地址,然后兩者求和,求出的和就是SP最后的大小,也就是說SP指針已經(jīng)指向了最高的地址(如果堆棧向上升成長)
OSCPUARstHardStk:
INC R0   
INC DPTR
MOVX A,@DPTR
MOV @R0,A
DJNZ R1,OSCPUARstHardStk

顯然這是一個循環(huán),他的做用就是吧剩下的用戶對戰(zhàn)里的數(shù)據(jù)全部加載到CPU硬件堆棧中,比如函數(shù)入口地址,ACCb,psw等保存在用戶堆棧的數(shù)據(jù)全部加載到系統(tǒng)棧中,接下來才是關(guān)鍵的也是最后的一哆嗦,
POP 07
POP 06
POP 05
POP 04
POP 03
POP 02
POP 01
POP 00
POP PSW
POP DPL
POP DPH
POP B
POP ACC ;A is register but ACC is direct ram

SETB EA ;after start, enable EA
RETI
這個是個出棧命令,POP,前面已經(jīng)說到SP已經(jīng)指向了最高的堆棧地值,那么這就表示把系統(tǒng)棧的所有的數(shù)據(jù)全部彈入對應(yīng)的寄存器寄存器中,也就是說他用MOV指令代替了PUSH,他用MOV把用戶棧數(shù)據(jù)復(fù)制到系統(tǒng)棧中,然后用戶POP把系統(tǒng)棧的數(shù)據(jù)又恢復(fù)到寄存器中,是不是有點(diǎn)多此一舉?直接把用戶數(shù)據(jù)恢復(fù)到CPU寄存器不是更快馬?開始我那么想,向下看,有個RETI,再看棧頂正好存入的是函數(shù)的入口地址,哈哈所以他就跳轉(zhuǎn)到了對應(yīng)的任務(wù)中去了,跟中斷幾乎是一模一樣的,都是保護(hù)現(xiàn)場,一個樣,


注意區(qū)分戶任務(wù)棧和系統(tǒng)棧,所謂系統(tǒng)棧就是那個用SP做棧指針,用RETI返回的棧,而用戶棧其實(shí)說白了就是個數(shù)組而已!需要用戶自己定義。
以上是出棧,入站的問題上比較糾結(jié),主要是不符合預(yù)想,有待學(xué)習(xí)!他壓棧的時(shí)候是把一組從f0-ff之間的數(shù)據(jù)寫進(jìn)去了后面又緊跟著系統(tǒng)棧的內(nèi)容,按理說入棧就把系統(tǒng)棧內(nèi)的寄存器保存就可以了吧,為什么還要入一塊不相關(guān)的內(nèi)存?而且任務(wù)加載總是從初始化開始,沒有進(jìn)行任務(wù)間的轉(zhuǎn)換,還看不到他處理的方法,不過思路都差不多,入站的格式一定得和出站的格式是一樣的存放順序(在用戶站立)否則他不可能找到正確的如口的!糾結(jié)中。。。。。。。












歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 成人一级毛片 | 久草黄色| 日韩福利 | 九九视频免费观看 | 久久伊人精品 | 午夜理伦三级理论 | 欧美色图一区二区三区 | 久久视频在线免费观看 | 日韩视频一区二区 | www亚洲| www黄色| 精品国产一区二区三区久久久蜜月 | 免费观看一区二区 | 久久天天操 | 在线观看日韩av | 国产精品免费在线 | 一级a毛片 | 成人免费av | 欧美性猛交xxxx黑人猛交 | 国产激情久久 | 一级黄色片在线观看 | 亚洲激情视频 | 国产亚洲精品成人av久久ww | 天天色网站 | 影音先锋中文字幕在线 | 天天视频国产 | 一区二区免费看 | 国产三级在线观看 | aaa级片| av免费看网站 | 久久午夜视频 | 韩国精品一区 | 老司机精品在线 | 亚洲狠狠干 | 国产成人在线免费观看 | 国精产品99永久一区一区 | 国产视频一区二区在线 | 97免费在线视频 | 欧美一级免费 | 激情网五月天 | 欧美成人综合 |