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! "); 194 OS_CRITICAL_EXIT(); //退出临界区 195 delay_ms(300); 196 OSTimeDlyHMSM(0,0,0,300,OS_OPT_TIME_HMSM_STRICT,&err); 197 } 198 }