找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3995|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

UCOS的初始化后加載任務(wù)過程匯編代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:82781 發(fā)表于 2015-6-13 16:44 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
昨晚看到了任務(wù)切換時的匯編文件,才終于知道人為怎么才可以制造一次模擬中斷,任務(wù)切換時就是模擬發(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)定時器
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ù),就是初始化的時后定義的堆棧的大小,
然后又取出系統(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í)!他壓棧的時候是把一組從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é)中。。。。。。。







分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表