UCOSIII任务创建

Posted on 2017-02-23 16:52  自由一份子  阅读(4338)  评论(0编辑  收藏  举报

  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 }