TesegOS微控制器實時作業系統

2021-10-10 09:59:42 字數 4770 閱讀 2603

tesegos面向8位機或32位低端mcu而設計,是一款簡單易用,資源利用率高,**簡潔、 易掌握的微型任務排程器。

tesegos採用搶占式任務排程策略、已準備好的高優先順序任務會通過中斷的方式優先得到執行, 相同優先順序的任務按準備好時的時間順序得到執行,同優先等級的任務不會互相搶占。

tesegos中不限制任務數量,最多的任務數量取決於硬體資源。

#

include

"uxos.h"

ux_stack_t g_task1stack[

128]

; ux_tcb g_task1tcb;

void

task1

(void)}

ux_stack_t g_task2stack[

128]

; ux_tcb g_task2tcb;

void

task2

(void)}

intmain

(void)}

//空閒任務(idle)執行函式,空閒任務有如下特性:

//1.空閒任務中不可呼叫等待訊號,延時等使系統切換任務的api函式

//2.空閒任務優先順序為最低(值為0)

//3.系統具有預設的空閒任務執行函式,當不需要時可刪除此函式

void

idletask

(void

)}

任務需要在入口函式(main)中建立,必須在呼叫uxstart前建立好

tesegos內建兩個特殊任務defaulttask和idletask

預設任務defaulttask

defaulttask即是入口函式(main)執行的內容,為此main函式的最後必須是個 無限迴圈(不可退出),defaulttask使用的是開發環境啟動**配置的堆疊, 通常這是最不易溢位的情況,在有限ram資源的mcu來說這是安全利用ram資源 很有效的方式。

空閒任務idletask

idletask在系統核心中建立,用於在排程器發現沒有其它準備好的任務時執行, idletask的執行函式在系統核心中已定義,但使用者可在應用中重寫來執行cpu空閒時 的非重要任務,但需要注意的是,idletask中試圖切換任務可導致系統崩潰, 為此idletask中不可呼叫系統提供的等待、延時等導致主動放棄cpu執行權的api函式。

任務優先順序

tesegos任務優先順序可設定範圍是0~255,數值越高優先順序越高。defaulttask的優先順序為1 idletask任務的優先順序為0,如果使用者建立的任務優先順序為0,就會導致無法得到cpu執行 權的情況,因為同樣0優先順序的idletask任務永遠不會主動放棄cpu執行權。所以 一般使用者新建任務使用的優先順序為2,3,4…等。

介面函式:

建立乙個任務

void

uxcreatetask

(pux_tcb ptcb,

void(*

)(void

) fn,

ux_stack_t

* stack,

uint8_t priority

)

引數

ptcb 任務物件

fn 任務執行函式,原型為 void ***(void)

stack 任務堆疊在ram中的位置

priority 優先順序(1~255)

當前任務延時

void

uxdelaytask

(uint16_t n)

引數

n 延時的系統滴答週期

系統開始執行

void

uxstart

(void

)

註解:一般在入口函式(main)中呼叫,在呼叫前建立任務,呼叫後不可再建立任何任務

訊號量是在兩個或多個任務請求多個資源時提供分配和等待機制。

提供4個介面函式:

無等待的請求訊號量

#

define

uxacceptsem

(x)

引數

x:指向訊號量物件指標

返回uxc_done:表示為本次請求釋放了乙個訊號 uxc_pend:無可釋放訊號 uxc_wait:有其它任務也在等待此訊號量

建立乙個系統訊號量

#

define

uxcreatesem

(x, y )

引數

x 指向訊號量物件指標

y 可同時執行的任務個數

請求乙個訊號量

#

define

uxpendsem

(x)

引數

x 指向訊號量物件指標

向訊號量釋放乙個請求許可權

#

define

uxpostsem

(x)

引數

x 指向訊號量物件指標

互斥量是在兩個或多個任務請求乙個資源時提供分配和等待機制。

提供3個介面函式:

建立乙個系統互斥量

#

define

uxcreatemutex

(x)

引數

x 指向互斥量物件指標

鎖定乙個互斥量

#

define

uxlockmutex

(x)

引數

x 指向互斥量物件指標

解鎖(釋放)乙個互斥量

#

define

uxunlockmutex

(x)

引數

x 指向互斥量物件指標

xos中事件是兩個任務間同步的一種機制,事件具有等待超時功能, 但等待事件的任務只能為乙個。

提供3個介面函式:

建立乙個系統事件

#

define

uxcreateevent

(x)

引數

x 指向事件物件指標

觸發乙個事件

#

define

uxsetevent

(x)

引數

x 指向事件物件指標

等待乙個事件物件

#

define

uxwaitevent

(x, y )

引數

x 指向事件物件指標

y 超時系統滴答數

返回 : 事件觸發原因,非零表示超時觸發,零表示正常觸發動作而返回

以移植到cortex-m0為例需要實現如下五點:

1.任務主動放棄cpu執行權進行任務切換:

ossched函式在任務呼叫uxdelaytask,uxwaitevent,uxlockmutex,uxpendsem進入乙個等待狀態時呼叫 此函式進行任務切換。在cortex-m0中ossched函式的實現非常簡單,只需要觸發乙個pendsv中斷即可。

2.任務被更高優先順序任務搶占cpu執行板時進行任務切換:

osschedfromisr函式所有的搶占操作均是在系統滴答中斷中完成的,osschedfromisr實現步驟如下:

ostickhandler(); 判斷有無任務切換,有無更高優先順序任務就緒,如果有觸發pendsv中斷 雙堆疊+軟體中斷方式切換任務優勢體現在這裡,系統滴答中斷中不必每次儲存和恢復任務環境, 這大大的提高了系統執行效率。壓縮了系統對cpu的佔用率。

3.任務堆疊初始化函式

這是乙個模擬切換任務時壓棧當前環境的函式,把任務的初始棧內容準備好,以便切換到此任務時從棧彈出 任務的執行環境。

ux_stack_t * ostaskstackinit(ux_stack_t *stack,void (*fn)(void) ) //任務的堆疊初始化

4.pendsv中斷

完成實際的任務的切換

5.系統滴答功能初始化

ossystickstart系統滴答中斷硬體初始化在此函式內實現,通常系統滴答中斷週期設定成10~20毫秒。

對於具有雙堆疊指標的arm核心這裡要多做一件事情,tesegos將main函式視作default任務,系統上電後main函式是用msp執行, 此時可視為系統模式,而執行到這裡需要做乙個身份的轉換,即要變成乙個普通的任務,就是要將msp交給系統(中斷時用),而 自己切換到psp模式。

配置並開啟系統滴答定時器 switchstackpointer();

//將當前呼叫任務(default)切換到psp棧模式,並為msp指定系統棧空間

單片微控制器

微控制器又稱單片微控制器,它不是完成某乙個邏輯功能的晶元,而是把乙個計算機系統整合到乙個晶元上。相當於乙個微型的計算機,和計算機相比,微控制器只缺少了i o裝置。概括的講 一塊晶元就成了一台計算機。它的體積小 質量輕 便宜 為學習 應用和開發提供了便利條件。同時,學習使用微控制器是了解計算機原理與結...

單片微控制器

微控制器又稱單片微控制器,它不是完成某乙個邏輯功能的晶元,而是把乙個計算機系統整合到乙個晶元上。相當於乙個微型的計算機,和計算機相比,微控制器只缺少了i o裝置。概括的講 一塊晶元就成了一台計算機。它的體積小 質量輕 便宜 為學習 應用和開發提供了便利條件。同時,學習使用微控制器是了解計算機原理與結...

微控制器及微控制器系統

微控制器及微控制器系統 1 什麼是微控制器?微控制器是將 處理器 cpu 隨機儲存器 ram 唯讀儲存器 rom或eprom 定時器晶元和一些輸入 輸出介面電路整合在乙個晶元上的微控制器 microcontroller 處理器包括運算器 控制器和暫存器3個主要部分,是微控制器的核心。儲存器按工作方式...