- 简述:
- uC/OS任务分为2种:系统任务和用户任务
- 任务组成:
- 任务程序代码(函数)
- 任务堆栈
- 任务控制块
- 任务的状态:
- 睡眠:任务没有配备任务控制块或被剥夺了任务控制块时的状态
- 就绪:系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,任务具备了运行的充分条件
- 运行:处于就绪状态的任务经调度器判断获得了CPU的使用权,则任务就进入了运行状态
- 等待:正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给其他任务而使任务进行等待状态
- 中断服务态:一个正在运行的任务一旦响应中断申请就会中止运行转而去执行中断服务程序,此时这个任务就会被挂起,进入中断服务态
- 硬件初始化:
- 模仿官方例程,把所有的外设初始化都放在bsp.c文件中的bsp_init()函数
- 本章节只用到led和串口
- 代码如下:
/************************************************** * 函数名:void BSP_Init (void) * 描述 :外设初始化 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ void BSP_Init (void) { Cache_Enable(); //打开L1-Cache HAL_Init(); //初始化HAL库 Stm32_Clock_Init(432,25,2,9); //设置时钟,216Mhz // delay_init(216); uart_init(115200); //串口初始化 BSP_LED_Init(); //led 初始化 }
- 定义任务堆栈大小
-
/* ********************************************************************************************************* * 任务堆栈大小 ********************************************************************************************************* */ #define APP_TASK_START_STK_SIZE 256u #define APP_TASK_LED_STK_SIZE 512u #define APP_TASK_USART_STK_SIZE 512u
-
- 定义任务优先级
-
/* ********************************************************************************************************* * 任务 优先级 ********************************************************************************************************* */ #define APP_TASK_START_PRIO 2u #define APP_TASK_LED_PRIO 3u #define APP_TASK_USART_PRIO 3u
-
- 定义任务控制块
-
/* ********************************************************************************************************* * 任务控制块TCB ********************************************************************************************************* */ static OS_TCB AppTaskStartTCB; //起始任务控制块 static OS_TCB AppTaskLedTCB; //led任务控制块 static OS_TCB AppTaskUsartTCB; //串口任务控制块
-
- 定义任务主体函数
-
/* ********************************************************************************************************* * 函数原型 ********************************************************************************************************* */ static void AppTaskStart(void *p_arg); //起始任务函数 static void AppTaskLed(void *p_arg); //led任务函数 static void AppTaskUsart(void *p_arg); //串口任务函数
-
- 创建任务
-
/************************************************** * 函数名:static void AppTaskStart (void *p_arg) * 描述 :起始任务 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ static void AppTaskStart (void *p_arg) { CPU_INT32U cpu_clk_freq; CPU_INT32U cnts; OS_ERR err; (void)p_arg; BSP_Init(); /* Initialize BSP functions */ CPU_Init(); /* Initialize the uC/CPU services */ //初始化滴答计数器 cpu_clk_freq = BSP_CPU_ClkFreq(); /* Determine SysTick reference freq. */ cnts = cpu_clk_freq /* Determine nbr SysTick increments */ / (CPU_INT32U)OSCfg_TickRate_Hz; OS_CPU_SysTickInit(cnts); /* Init uC/OS periodic time src (SysTick). */ //内存管理,堆内存池,内存池表 Mem_Init(); /* Initialize memory managment module */ // Math_Init(); /* Initialize mathematical module */ #if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */ #endif #ifdef CPU_CFG_INT_DIS_MEAS_EN CPU_IntDisMeasMaxCurReset(); #endif /* 创建led任务 */ OSTaskCreate((OS_TCB *) &AppTaskLedTCB, //任务控制块地址 (CPU_CHAR *) "App Task Led", //任务名称 (OS_TASK_PTR ) AppTaskLed, //任务函数 (void *) 0, //传递给任务函数(形参p_arg)的实参 (OS_PRIO ) APP_TASK_LED_PRIO, //任务的优先级 (CPU_STK *) &AppTaskLedStk[0], //任务堆栈的基地址 (CPU_STK_SIZE) APP_TASK_LED_STK_SIZE / 10, //任务堆栈空间剩下1/10时限制其增长 (CPU_STK_SIZE) APP_TASK_LED_STK_SIZE, //任务堆栈空间(单位:sizeof(CPU_STK)) (OS_MSG_QTY ) 5u, //任务可接收的最大消息数 (OS_TICK ) 0u, //任务的时间片节拍数(0表默认值OSCfg_TickRate_Hz/10) (void *) 0, //任务扩展(0表不扩展) (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), //任务选项 (OS_ERR *)&err); /* 创建串口任务 */ OSTaskCreate((OS_TCB *) &AppTaskUsartTCB, //任务控制块地址 (CPU_CHAR *) "App Task Usart", //任务名称 (OS_TASK_PTR ) AppTaskUsart, //任务函数 (void *) 0, //传递给任务函数(形参p_arg)的实参 (OS_PRIO ) APP_TASK_USART_PRIO, //任务的优先级 (CPU_STK *) &AppTaskUsartStk[0], //任务堆栈的基地址 (CPU_STK_SIZE) APP_TASK_USART_STK_SIZE / 10, //任务堆栈空间剩下1/10时限制其增长 (CPU_STK_SIZE) APP_TASK_USART_STK_SIZE, //任务堆栈空间(单位:sizeof(CPU_STK)) (OS_MSG_QTY ) 5u, //任务可接收的最大消息数 (OS_TICK ) 0u, //任务的时间片节拍数(0表默认值OSCfg_TickRate_Hz/10) (void *) 0, //任务扩展(0表不扩展) (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), //任务选项 (OS_ERR *)&err); OSTaskDel(&AppTaskStartTCB, &err); //删除起始任务 }
-
- 任务应用
-
/* ********************************************************************************************************* * 任务函数实现 ********************************************************************************************************* */ /************************************************** * 函数名:static void AppTaskLed(void *p_arg) * 描述 :led应用 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ static void AppTaskLed(void *p_arg) { OS_ERR err; (void)p_arg; for(;;) { HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); //PB1置1 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); //PB0置1 printf("灯亮了\r\n"); OSTimeDly ( 500,OS_OPT_TIME_DLY,&err); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); //PB1置0 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET); //PB0置0 printf("灯灭了\r\n"); OSTimeDly ( 500,OS_OPT_TIME_DLY,&err); } } /************************************************** * 函数名:static void AppTaskUsart(void *p_arg) * 描述 :串口打印 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ static void AppTaskUsart(void *p_arg) { OS_ERR err; (void)p_arg; for(;;) { printf("灯亮了\r\n"); OSTimeDly ( 500,OS_OPT_TIME_DLY,&err); printf("灯灭了\r\n"); OSTimeDly ( 500,OS_OPT_TIME_DLY,&err); } }
-
- 下载验证
- 省略
- 总结
- 任务的5个状态、任务构成、任务创建流程、用户任务与系统任务
- 参考资料:
- 正点原子《STM32F767 UCOS开发手册》
- 野火《uC/OS-III内核应用与开发》
- 《嵌入式实时操作系统 uC/OS-III原理及应用(第二版)》
- 官方源码
- 硬件平台:
- 正点原子阿波罗F767
- 软件平台:
- MDK5.2.5
- 库版本:
- TM32Cube_FW_F7_V1.4.0
- uC/OS-III版本
- UCOSIII 3.04
【1】uC/OS-III应用开发————>创建任务(STM32F767)
最新推荐文章于 2022-11-07 21:47:02 发布