stm32作業系統ucosiii筆記02

2022-06-23 23:27:09 字數 3820 閱讀 9613

臨界段 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、執行中斷返回指令

//

osintenter

void osintenter (void

)

中斷與時鐘節拍1、當發生中斷時,首先應保護現場,將cpu暫存器入棧,在處理中斷函式,然後恢復現場,將cpu暫存器出棧,最後執行中斷返回。

2、uc/os提供了osintenter() 和 osintexit()----------->>>告訴核心進入了中斷狀態

3、時鐘節拍是一種特殊的中斷,作業系統的心臟。對任務列表進行掃描,判斷是否有延時任務應該處於準備就緒狀態,最後進行上下文切換。

時鐘節拍

1、uc/os需要使用者提供週期訊號源,用於實現時間延時和確認超時。節拍率在10-100hz。

節拍率越高,系統的額外負荷就越重

2、時鐘節拍的實際頻率取決於使用者應用程式的精度。時鐘節拍源可以是硬體定時器,也可以是50/60hz交流電源訊號

3、使用者必須在多工系統啟動以後再啟動時鐘節拍器,在呼叫osstart()之後。

//

ostickisr

void ostickisr(void

)

uc/os初始化1、首先呼叫osinit();

2、空閒任務idle task,總是處於就緒狀態,  優先順序總是設成最低——> os_lowest_pri0

3、初始化了4個空資料結構緩衝區。

uc/os-ii的啟動

多工啟動是使用者通過呼叫osstart()實現的。

osinit();/*

初始化 uc/os-iii

*/......

呼叫 ostaskcreate() 或 ostaskcreateext();

......

osstart();

/*開始任務排程!永不返回

*/

//

osstart

if ( osruning ==false )

任務控制塊 (tcb)1、任務控制塊 os_tcb 是一資料結構,儲存該任務的相關引數——任務堆疊指標,狀態,優先順序,任務表位置,任務連結串列指標等。

2、一旦任務建立,os_tcbs 將被賦值。

3、os_tcb 分兩條連結串列,空閒連結串列和使用連結串列

//

任務控制塊結構的主要成員

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; //

用於加速進入就緒狀態的過程

任務就緒表 (ready list)1、每個任務的就緒標誌都放入就緒表中,就緒表中有兩個變數osrdygrp 和 osrdytb1。

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...