UCOSIII任務創建:
首先要確保UCOSIII移植成功;
一般以下幾個步驟就行了:
第一步:寫好任務所需的 優先級、堆棧、控制塊等;
然后順便聲明下任務函數;
第二步:開始創建函數
源碼:
1 #include "led.h" 2 #include "delay.h" 3 #include "sys.h" 4 #include "usart.h" 5 #include "includes.h" 6 7 //關於優先級的說明: 8 //系統保留有5個任務,這五個任務占了5個優先級,用戶不得使用這5個優先級 9 //優先級0:中斷服務管理任務:OS_IntQTask(); 10 //優先級1:時鍾節拍任務:OS_TickTask(); 11 //優先級2:定時任務:OS_TmrTask(); 12 //優先級OS_CFG_PRIO_MAX-2(倒數第二個優先級):統計任務:OS_StatTask(); 13 //優先級OS_CFG_PRIO_MAX-1(倒數第一個優先級):空閑任務:OS_IdleTask(); 14 15 #define START_TASK_PRIO 3 //任務優先級; 16 #define START_STK_SIZE 128 //任務堆棧大小,實際大小是:128*4字節 17 CPU_STK START_TASK_STK[START_STK_SIZE]; //任務堆棧; 18 OS_TCB StartTaskTCB; //任務控制塊; 19 //聲明任務函數(一般將一個任務寫成一個函數): 20 void start_task(void *p_arg); //注:“p_arg”這個參數基本用不上,但必須得寫上 21 22 #define LED0_TASK_PRIO 4 //任務優先級; 23 #define LED0_STK_SIZE 128 //任務堆棧大小,實際大小是:128*4字節 24 CPU_STK LED0_TASK_STK[LED0_STK_SIZE]; //任務堆棧; 25 OS_TCB Led0TaskTCB; //任務控制塊; 26 //聲明任務函數(一般將一個任務寫成一個函數): 27 void Led0_task(void *p_arg); //注:“p_arg”這個參數基本用不上,但必須得寫上 28 29 #define LED1_TASK_PRIO 5 //任務優先級; 30 #define LED1_STK_SIZE 128 //任務堆棧大小,實際大小是:128*4字節 31 CPU_STK LED1_TASK_STK[LED1_STK_SIZE]; //任務堆棧; 32 OS_TCB Led1TaskTCB; //任務控制塊; 33 //聲明任務函數(一般將一個任務寫成一個函數): 34 void Led1_task(void *p_arg); //注:“p_arg”這個參數基本用不上,但必須得寫上 35 36 #define Printf_TASK_PRIO 6 //任務優先級; 37 #define Printf_STK_SIZE 128 //任務堆棧大小,實際大小是:128*4字節 38 CPU_STK Printf_TASK_STK[Printf_STK_SIZE]; //任務堆棧; 39 OS_TCB PrintfTaskTCB; //任務控制塊; 40 //聲明任務函數(一般將一個任務寫成一個函數): 41 void Printf_task(void *p_arg); //注:“p_arg”這個參數基本用不上,但必須得寫上 42 43 int main() 44 { 45 OS_ERR err; //系統使用,任務錯誤標示保存在此變量中 46 CPU_SR_ALLOC(); //臨界區函數使用; 47 48 //外設初始化: 49 delay_init(); 50 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中斷分組 51 uart_init(115200); 52 LED_Init(); 53 54 //UCOS初始化: 55 OSInit(&err); 56 OS_CRITICAL_ENTER(); //進入臨界區; 57 //任務創建函數: 58 OSTaskCreate( 59 (OS_TCB *) &StartTaskTCB, //任務控制塊 60 (CPU_CHAR*) "start_task", //任務名稱 61 (OS_TASK_PTR) start_task, //任務函數 62 (void *) 0, //此參數暫時不用 63 (OS_PRIO) START_TASK_PRIO, //任務優先級 64 (CPU_STK *) &START_TASK_STK[0], //任務堆棧基地址 65 (CPU_STK_SIZE) START_STK_SIZE/10, //堆棧棧深 66 (CPU_STK_SIZE) START_STK_SIZE, //堆棧大小 67 (OS_MSG_QTY) 0, 68 (OS_TICK) 0, 69 (void *) 0, 70 (OS_OPT) OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,//選項,選擇任務創建后進行的操作 71 (OS_ERR *) &err //錯誤標示 72 ); 73 OS_CRITICAL_EXIT(); //退出臨界區; 74 75 OSStart(&err); //系統開始運行 76 } 77 78 //任務函數;注:一般將其它任務的創建放到一個專門創建任務的函數中; 79 void start_task(void *p_arg) 80 { 81 OS_ERR err; 82 CPU_SR_ALLOC(); 83 p_arg = p_arg; //故意使用一下這個參數,否則編譯器會警告說此參數沒有使用 84 85 CPU_Init(); 86 #if OS_CFG_STAT_TASK_EN > 0u 87 OSStatTaskCPUUsageInit(&err); //統計任務 88 #endif 89 90 #ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了測量中斷關閉時間 91 CPU_IntDisMeasMaxCurReset(); 92 #endif 93 94 #if OS_CFG_SCHED_ROUND_ROBIN_EN //當使用時間片輪轉的時候 95 96 //使能時間片輪轉調度功能,時間片長度為:1*5=5ms 97 OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); 98 #endif 99 100 OS_CRITICAL_ENTER(); //進入臨界區 101 //創建LED0任務: 102 OSTaskCreate( (OS_TCB *) &Led0TaskTCB, 103 (CPU_CHAR *) "led0 task", 104 (OS_TASK_PTR) Led0_task, 105 (void *) 0, 106 (OS_PRIO) LED0_TASK_PRIO, 107 (CPU_STK *) &LED0_TASK_STK[0], 108 (CPU_STK_SIZE) LED0_STK_SIZE/10, 109 (CPU_STK_SIZE) LED0_STK_SIZE, 110 (OS_MSG_QTY) 0, 111 (OS_TICK) 0, 112 (void *) 0, 113 (OS_OPT) OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, 114 (OS_ERR *) &err 115 ); 116 117 //創建LED1任務: 118 OSTaskCreate( (OS_TCB *) &Led1TaskTCB, 119 (CPU_CHAR *) "led1 task", 120 (OS_TASK_PTR) Led1_task, 121 (void *) 0, 122 (OS_PRIO) LED1_TASK_PRIO, 123 (CPU_STK *) &LED1_TASK_STK[0], 124 (CPU_STK_SIZE) LED1_STK_SIZE/10, 125 (CPU_STK_SIZE) LED1_STK_SIZE, 126 (OS_MSG_QTY) 0, 127 (OS_TICK) 0, 128 (void *) 0, 129 (OS_OPT) OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, 130 (OS_ERR *) &err 131 ); 132 133 //創建Printf任務: 134 OSTaskCreate( (OS_TCB *) &PrintfTaskTCB, 135 (CPU_CHAR *) "Printf test task", 136 (OS_TASK_PTR) Printf_task, 137 (void *) 0, 138 (OS_PRIO) Printf_TASK_PRIO, 139 (CPU_STK *) &Printf_TASK_STK[0], 140 (CPU_STK_SIZE) Printf_STK_SIZE/10, 141 (CPU_STK_SIZE) Printf_STK_SIZE, 142 (OS_MSG_QTY) 0, 143 (OS_TICK) 0, 144 (void *) 0, 145 (OS_OPT) OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, 146 (OS_ERR*) &err 147 ); 148 149 //OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err); //掛起"start_task"任務 150 OS_CRITICAL_EXIT(); //退出臨界區 151 OSTaskDel((OS_TCB *)0,&err);//刪除任務自身;(第一個參數填寫0,就是刪除任務自身,要是填寫別的任務的控制塊,那就是刪除別的任務) 152 } 153 154 //******************************************************************************* 155 156 // 具體3個任務 157 158 //******************************************************************************* 159 160 //"Led0_task"任務: 161 void Led0_task(void *p_arg) 162 { 163 OS_ERR err; 164 p_arg = p_arg; //故意使用一下這個參數,否則編譯器會警告說此參數沒有使用 165 while(1) 166 { 167 LED0=~LED0; 168 OSTimeDlyHMSM(0,0,0,300,OS_OPT_TIME_HMSM_STRICT,&err); 169 } 170 } 171 172 //"Led1_task"任務: 173 void Led1_task(void *p_arg) 174 { 175 OS_ERR err; 176 p_arg = p_arg; //故意使用一下這個參數,否則編譯器會警告說此參數沒有使用 177 while(1) 178 { 179 LED1=~LED1; 180 OSTimeDlyHMSM(0,0,0,300,OS_OPT_TIME_HMSM_STRICT,&err); 181 } 182 } 183 184 //"Printf_task"任務: 185 void Printf_task(void *p_arg) 186 { 187 OS_ERR err; 188 CPU_SR_ALLOC(); 189 p_arg = p_arg; //故意使用一下這個參數,否則編譯器會警告說此參數沒有使用 190 while(1) 191 { 192 OS_CRITICAL_ENTER(); //進入臨界區 193 printf("Hello World!\r\n"); 194 OS_CRITICAL_EXIT(); //退出臨界區 195 delay_ms(300); 196 OSTimeDlyHMSM(0,0,0,300,OS_OPT_TIME_HMSM_STRICT,&err); 197 } 198 }