臨界段 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 片上Flash 操作
之前iap時候記錄過一些,今天對特定地方寫又加深了印象,寫與擦除都需要先unclock 1 讀取指定地址的半字 16位資料 2 faddr...