打印
[STM32F1]

FreeRTOS学习之路,以STM32F103C8T6为实验MCU

[复制链接]
528|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2023-8-15 11:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一、任务的概念
所谓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()的中断版本,用于在中断服务函数中恢复一个任务

————————————————
版权声明:本文为CSDN博主「JASON丶LI」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_61908666/article/details/132012979

使用特权

评论回复
沙发
jlyuan| | 2023-8-15 21:04 | 只看该作者
任务优先级一样高怎么办?

使用特权

评论回复
板凳
Bowclad| | 2023-8-15 23:14 | 只看该作者
jlyuan 发表于 2023-8-15 21:04
任务优先级一样高怎么办?

一样高好像是按那个什么顺序来判断

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2028

主题

15903

帖子

13

粉丝