学习之路主要为FreeRTOS操作系统在STM32F103(STM32F103C8T6)上的运用,采用的是标准库编程的方式,使用的IDE为KEIL5。
注意!!!本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习,也可以通过Proteus仿真的方式进行学习。
后续文章会同时发表在个人博客(jason1016.club)、CSDN;
视频会发布在bilibili(UID:399951374)
所谓FreeRTOS的任务概念,就是将要是执行的操作分为一个一个任务,然后通过任务调度器让任务按照优先级进行分配,实现多任务的调配管理。与裸机系统所有操作都堆积在main函数运行,会导致系统冗余,虽然可以通过进入中断的方法实现紧急操作的分流,但是频繁进中断可以会影响系统的正常运行。所以让FreeRTOS将任务进行分流执行。
运行态:顾名思义(一次只能有一个运行态)
就绪态:已经达成运行条件,但是因为有一个同优先级或者更高优先级的任务正在运行,所以运行不了
阻塞态:任务在等某个外部触发条件,当条件满足才会转换状态(比如vTaskDelay()函数,就要等待延时完毕)【任务进入阻塞态会有一个超时时间,当超过这个超时时间任务就会退出阻塞态,即使所等待的事件还没有来临】
挂起态:任务进入挂起态以后也不能被调度器调用进入运行态,但是进入挂起态的任务没有超时时间
每个任务都可以分配一个从0~(configMAX_PRIORITIES-1)的优先级
优先级数字越低表示任务的优先级越低,0 的优先级最低,configMAX_PRIORITIES-1 的优先级最高。空闲任务的优先级最低,为 0。
FreeRTOS 调度器确保处于就绪态或运行态的高优先级的任务获取处理器使用权,换句话说就是处于就绪态的最高优先级的任务才会运行。
那要是任务优先级一样高怎么办?
处于就绪态的优先级相同的任务就会使用时间片轮转调度器获取运行时间。(轮转调度器后面会讲到)
任务创建分为动态创建以及静态创建(区别在于动态创建是自动分配RAM任务栈的,而静态是手动分配的)【下面我们任务创建主要用动态的方法】 并且在动态方法中用于储存任务属性的任务控制块地址也会自动分配
一个任务主要是由几部分组成:
1、pxTaskCode: 任务函数
2、pcName: 任务名字,一般用于追踪和调试,任务名字长度不能超过:configMAX_TASK_NAME_LEN
3、usStackDepth: 任务堆栈大小,注意实际申请到的堆栈是 usStackDepth 的 4 倍。其中空闲任务的任务堆栈大小为 configMINIMAL_STACK_SIZE 任务堆栈作用当任务被中断时可以保护(恢复)现场
4、pvParameters: 传递给任务函数的参数
5、uxPriotiry: 任务优先级,范围 0~ configMAX_PRIORITIES-1
6、pxCreatedTask: 任务句柄,任务创建成功以后会返回此任务的任务句柄,这个句柄其实就是任务的任务堆栈。此参数就用来保存这个任务句柄。其他 API 函数可能会使用到这个句柄。
//创建开始任务
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); //任务句柄
任务删除函数:
vTaskDelete( TaskHandle_t xTaskToDelete ) //参数为需要删除的任务函数
任务挂起:将某个任务设置为挂起态,进入挂起态的任务永远都不会进入运行态
void vTaskSuspend( TaskHandle_t xTaskToSuspend) //参数为需要挂起的任务函数
任务恢复:将一个任务从挂起态恢复到就绪态
void vTaskResume( TaskHandle_t xTaskToResume) //参数为需要恢复的任务函数
BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume) //此函数是 vTaskResume()的中断版本,用于在中断服务函数中恢复一个任务
本文为作者独立编写,本BLOG上所有的原创文章未经本人许可,不得用于商业用途及传统媒体。网络媒体转载请注明出处,否则属于侵权行为。