osstart()
函式分析
多工的的啟動是通過呼叫osstart()實現的,而在啟動uc/os之前至少需要建立乙個應用任務。
osstart
()函式原始碼
voidosstart (void)
} øosstarthighrdy()
永遠不返回到osstart()
ø當osstart執行完後osrunning為真,多工已經啟動
osstarthighrdy()
分析void osstarthighrdy(void)
_osstarthighrdy()
分析softwareinterrupt
ldrsp, stacksvc//
重新設定堆疊指標,此時處理器處於管理模式。此處設定是因為在後面新任務堆疊內容進入cpu暫存器的過程用,用新任務的堆疊指標覆蓋了管理模式的指標
stmfdsp!, //
儲存環境,lr內存放的軟中斷返回位址。
movr1, sp// r1
指向引數儲存位置
mrsr3, spsr//
獲得進入軟中斷前的cpsr,
tstr3, #t_bit
//中斷前是否是thumb狀態
ldrnehr0, [lr,#-2]//
是: 取得thumb狀態swi號
bicner0, r0, #0xff00
ldreqr0, [lr,#-4]//
否: 取得arm狀態swi號
biceqr0, r0, #0xff000000
//r0 = swi
號,r1指向引數儲存位置
cmpr0, #1
ldrlopc, =osintctxsw
ldreqpc, =__osstarthighrdy//swi 0x01
為第一次任務切換
blswi_exception
ldmfdsp!, ^//
恢復暫存器
stacksvcdcd(svcstackspace + svc_stack_legth * 4 - 4)
__osstarthighrdy
分析msrcpsr_c, #(noint | sys32mode)//
進入系統模式
//告訴uc/os-ii自身已經執行osrunning==1;
ldrr4, =osrunning
movr5, #1
strbr5, [r4]
blostaskswhook//
呼叫鉤子函式
ldrr6, =ostcbhighrdy//
獲得存放最高優先順序tcb位址的位址
ldrr6, [r6]//
獲得當前最高優先順序tcb位址
bosintctxsw_1//
任務堆疊內容進入cpu,啟動最高優先順序任務
areaswistacks, data, noinit,align=2
svcstackspace
spacesvc_stack_legth * 4//
管理模式堆疊空間
osintctxsw_1分析
osintctxsw_1
ldrr4, [r6] //
獲取新任務堆疊指標,此時指標指向棧底(壓入了資料),此時處理器模式依然是管理模式
addsp, r4, #17*4 //17
暫存器cpsr,osentersum,r0-r12,lr,sp移動任務堆疊的指標,使的sp指向任務堆疊的棧頂(次數資料並未彈出)
ldrlr, [sp, #-8]//
獲得lr_usr,
msrcpsr_c, #(noint | svc32mode)//
進入管理模式
movsp, r4//
設定堆疊指標,此處修改了管理模式的指標使得其指向新任務的堆疊棧底,此處修改了管理模式的堆疊指標,故在每一次進入軟中斷都要從新設定管理模式堆疊指標。
ldmfdsp!, ;cpsr,osentersum ;
恢復新任務的osentersum
ldrr3, =osentersum
strr4, [r3]
msrspsr_cxsf, r5
;恢復cpsr
ldmfdsp!, ^;//
此處lr其實是lr_svc是沒有什麼實際作用的,只不過為了方便指標的自動移動而出棧pc,lr_usr在前面已經恢復。 ø
函式分析是基於lpc2200的 ø
任務棧內資料存放資料
任務堆疊
任務入棧的其他資料
pclr
r12r11
r10……
……r3
r2r1
r0cpsr
osentersum
空閒空間
ucos 任務延時函式
在ucos裡,系統也提供了這樣的延時函式,乙個是大眾版本ostimedly 乙個是精緻版本的ostimedlyhmsm 隨你怎麼選擇 這兩者的區別就是,ostimedly的延時時間是以節拍數來衡量的額,ostimedlyhmsm的延遲時間則使以具體時間大小來很亮的。這兩個函式有著非常重要的作用,就是...
linux中select 函式分析
select 的機制中提供一fd set的資料結構,實際上是一long型別的陣列,每乙個陣列元素都能與一開啟的檔案控制代碼 不管是socket控制代碼,還是其他 檔案或命名管道或裝置控制代碼 建立聯絡,建立聯絡的工作由程式設計師完成,當呼叫select 時,由核心根據io狀態修改fd set的內容,...
Linux中select函式分析
select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他們只是習慣寫諸如connect accept recv或recvfrom這樣的阻塞程式 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果...