19.1 操作系統介紹
UC/OS-II 中最多可以支持64 個任務,分別對應優先級0~63,其中0 為最高優先級。63為最低級,系統保留了4個最高優先級的任務和4個最低優先級的任務,所有用戶可以使用的任務數有56個.
19.1.1 操作系統簡介
什么是操作系統
操作系統是管理和控制計算機硬件與軟件資源的計算機程序,是直接運行在“裸機”上的最基本的系統軟件,任何其他軟件都必須在操作系統的支持下才能運行。介於APP和硬件之間。
19.1.1 常見的操作系統
常見的操作系統:
IOS(蘋果)、安卓()、Windows、Linux、塞班、UCOS、FreeRTOS、RT-T(國產)、Vxworks、eCos等等。
實時操作系統(RTOS)
UCOS(學習免費,商用需要注冊)、FreeRTOS、RT-T(國產)、Vxworks、eCos
會給每個任務一個基礎的時間長度,根據任務的需求適當調整任務時長。任務與任務直接切換都有相應的規則。
分時操作系統
Windows----2000以前、Linux----2.6以前
給每一個任務分配一個固定的時長,如果這個任務在固定的時長內已經空閑,分時操作系統還是會給該任務規定好的時長。
半實時操作系統
Windows----7/8/10、Linux----2.6以后
19.1 UCOS操作系統介紹
19.1.1 操作系統的調度原則
UCOS操作系統調度原則是:以任務優先級為調度原則。任務優先級編號越小的,任務優先級越高。
注意點:每個任務只有一個優先級,不同任務優先級編號不能一致。
19.1.1 操作系統的程序結構
沒有操作系統時
整個裸機項目工程中有且僅有一個死循環,這個死循環存在main函數中。其它地方可以有死循環但是必須要有退出條件。
有操作系統時
整個操作系統項目工程中可以有多個死循環,每個任務中有一個死循環,main函數中無死循環。
注意點:操作系統在main中必須完成兩點:①設定好操作系統心跳節拍;②創建一個任務(該任務必須創建成功)。
19.1.1 操作系統的任務調度
任務調度:指的是什么時候會發生任務調度。
兩種情況下會發生任務調度。
操作系統的心跳節拍到達。心跳節拍稱為一個Tick。UCOS中有一個專用的操作系統心跳節拍函數:OSTimeTick();
操作系統中的程序代碼調用OS_Sched();該函數時會產生任務調度。OS_Sched():稱為任務調度函數。
注意:任務調度函數我們不能夠直接調用,只能是操作系統調用。程序員調用該函數會使得UCOS操作系統崩潰。
注意點①:操作系統發生任務調度不一定切換任務;任務切換一定需要產生任務調度。
注意點②:操作系統中高優先級任務必須要有釋放CPU控制權函數調用。
19.1.1 操作系統的任務狀態
UCOS操作系統中,任務狀態有五種:停止/休眠、准備就緒、運行、掛起/等待、中斷。只有當任務進入到運行狀態才可以執行任務中的程序代碼。
停止:任務被刪除。
休眠:當前沒有任何一個任務准備就緒,運行狀態中沒有任務執行。
准備就緒:任務運行需要滿足的條件都准備完成。
運行:任務正在運行。
掛起:任務需要等待某一個條件發生,其他任務可以將這個任務掛起。
等待:延時相關的。
中斷:程序發生了中斷事件,CPU要去處理中斷服務函數,中斷操作系統。
19.1.1 操作系統的任務中斷
中斷狀態中需要注意以下幾點:
從運行狀態進入中斷狀態必須要調用函數OSIntEnter();該函數的功能是用來告訴操作系統當前程序進入中斷。
從中斷狀態退出后進入運行狀態之前必須調用函數OSIntExit();該函數的功能是用來告訴操作系統當前程序退出中斷。
程序從中斷中退出,操作系統返回到任務中去,這時不一定返回到原來的任務中。

1 /* 2 函數功能:初始化系統滴答定時器 3 函數形參:任意毫秒 4 函數返回值:無 5 備注:控制操作系統的心跳節拍----中斷方式 6 作者:李工 7 時間:2018-09-19 8 */ 9 void SysTick_Init(u16 n_ms) 10 { 11 SysTick->CTRL = 0;//清空配置 12 //選擇時鍾源為21MHz 13 14 SysTick->VAL = 0; 15 16 SysTick->LOAD = n_ms * 21000; 17 18 SysTick->CTRL |= (0X1 << 1);//開啟模塊級中斷使能 19 20 SysTick->CTRL |= (0X1 << 0);//開啟遞減計數器--使能 21 } 22 23 /* 24 函數功能:系統滴答定時器的中斷服務函數 25 函數形參:無 26 函數返回值:無 27 備注:告訴操作系統進中斷、出中斷、心跳節拍函數 28 作者:李工 29 時間:2018-09-19 30 */ 31 void SysTick_Handler(void) 32 { 33 OSIntEnter();//進中斷 34 35 if(SysTick->CTRL & (0X1 << 16)) 36 { 37 OSTimeTick();//心跳節拍函數 38 } 39 40 OSIntExit();//出中斷 41 } 42 43 /* 44 函數功能:主函數 45 函數形參:無 46 函數返回值:整型 47 備注:使用UCOS操作系統 48 49 */ 50 int main(void) 51 { 52 //初始化系統滴答定時器 53 SysTick_Init(1000 / OS_TICKS_PER_SEC); 54 //初始化操作系統 55 OSInit(); 56 //創建一個任務 57 OSTaskCreate(os_start_task,NULL,&OS_STK_START_TASK_SIZE[OS_STK_START_TASK_LENGTH - 1],OS_START_TASK_PRIO); 58 //啟動操作系統 59 OSStart(); 60 //如果任務創建失敗則執行這個無限循環 61 while(1) 62 { 63 ; 64 } 65 }

1 INT8U OSTaskCreate (void (*task)(void *p_arg), 2 void *p_arg, 3 OS_STK *ptos, 4 INT8U prio) 5 函數功能:創建一個任務 6 函數形參:void (*task)(void *p_arg):函數指針,用來存放任務函數 7 void *p_arg:任務函數的形參傳遞,如果無形參傳遞使用NULL即可 8 OS_STK *ptos:任務的任務棧的棧頂 9 INT8U prio:任務的優先級編號 10 函數返回值:OS_ERR_NONE:表示創建成功;否則表示失敗 11 使用方法: 12 OSTaskCreate(os_start_task,NULL,&OS_STK_START_TASK_SIZE[OS_STK_START_TASK_LENGTH - 1],OS_START_TASK_PRIO); 13 任務的具體實現: 14 #define OS_START_TASK_PRIO 10 15 #define OS_STK_START_TASK_LENGTH 256 16 OS_STK OS_STK_START_TASK_SIZE[OS_STK_START_TASK_LENGTH]; 17 18 /* 19 函數功能:啟動任務 20 函數形參:萬能指針 21 函數返回值:無 22 備注:無 23 作者:李工 24 時間:2018-09-19 25 */ 26 void os_start_task(void *p_arg) 27 { 28 29 while(1) 30 { 31 32 } 33 }
19.1 UCOS操作系統任務管理
19.4.1ucos任務組成
任務控制塊(底層,不需要掌握)、任務優先級,任務棧,任務函數。
任務控制塊:當創建一個任務的時候,ucos會分配一段內存空間給這個任務,這段內存空間就稱為任務控制塊。任務控制塊記錄了任務的相關信息:任務函數地址、任務的優先級、任務狀態、任務棧地址。
任務優先級:每個任務都有一個唯一的優先級,優先級也只我們這個任務在ucos中的唯一標識,任務的優先級是ucos做任務調度的依據。
任務棧:當任務切換的時候保存該任務的狀態(切換之前執行到哪里了,局部變量)。
任務函數:當任務被調度的時候,要完成的工作。
19.1 UCOS操作系統任務間通信
19.1.1 信號量
(保護那段代碼不被別的進程搶走)
作用:保護共享資源。
信號量:在UCOS操作系統里面就相當於一個全局變量,釋放信號量讓這個信號量的值加1,使用信號量讓這個信號量的值減1。最小值為0。
19.1.1 消息郵箱
19.1.1 消息隊列
19.1.1 互斥信號量
19.1 UCOS操作系統事件標志組