FreeRTOS--任务管理(创建、删除、挂起、恢复)

1、任务的基本概念

从系统的角度看,任务是竞争系统资源的最小运行单元。
 FreeRTOS 是一个支持多任务的操作系统,在 FreeRTOS 中,任务可以使用或等待 CPU 、使用内存空间等系统资源,并独立于其他任务运行。
每个任务在自己的环境中运行,在任何时刻,只有一个任务得到运行, FreeRTOS 调度器决定运行哪个任务。调度器会不断的启动、停止每一个任务(这个过程很快),宏观上看,所有的任务都在同时进行。
在 FreeRTOS 中,每个任务都有自己的栈空间(一段连续的内存),用于保存任务运行环境。任务越多,需要的栈空间就越大,而一个系统能运行多少个任务,取决于系统可用的内存。
任务通常会运行在一个死循环中,不会退出,如果不需要某个任务,可以调用 FreeRTOS 中的删除任务 API 函数将任务删除,释放系统资源。


2、任务状态的概念
 FreeRTOS 系统中的任务有四种状态:
口 Running 一运行态
当任务处于实际运行时被称之为运行态,即 CPU 的使用权被这个任务占用。
□ Ready ﹣就绪态
处于就绪态的任务是指那些能够运行(没有被阻塞和挂起),但是当前没有运行的任务,因为同优先级或更高优先级的任务正在运行。
 Blocked ﹣阻塞态
由于等待信号量,消息队列,事件标志组等而处于的状态被称之为阻塞态,另外任务调用延迟函数也会处于阻塞态。
□ Suspended 一挂起态
类似阻塞态,通过调用函数 vTaskSuspend ()对指定任务进行挂起,挂起后这个任务将不被执行,只有调用函数 xTaskResume ()才可以将这个任务从挂起态恢复。

3.任务状态的切换

373ab9af89df45e7a3147100778d8596.png

后续讲解的任务状态函数参考此图分析

 4.系统启动

使用此函数启动FreeRTOS调度:

void vTaskStartScheduler(void);

下图为使用cubemx创建freertos的调度任务函数。

d6c46b9fbacc4e78ae57b2d65d1fbca0.png

5.空闲任务

空闲任务是FreeRTOS系统中没有其他任务运行时自动进入的系统任务,不需要用户创建,启动调度器时,调度器会自动创建空闲任务。

9e207570f7724673a57d05befed90f4f.png

空闲任务的作用: 

  • 执行删除任务时,系统并不会立即释放任务的内存空间,只会将任务添加到结束列表中,真正的系统资源回收工作在空闲任务中完成。这里又有1点要说明:第一种情况:当任务删除自己时,即自杀,这时必须要有空闲任务来清理内存(抽象理解:你这个任务都自杀了,还怎么清理自己的尸体,必须由其他任务来清理);第二种情况:当任务是被其他任务调用删除函数删除,即被杀时,这时是在vTaskDelete函数内部清理内存(由凶手调用这个函数来清理)
  • 可以在空闲任务中实现低功耗功能

6.任务创建

创建任务的方式:

静态创建任务:xTaskCreateStatic(),需要自行定义任务栈空间与任务控制块,一般不采用,不作介绍。

动态创建任务:xTaskCreate(),系统动态分配任务栈空间与任务控制块。

函数原型:

591f654a4d8c42e9829d69d65edf3b74.png

举例:

ad2c1023e83749128b98e7a3562ace8e.png STM32cubeMX自动创建:

 

2ffe214cccdd443ab3654a881ebce60c.png

8e3b78dc2ecc4cc69b013f191283fe53.png

 

 7.任务删除

函数原型:

void vTaskDelete(TaskHandle_t xTask)  参数为某一需要删除任务的句柄。

举例:

3364e51a1c0440bfb387a33c14c1705e.png

 536d340745b34bf2a2995bc1b096da51.png

 

 这里插空简单讲述一下句柄,这里的句柄可以看作是指向任务控制块的指针(空类型),任务控制块是一个结构体,用来控制任务参数等。创建任务后句柄指向任务控制块(句柄需要先定义),就可以操作任务了。

8.任务挂起

函数原型:

void vTaskSuspend(TaskHandle_t xTaskToSuspend) 参数为需要挂起任务的句柄。

举例:

7b18c2bf37ec40d18dd9a5c5c16193a4.png

94947b0a0603460d8a80c798d605fcb8.png

 

9.任务恢复(分为普通恢复和中断恢复方式,这里只讲普通恢复方式)

函数原型:

 void vTaskResume(TaskHandle_t xTaskToResume) 参数为需要恢复任务的句柄。

举例:

a31bd48d4bb3482fa6bf7a0fc3805023.png

 aaebb6a61d6d42309007716cc0414a01.png

 实例编程

配置cubeMX

a8709889e77145e3b13fe5e0cad7847d.png

4ab58391a85e45369427e4d4a226499a.png 手动创建按键任务:

668c6a8536c14779aaa40b440dea5953.png

自动创建的4个任务分别为:3个LED灯的闪烁和一个串口打印检测任务(用来打印检测各任务在CPU的占用率) ,按键任务为分别检测4个按键的电平状态,控制LED2_Task任务的创建、删除、挂起与恢复功能,这里就不再列举出代码了。

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西红柿鸡蛋超级美味

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值