UCOSIII任務創建


  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 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM