uC OSII的任務 學習筆記

2021-05-24 08:07:33 字數 3455 閱讀 1183

uc/osii

的任務

從任務儲存結構來看,由三部分構成:任務程式**、任務堆疊和任務控制塊。任務控制塊用來儲存任務屬性,任務堆疊用來儲存任務工作環境,任務程式**是任務的執行部分。

void main()

前乙個任務控制塊的指標

後乙個任務控制塊的指標

指向任務的指標

指向任務堆疊的指標

任務的優先級別

……

任務程式**的結構如下:

void mytask(void *pdata)

} 任務堆疊的建立

typedef   unsigned   int   os_stk;

#define  task_stk_size  512                     //

定義堆疊長度

(1024

位元組)

os_stk taskstk[task_stk_size];          //

定義乙個陣列來作為任務堆疊

uc/os-ii在建立任務函式ostaskcreat()中通過呼叫任務堆疊初始化函式ostaskstkinit()來完成任務堆疊初始化工作的,其原型如下:

os_stk *ostaskstkinit(

void (*task)(void *pd),

void *pdata,

os_stk *ptos,

init16u  opt

);由於各處理器的暫存器及對堆疊的操作方式不同,因此該函式需要使用者在進行uc/os-ii的移植時,按所使用的處理器由使用者來編寫。 

建立任務函式

ostaskcreate()

原型如下:

int8u  ostaskcreate(

void (*task)(void *pd), //

指向任務的指標

void *pdata, //傳遞給任務的引數

os_stk *ptos, //任務堆疊棧頂的指標

int8u  prio ); //指定任務優先順序別的引數

任務控制塊(tcb)及任務控制塊鍊錶

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

typedef struct os_tcb

os_tcb

;

系統在呼叫函式osinit()對系統進行初始化時,先在ram中建立乙個os_tcb結構型別的陣列ostcbtbl[ ],每個陣列元素就是乙個任務控制塊,然後把這些控制塊鏈結成乙個鍊錶。

每當應用程式呼叫系統函式ostaskcreate()建立乙個任務時,系統就會將任務控制塊煉表頭指標ostcbfreelist指向的任務控制塊分配給該任務。在給任務控制塊中的各成員賦值後,就按任務控制塊鍊錶的頭指標ostcblist將其加入到任務控制塊鍊錶中。 

當使用者程式呼叫函式ostaskcreate()建立乙個任務時,這個函式會呼叫系統函式ostcbinit()來為任務控制塊進行初始化。這個函式首先為被建立任務從空任務控制塊鍊錶獲取乙個任務控制塊,然後利用任務的屬性對任務控制塊各個成員進行賦值,最後再把這個任務控制塊鏈入到任務控制塊鍊錶的頭部。

設計乙個只有乙個任務task1,當程式執行後任務的工作就是每秒在顯示器上顯示乙個字元「m」。**如下:

#include "includes.h"

#define  task_stk_size                 512 

os_stk        mytaskstk[task_stk_size];      

int16s             key;

int8u         x=0,y=0; 

void  mytask(void *data);     

void  main (void)

void  mytask(void *pdata)

pc_dispchar(x,y,*(char*)pdata,disp_bgnd_black+disp_fgnd_white);

x+=1;

if(pc_getkey(&key) == 1)

} ostimedlyhmsm(0,0,1,0); }

} 任務的掛起,原型如下:

int8u ostasksuspend ( int8u prio );

恢復任務函式

ostaskresume()的原型如下:

int8u ostaskresume ( int8u prio );

改變任務優先順序

int8u ostaskchangeprio(

int8u  oldprio,        // 任務現在的優先順序

int8u  newprio        //  要修改的優先順序

);

任務刪除

#if os_task_del_en

int8u ostaskdel (

int8u prio // 要刪除任務的優先順序 );

•如果任務刪除自己,則應在呼叫函式時令函式的引數prio為os_prio_self。 

請求刪除任務函式

ostaskdelreq()的原型如下:

int8u ostaskdelreq (

int8u prio // 要刪除任務的優先順序

);

如果任務請求刪除自己,則應在呼叫函式時令函式的引數prio為os_prio_self。

函式 osstart()的源**如下:

void osstart (void)

} 小結:

1. 任務由任務控制塊、任務堆疊和任務**三部分組成。系統通過任務控制塊來感知和控制任務;任務堆疊主要用來保護斷點和恢復斷點;任務**是乙個超迴圈結構,它描述了任務的執行過程。在建立乙個任務時,函式ostaskcreate()或ostaskcreateext()負責給任務分配任務控制塊和任務堆疊,並對它們進行初始化,然後把任務控制塊任務堆疊、任務**三者關聯起來形成乙個完整任務。

2. 系統是按任務就緒表和任務的優先級別來排程任務的。執行任務排程工作的是排程器,它負責查詢具有最高優先順序別的就緒任務並執行它,同時把這個任務tcb的指標存放在

ostcbcur中。通常,系統在呼叫api函式和執行中斷服務程式之後都要呼叫函式ossched()來進行一次任務排程。

3. 任務切換的核心工作是任務堆疊指標的切換。

4. 任務排程器**的設計,使得它的執行時間與系統中的任務數無關,從而使它滿足了實時系統的要求。

5. 任務的優先級別也是任務的標識。

6. 應用程式首先應該呼叫函式osinit()對全域性變數和資料結構進行初始化已建立uc/os-ii的執行環境。

7. 應用程式是通過呼叫函式osstart()開始進入多工管理的,但在呼叫函式osstart()之前,必須至少建立了乙個任務。

ucos II 任務就緒表學習筆記

就緒表中有兩個變數 osrdygrp和 osrdytbl.這兩個變數的對應關係是 osrdytbl n 中任何一位是1時,osrdygrp 的第n 位 是1。相當於osrdygrp 是osrdytbl的索引。具體的對應關係如下圖 陣列osrdytbl 8 按位來算的話正好是64個位 64個優先順序。...

ucosII學習筆記

以前很少接觸過嵌入式作業系統,這次因為要嘗試研究ucosii這個嵌入式作業系統,看看自己能不能盡快的會使用它,查詢了不少資料。ucosii學習筆記。以下是nathan.yu的 ucosii學習筆記 整理的不錯,自己先借鑑。ucosii學習筆記 by nathan.yu ucos ii特性 l 可剝奪...

UCOS II學習筆記

1.標頭檔案的配置 include stm32f10x.h include stm32f10x conf.h include ucos ii.h 2.任務堆疊配置 os stk led0 task stk 64 os stk led1 task stk 64 定義兩個任務的堆疊陣列 3.對硬體的配置...