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);