臨界段 critical sections :
1、為了實現資源共享,乙個作業系統必須提供臨界段操作的功能
2、uc/os-iii 為了處理林階段**需要關中斷,處理完畢後需要開中斷-——避免其他任務或中斷服務進入臨界段**
3、uc/os-iii 定義兩個巨集(macros)開關中斷————os_enter_critical()
os_exit_critical()——————>>>os_cpu.h
任務(task):通常是乙個無限迴圈
void mytask(void *pdara)保留了優先順序為:0,1,2,3,4}
os_lowest_pri0-3、os_lowest_pri0-2、os_lowest_pri0-1、os_lowest_pri0
優先順序號越低,任務的優先順序越高
uc/os中的中斷處理
1、中斷服務子程式要用組合語言編寫
2、使用者中斷子程式框架:
a、儲存全部cpu暫存器
b、呼叫osintenter 或 osintnesting直接加1
c、執行使用者**做中斷服務
d、呼叫osintexit();
e、恢復所有cpu暫存器
f、執行中斷返回指令
//中斷與時鐘節拍1、當發生中斷時,首先應保護現場,將cpu暫存器入棧,在處理中斷函式,然後恢復現場,將cpu暫存器出棧,最後執行中斷返回。osintenter
void osintenter (void
)
2、uc/os提供了osintenter() 和 osintexit()----------->>>告訴核心進入了中斷狀態
3、時鐘節拍是一種特殊的中斷,作業系統的心臟。對任務列表進行掃瞄,判斷是否有延時任務應該處於準備就緒狀態,最後進行上下文切換。
時鐘節拍
1、uc/os需要使用者提供週期訊號源,用於實現時間延時和確認超時。節拍率在10-100hz。
節拍率越高,系統的額外負荷就越重
2、時鐘節拍的實際頻率取決於使用者應用程式的精度。時鐘節拍源可以是硬體定時器,也可以是50/60hz交流電源訊號
3、使用者必須在多工系統啟動以後再啟動時鐘節拍器,在呼叫osstart()之後。
//uc/os初始化1、首先呼叫osinit();ostickisr
void ostickisr(void
)
2、空閒任務idle task,總是處於就緒狀態, 優先順序總是設成最低——> os_lowest_pri0
3、初始化了4個空資料結構緩衝區。
uc/os-ii的啟動
多工啟動是使用者通過呼叫osstart()實現的。
osinit();/*初始化 uc/os-iii
*/......
呼叫 ostaskcreate() 或 ostaskcreateext();
......
osstart();
/*開始任務排程!永不返回
*/
//任務控制塊 (tcb)1、任務控制塊 os_tcb 是一資料結構,儲存該任務的相關引數——任務堆疊指標,狀態,優先順序,任務表位置,任務鍊錶指標等。osstart
if ( osruning ==false )
2、一旦任務建立,os_tcbs 將被賦值。
3、os_tcb 分兩條鍊錶,空閒鍊錶和使用鍊錶
//任務就緒表 (ready list)1、每個任務的就緒標誌都放入就緒表中,就緒表中有兩個變數osrdygrp 和 osrdytb1。任務控制塊結構的主要成員
os_stk *ostcbstrptr; //
當前任務棧頂指標
struct os_tcb *ostcbnext; //
任務塊控制的雙重鍊錶指標
struct os_tcb *ostcbprev; //
任務塊控制的雙重鍊錶指標
os_event *ostcbeventptr; //
事件控制塊的指標
void *ostcbmsg; //
訊息指標
int16u ostcbdly; //
任務延時
int8u ostcbstat; //
任務狀態字
int8u ostcbprio; //
任務優先順序
int8u ostcbx; //
用於加速進入就緒狀態的過程
int8u ostcby; //
用於加速進入就緒狀態的過程
int8u ostcbbitx; //
用於加速進入就緒狀態的過程
int8u ostcbbity; //
用於加速進入就緒狀態的過程
2、osrdygrp 中任務按優先順序分組,8個任務為一組。osrdygrp 每一位表示每一組中是否有進入就緒狀態
就緒表中 osrdytb1 相應元素的相應位也置位。
任務建立
1、讓 uc/os-ii 管理使用者的任務,,使用者必須要先建立任務
ostaskcreate( ) 、ostaskcreateext( )
3、任務不能由中斷服務程式(isr)來建立。
任務排程
1、uc/os-iii是搶占式實時多工核心,優先順序最高的任務一旦準備就緒,則擁有cpu的所有權開始投入執行。
2、任務排程的工作就是:查詢準備就緒的最高優先順序的任務並進行上下文切換。
3、uc/os-iii 任務排程所花費的時間為常數,與應用程式中建立的任務數無關
4、uc/os-iii 總是執行進入就緒狀態任務中優先順序最高的哪乙個,確定那個任務優先順序最高,
下面該那個任務執行了的工作是由排程器(scheduler)完成的。
5、任務級的排程是由函式ossched( )完成的。中斷級的排程是由另乙個函式osintext( )完成的
根據就緒表確定最高優先順序
1、osrdygrp 值確定高3位,假設osrdygrp = 0x08,對應osrdytb1[3],高優先順序為2;
2、osrdytb1[3]值確定低3位,假設osrdytb1[3]=0x3a,最高優先順序的任務為25
是任務脫離就緒態
STM32實時作業系統
1 裸機和作業系統的區別 裸機是在乙個main函式裡執行的,除了有中斷才會跳到其他地方,否則就會一直按照位址不斷加4來執行 為什麼是加4呢 順序的執行結構就是你可以通過 找到相應的執行流程。作業系統 main函式當通過函式堆疊切換的跳轉到第乙個任務之後,第乙個任務好像還是預設的,通過優先順序的判斷優...
stm32移植ucosII成功
osstarthang b osstarthang should never get here 現在做開發真的離不開internet啊 不然我也不可能2.5小時內搞定ucosii的移植。我的硬體版本是 stm32f103c8t6,ucos版本是ucosiiv2.86 另外給大家推薦一本學習ucosi...
ucos ii作業系統
ucos ii是乙個多工的作業系統,其最大優點即為實時性。任務通常是乙個無限的迴圈,其中包括了使用者 而實時性即指最快的響應優先順序最高的任務。確實,對於乙個初步接觸ucos ii的新手來講,想要完全理解是要花時間的。我們想用ucos ii,在移植成功後 以後在寫移植方面吧 我們首先就得進行初始化,...