RTOS 系统的核心就是任务管理,FreeRTOS 也不例外,上手 RTOS 系统首先必须掌握的也是任务的创建、删除、挂起和恢复等操作。
FreeRTOS 之所以能正确的恢复一个任务的运行就是因为有任务堆栈在保驾护航,任务调度器在进行任务切换的时候会将当前任务的现场(CPU 寄存器值等)保存在此任务的任务堆栈中,等到此任务下次运行的时候就会先用堆栈中保存的值来恢复现场,恢复现场以后任务就会接着从上次中断的地方开始运行。
调用函数 vTaskStartScheduler()开启任务调度器,此函数会创建一个名为“IDLE”的任务,这个任务叫做空闲任务(空闲的时候运行的任务),也就是系统中其他的任务由于各种原因不能运行的时候空闲任务就在运行。空闲任务是 FreeRTOS 系统自动创建的,不需要用户手动创建。
空闲任务使用最低优先级,如果应用中有其他高优先级任务处于就绪态的话这个空闲任务就不会跟高优先级的任务抢占 CPU 资源。
空闲任务还有另外一个重要的职责,判断系统是否有任务删除,如果有的话就在空闲任务中释放被删除任务的任务堆栈和任务控制块的内存。除此以外空闲任务就没有什么特别重要的功能了,所以可以根据实际情况减少空闲任务使用 CPU 的时间(比如,当 CPU 运行空闲任务的时候使处理器进入低功耗模式)。
main()
{
//初始化时钟、串口、HAL库等等
//创建开始任务
//开启任务调度
}
开始任务的任务函数()
{
//进入临界区
//创建N个任务
//删除开始任务
//退出临界区
}
//创建开始任务
xTaskCreate((TaskFunction_t )start_task, //任务函数
(const char* )"start_task", //任务名称
(uint16_t )START_STK_SIZE, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )START_TASK_PRIO, //任务优先级
(TaskHandle_t* )&StartTask_Handler); //任务句柄
main()
{
//初始化时钟、串口、HAL库等等,[初始化OS]
//创建开始任务
//开启ucos
}
开始任务的任务函数()
{
//进入临界区
//创建N个任务
//删除开始任务
//退出临界区
}
//创建开始任务
OSTaskCreate((OS_TCB* )&StartTaskTCB, //任务控制块
(CPU_CHAR* )"start task", //任务名字
(OS_TASK_PTR )start_task, //任务函数
(void* )0, //传递给任务函数的参数
(OS_PRIO )START_TASK_PRIO, //任务优先级
(CPU_STK* )&START_TASK_STK[0], //任务堆栈基地址
(CPU_STK_SIZE )START_STK_SIZE/10, //任务堆栈深度限位
(CPU_STK_SIZE )START_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); //存放该函数错误时的返回值
RTOS中对drivers的使用,采用直接调用的方法(函数名调用),而不是和Linux一样有套复杂的注册、匹配步骤。