UCOSIII任务初始宏定义
#define TASK_PRIO 3 //任务优先级
#define TASK_STK_SIZE 128 //任务堆栈大小
OS_TCB TASKTCB; //任务控制块
CPU_STK TASK_STK[TASK_STK_SIZE]; //任务堆栈
void task(void *p_arg); //任务函数
创建开始任务函数
OS_ERR err; //创建返回任务错误的变量
CPU_SR_ALLOC();//为临界区申请变量
//在主函数开始这个任务
OSInit(&err); //初始化UCOSIII
OS_CRITICAL_ENTER(); //进入临界区
//创建开始任务
OSTaskCreate((OS_TCB * )&TASKTCB, //任务控制块,用存储任务信息
(CPU_CHAR *)"task", //任务名字
(OS_TASK_PTR )task, //任务函数
(void * )0, //传递给任务函数的参数
(OS_PRIO )TASK_PRIO, //任务优先级
(CPU_STK * )&TASK_STK[0], //任务堆栈基地址
(CPU_STK_SIZE )TASK_STK_SIZE/10, //任务堆栈深度限位
(CPU_STK_SIZE )TASK_STK_SIZE, //任务堆栈大小
(OS_MSG_QTY )0, //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
(OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认长度,
(void * )0, //用户补充的存储区
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP, //任务选项,为了保险起见,所有任务都保存浮点寄存器的值
(OS_ERR * )&err); //存放该函数错误时的返回值
OS_CRITICAL_EXIT(); //退出临界区
OSStart(&err); //开启UCOSIII
在开始任务中定义其他任务
void start_task(void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg;
CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0u
OSStatTaskCPUUsageInit(&err); //统计任务
#endif
#ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了测量中断关闭时间
CPU_IntDisMeasMaxCurReset();
#endif
#if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候
//使能时间片轮转调度功能,设置默认的时间片长度
OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
#endif
OS_CRITICAL_ENTER(); //进入临界区
//创建TASK1任务
//此处省略
//创建TASK2任务
OS_CRITICAL_EXIT(); //退出临界区
OSTaskDel((OS_TCB*)0,&err); //删除start_task任务自身
}
其他任务函数
void task1_task(void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg;
OS_CRITICAL_ENTER();
OS_CRITICAL_EXIT();
while(1)
{
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
}
}
main函数
OS_ERR err;
CPU_SR_ALLOC();
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
HAL_Init(); //初始化HAL库
delay_init(180); //初始化延时函数
uart_init(115200); //初始化USART
LED_Init(); //初始化LED
OSInit(&err);
OS_CRITICAL_ENTER();//进入代码临界保护区
OSTaskCreate (&START_TASK_TCB, (CPU_CHAR *)"start_task",start_task,0,START_TASK_PRIO,START_TASK_STK,START_TASK_STK_SIZE/10,START_TASK_STK_SIZE,0, 0,0,OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,&err);
OS_CRITICAL_EXIT();//退出代码临界保护区
OSStart(&err); //开启UCOSIII
while(1);