?? os_cpu_a.s
字號:
;*******************************************************************************************
;OS_CPU_A.s
PRESERVE8
AREA OS_CPU_A, CODE, READONLY
CODE32
; 定義于ucos_ii.h中的外部變量
;OS_EXT OS_TCB *OSTCBCur; /* Pointer to currently running TCB */
;OS_EXT OS_TCB *OSTCBHighRdy; /* Pointer to highest priority TCB R-to-R */
;OS_EXT INT8U OSPrioCur; /* Priority of current task */
;OS_EXT INT8U OSPrioHighRdy; /* Priority of highest priority task */
;OS_EXT BOOLEAN OSRunning; /* Flag indicating that kernel is running */
IMPORT OSTCBCur
IMPORT OSTCBHighRdy
IMPORT OSPrioCur
IMPORT OSPrioHighRdy
IMPORT OSRunning
;*******************************************************************************************
EXPORT OSStartHighRdy
;功能:
;1)SP=OSTCBHighRdy->OSTCBStkPtr
;2)OSTCBCur->OSTCBHighRdy
;3)將當(dāng)前優(yōu)先級最高的任務(wù)切換到運行態(tài),本任務(wù)只在系統(tǒng)開始運行前運行一次!該函數(shù)不會返回到
; 調(diào)用者OSStart().
OSStartHighRdy
LDR r4,=OSRunning ;起始狀態(tài)時OSRunning顯然為0
MOV r5,#1
STRB r5,[r4] ;直接置1,標(biāo)志系統(tǒng)進入運行狀態(tài)
IMPORT OSTaskSwHook
BL OSTaskSwHook
LDR r4, =OSTCBCur ; 當(dāng)前任務(wù)TCB地址
LDR r5, =OSTCBHighRdy ; 最高優(yōu)先級任務(wù)的TCB地址
LDR r5, [r5] ; TCB的第一個元素就是OSTCBStkPtr,即任務(wù)的棧指針
LDR sp, [r5] ; 更新當(dāng)前任務(wù)的棧指針為預(yù)先設(shè)置的值
; SP=OSTCBHighRdy->OSTCBStkPtr
STR r5, [r4] ; 將優(yōu)先級最高的任務(wù)設(shè)置為當(dāng)前任務(wù)
; OSTCBCur=OSTCBHighRdy
LDMFD sp!, {r4} ; 從任務(wù)堆棧中恢復(fù)上下文(context)
;MSR SPSR_cxsf, r4 ; usr,sys模式無SPSR
LDMFD sp!, {r4} ;
MSR CPSR_cxsf, r4 ; CPSR --- SYS Mode
LDMFD sp!, {r0-r12, lr, pc }
; 任務(wù)運行
;*******************************************************************************************
EXPORT OS_TASK_SW
;功能
;1)保存當(dāng)前任務(wù)上下文
;2)更新系統(tǒng)變量OSPrioCur = OSPrioHighRdy
;3)OSTCBCur->OSTCBStkPtr=SP 保存SP到當(dāng)前任務(wù)控制塊
;4)獲得即將進入運行狀態(tài)的高優(yōu)先級任務(wù)的棧指針SP=OSTCBHighRdy->OSTCBStkPtr
;5)更新系統(tǒng)變量OSTCBCur->OSTCBHighRdy
;6)切換任務(wù)上下文
OS_TASK_SW
STMFD sp!, {lr} ; 保存 pc
STMFD sp!, {lr} ; 保存 lr
;OS_TASK_SW這個函數(shù),在系統(tǒng)調(diào)用它時是在當(dāng)前任務(wù)最后失去CPU時,當(dāng)前任務(wù)再次
;獲得CPU時,其恰好在OS_TASK_SW調(diào)用完畢后的那個位置,因此,lr被放入pc
;在棧中的位置,即任務(wù)繼續(xù)開始執(zhí)行的位置;此外,lr放在棧中的位置也是無關(guān)
;緊要的,因為,這個子函數(shù)返回時的lr是無意義的
STMFD sp!, {r0-r12} ; 保存任務(wù)上下文
MRS r4, CPSR
STMFD sp!, {r4} ; save current PSR
;MRS r4, SPSR ; 任務(wù)運行于SYS模式,無SPSR,棧中的CPSR與SPSR相同
STMFD sp!, {r4} ; 構(gòu)成一致的堆棧結(jié)構(gòu)
IMPORT OSTaskSwHook
BL OSTaskSwHook
LDR r4, =OSPrioCur ; 開始切換任務(wù)
LDR r5, =OSPrioHighRdy
LDRB r6, [r5] ; 更新系統(tǒng)變量
STRB r6, [r4] ; OSPrioCur = OSPrioHighRdy
LDR r4, =OSTCBCur ; 獲取當(dāng)前任務(wù)的棧指針
LDR r5, [r4]
STR sp, [r5] ; 保存當(dāng)前任務(wù)的棧指針
; OSTCBCur->OSTCBStkPtr=SP 保存SP到當(dāng)前任務(wù)控制塊
; 當(dāng)前運行任務(wù)的上下文保存完畢
LDR r6, =OSTCBHighRdy ; 高優(yōu)先級任務(wù)的TCB地址
LDR r6, [r6]
LDR sp, [r6] ; 取得高優(yōu)先級任務(wù)的棧指針
; SP=OSTCBHighRdy->OSTCBStkPtr 更新SP為即將運行的任務(wù)的棧指針
STR r6, [r4] ; 更新系統(tǒng)變量
; OSTCBCur = OSTCBHighRdy
LDMFD sp!, {r4}
;MSR SPSR_cxsf, r4 ; 運行在sys模式下,無需SPSR的更新
LDMFD sp!, {r4}
MSR CPSR_cxsf, r4
LDMFD sp!, {r0-r12, lr, pc}
; 高優(yōu)先級任務(wù)的上下文恢復(fù)完成,切換到高優(yōu)先級任務(wù)運行
;*******************************************************************************************
EXPORT OSIntCtxSw
OSIntCtxSw
;新的代碼,實現(xiàn)了中斷的嵌套(其實現(xiàn)依賴于底層向量的處理代碼)
;該函數(shù)運行依賴于調(diào)用IrqHandler之前的模式轉(zhuǎn)換和棧構(gòu)造
;運行于SYS模式,其首先調(diào)整SP_sys指針到下圖中SPSR處
;后半部分與OSCtxSw相同
;該函數(shù)是不返回的,進入時堆棧結(jié)構(gòu)是已知的,除了原來構(gòu)造的
;標(biāo)準(zhǔn)棧,還壓入了一些多余的內(nèi)容(可以參看編譯后的匯編代碼)
;而且這些"多余的內(nèi)容"和編譯器、編譯器的設(shè)置都有關(guān)
;irq的棧結(jié)構(gòu),進入IrqHandler前,sp指向的恰好是構(gòu)造的標(biāo)準(zhǔn)棧頂,但是,
;由于函數(shù)中又調(diào)用了別的函數(shù)于是進入OSIntCtxSw后還得調(diào)整SP
;**********************************************************************
;低 r4 r14 spsr cpsr r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 lr PC 高
;**********************************************************************
ADD sp,sp,#16 ;調(diào)整SP_sys指向標(biāo)準(zhǔn)棧結(jié)構(gòu)
;在匯編中找到壓入堆棧的多余數(shù)據(jù),通過調(diào)整SP來去掉
;這是很關(guān)鍵的步驟,具體請參考uC/OS-II的手冊
;后面的內(nèi)容和OSCtxSw的后半部分相同,依次為
;1)OSPrioCur = OSPrioHighRdy
;2)OSTCBCur->OSTCBStkPtr=SP 保存SP到當(dāng)前任務(wù)控制塊
;3)SP=OSTCBHighRdy->OSTCBStkPtr
;4)OSTCBCur=OSTCBHighRdy
;5)切換上下文
;6)高優(yōu)先級任務(wù)運行
IMPORT OSTaskSwHook
BL OSTaskSwHook
LDR r4, =OSPrioCur
LDR r5, =OSPrioHighRdy
LDRB r6, [r5]
STRB r6, [r4] ; OSPrioCur = OSPrioHighRdy
LDR r4, =OSTCBCur ; 獲得當(dāng)前任務(wù)的TCB地址
LDR r5, [r4]
STR sp, [r5] ;
; OSTCBCur->OSTCBStkPtr=SP 保存SP到當(dāng)前任務(wù)控制塊
LDR r6, =OSTCBHighRdy ; 獲得高優(yōu)先級任務(wù)的TCB地址
LDR r6, [r6]
LDR sp, [r6] ; 獲得高優(yōu)先級任務(wù)的棧指針
; SP=OSTCBHighRdy->OSTCBStkPtr 更新SP為即將運行的任務(wù)
STR r6, [r4] ; 更新系統(tǒng)變量OCTCBCur
; OSTCBCur = OSTCBHighRdy
LDMFD sp!, {r4}
;MSR SPSR_cxsf, r4 ; 運行在sys模式下,無需SPSR的更新
LDMFD sp!, {r4}
MSR CPSR_cxsf, r4
LDMFD sp!, {r0-r12, lr, pc}
; 上下文切換完成,切換到高優(yōu)先級任務(wù)運行
;*******************************************************************************************
; 定義于ucos_ii.h中的外部變量
;OS_EXT INT8U OSIntNesting; /* Interrupt nesting level */
IMPORT OSIntNesting
;*******************************************************************************************
END
;*******************************************************************************************亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲综合性久久久影院|
一区二区三区国产精华|
午夜精品视频在线观看|
7777精品伊人久久久大香线蕉最新版|
亚洲综合色噜噜狠狠|
欧美日韩一级二级三级|
亚洲成人动漫在线免费观看|
国产女同互慰高潮91漫画|
在线观看成人免费视频|
美国一区二区三区在线播放|
国产精品青草综合久久久久99|
91福利区一区二区三区|
精品一区二区影视|
亚洲欧美日韩系列|
久久精品日产第一区二区三区高清版
|
美女视频黄 久久|
成人一级视频在线观看|
亚洲精品久久7777|
亚洲欧洲制服丝袜|
精品系列免费在线观看|
91网站视频在线观看|
国产夫妻精品视频|
韩国精品久久久|
久久国产精品72免费观看|
蜜臀久久99精品久久久久久9|
av激情成人网|
成人午夜在线播放|
日韩精品一区二区三区四区视频|
91高清视频在线|
日韩理论片中文av|
亚洲精品成人悠悠色影视|
国产一区二区三区日韩
|
日韩精品在线一区|
天堂在线一区二区|
国产一区二区在线看|
久久综合色婷婷|
欧美激情综合五月色丁香小说|
中文成人av在线|
国产成人av电影免费在线观看|
99久久久免费精品国产一区二区|
日本韩国欧美三级|
夜夜精品视频一区二区|
在线视频欧美区|
亚洲一区二区黄色|
欧美人狂配大交3d怪物一区|
欧美一区二区三区白人|
中文字幕五月欧美|
欧美96一区二区免费视频|
eeuss影院一区二区三区
|
99re在线精品|
一区二区久久久久|
日韩一级二级三级精品视频|
国产精品美女久久久久久久久|
日本高清不卡一区|
美腿丝袜亚洲综合|
日韩美女精品在线|
日韩一区二区高清|
91在线观看成人|
日韩和欧美一区二区三区|
中文字幕精品一区二区精品绿巨人
|
日韩精品在线看片z|
91啦中文在线观看|
国产美女在线精品|
一区二区三区.www|
国产日韩av一区|
精品少妇一区二区三区日产乱码|
亚洲成人av免费|
|精品福利一区二区三区|
日韩欧美专区在线|
777久久久精品|
欧美日精品一区视频|
成人免费不卡视频|
国产精品原创巨作av|
精品国产99国产精品|
国产成人av影院|
国产伦精品一区二区三区免费|
一二三区精品福利视频|
亚洲男人的天堂网|
国产精品成人在线观看|
欧美做爰猛烈大尺度电影无法无天|
国产麻豆精品theporn|
青青国产91久久久久久
|
欧美一区二区三区系列电影|
欧美亚洲国产一卡|
青娱乐精品在线视频|
极品销魂美女一区二区三区|
精品一区二区日韩|
国产精品99久久久久久久女警|
国模大尺度一区二区三区|
精品一区二区三区欧美|
国产成人av影院|
色综合一个色综合亚洲|
青青青伊人色综合久久|
国产乱色国产精品免费视频|
成人app网站|
国内精品写真在线观看|
粗大黑人巨茎大战欧美成人|
91免费视频大全|
在线91免费看|
中国色在线观看另类|
一区二区三区 在线观看视频|
日韩经典一区二区|
菠萝蜜视频在线观看一区|
欧美色大人视频|
国产亚洲一区字幕|
亚洲成人在线网站|
国产在线精品一区二区不卡了
|
亚洲午夜久久久|
17c精品麻豆一区二区免费|
五月天亚洲婷婷|
97精品久久久久中文字幕|
91精品中文字幕一区二区三区|
国产精品久久久久久亚洲毛片
|
精久久久久久久久久久|
日本道免费精品一区二区三区|
精品久久久久久久人人人人传媒|
亚洲天堂免费在线观看视频|
国内成+人亚洲+欧美+综合在线|
91国偷自产一区二区使用方法|
欧美精品一区二区三区高清aⅴ
|
日韩欧美色综合网站|
亚洲最大成人综合|
色乱码一区二区三区88|
中文字幕第一区第二区|
国产成人在线免费|
久久网站热最新地址|
久久www免费人成看片高清|
欧美放荡的少妇|
国产欧美日韩综合精品一区二区
|
欧美日韩午夜在线|
亚洲电影中文字幕在线观看|
欧美视频一区二区三区在线观看|
亚洲老司机在线|
欧美一区二区三区视频在线观看
|
国产亚洲精品7777|
国产精品一区二区果冻传媒|
欧美韩日一区二区三区|
91碰在线视频|
日韩成人免费在线|
jlzzjlzz亚洲女人18|
亚洲愉拍自拍另类高清精品|
欧美日韩一级大片网址|
日韩成人精品在线|
国产日韩欧美一区二区三区乱码|
丰满白嫩尤物一区二区|
艳妇臀荡乳欲伦亚洲一区|
日韩视频123|
日本乱人伦aⅴ精品|
另类调教123区|
亚洲综合一区二区三区|
日韩亚洲电影在线|
色综合视频一区二区三区高清|
久久久蜜桃精品|
毛片一区二区三区|
亚洲另类一区二区|
中文在线一区二区|
欧美日本国产视频|
日本韩国一区二区三区视频|
国产精品夜夜嗨|
蜜乳av一区二区|
天堂一区二区在线免费观看|
国产精品激情偷乱一区二区∴|
欧美成人一区二区三区|
欧美美女一区二区三区|
色婷婷综合久久久久中文一区二区
|
国产性色一区二区|
久久―日本道色综合久久|
欧美一区午夜精品|
91精品国产免费|
在线成人午夜影院|
欧美xxxxx牲另类人与|
欧美精品自拍偷拍|
欧美蜜桃一区二区三区|
欧美午夜精品久久久久久孕妇|
一本到不卡精品视频在线观看|
a美女胸又www黄视频久久|
国产精品1024久久|
色综合网站在线|
欧美日韩成人在线|
欧美一级欧美三级在线观看|
4438x成人网最大色成网站|
日韩一区二区精品|
国产欧美精品国产国产专区|
国产精品美女久久久久aⅴ国产馆|
国产精品网站在线观看|
亚洲欧美怡红院|
午夜av区久久|
国产精品18久久久久久久久久久久|
国产又黄又大久久|
91视视频在线观看入口直接观看www
|
欧美日韩一级黄|
日韩欧美电影一区|
中文字幕一区二区三区av|
亚洲福利视频一区二区|
国产激情一区二区三区|
91高清视频免费看|
国产色91在线|
天堂一区二区在线|
日本韩国视频一区二区|
精品久久国产字幕高潮|