uc os中OSStart 函式分析

2021-05-24 08:30:05 字數 2410 閱讀 8149

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,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果...