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個主要部分,是微控制器的核心。儲存器按工作方式...