stm32作業系統ucosiii筆記02

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

臨界段 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實時作業系統

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,在移植成功後 以後在寫移植方面吧 我們首先就得進行初始化,...