FreeRTOS 简介

本文详细阐述了FreeRTOS中的任务管理,包括内存占用分析、任务状态及其优先级、空闲任务和钩子,以及任务间的通信方式如任务通知、互斥锁、信号量、队列和事件组的使用。特别强调了RTOS调度策略和任务间通信的高效实现。
摘要由CSDN通过智能技术生成

1.占用资源

ram占用情况 

项目使用的字节
调度器自身236 字节(很容易通过使用较小的数据类型降低)。
每创建一个队列,会增加76 字节和队列存储区域(请参阅常见问题:为什么队列占用这么多 RAM?)
每创建一个任务,会增加64 字节(包括任务名称使用的 4 个字符)和任务堆栈大小。

 flash占用情况

RTOS 内核自身需要 5 到 10 KB 的 空间。

2. 任务

使用 RTOS 的实时应用程序可以被构建为一组独立的任务。

在任何时间点,应用程序中只能执行一个任务,实时 RTOS 调度器负责决定所要执行的任务。

协程实际上仅用于RAM具有严重RAM限制的非常小的处理器,这种情况下其实应该考虑自己实现一些代码框架,而不是依赖freertos.

2.1 任务状态:

  • 运行 :当任务实际执行时,它被称为处于运行状态。 任务当前正在使用处理器。
  • 准备就绪:(它们不处于阻塞或挂起状态), 但目前没有执行的任务, 因为同等或更高优先级的不同任务已经处于运行状态。
  • 阻塞:如果任务当前正在等待时间或外部事件,则该任务被认为处于阻塞状态。 例如,如果一个任务调用vTaskDelay(),它将被阻塞(被置于阻塞状态), 直到延迟结束-一个时间事件。 任务也可以通过阻塞来等待队列、信号量、事件组、通知或信号量 事件。 处于阻塞状态的任务通常有一个"超时"期, 超时后任务将被超时,并被解除阻塞, 即使该任务所等待的事件没有发生。

    “阻塞”状态下的任务不使用任何处理时间,不能 被选择进入运行状态。

  • 挂起:与“阻塞”状态下的任务一样, “挂起”状态下的任务不能 被选择进入运行状态,但处于挂起状态的任务 没有超时。 相反,任务只有在分别通过 vTaskSuspend() 和 xTaskResume() API 调用明确命令时 才会进入或退出挂起状态。

 2.2 空闲任务

        RTOS 调度器启动时,自动创建空闲任务,以确保始终 存在一个能够运行的任务。 它以最低优先级创建,以确保 如果有更高的优先级应用程序任务处于准备就绪状态,则不使用任何 CPU 时间。

        空闲任务负责释放 RTOS 分配给 自此被删除的任务的内存。

2.3 空闲任务钩子

        是一个用户可定义的函数,用于在系统空闲时执行一些特定的任务或操作。空闲任务钩子函数是在 FreeRTOS 的空闲任务中执行的,因此系统在没有其它任务需要执行时会调用空闲任务钩子函数,以充分利用系统空闲时间。

空闲任务钩子通常用于以下一些场景:

  1. 性能统计 2.低功耗操作 3.周期性任务 4.系统维护

2.4 默认 RTOS 调度策略(单核)

FreeRTOS 默认使用固定优先级的抢占式 调度策略,对同等优先级的任务执行时间片轮询调度:

  • “固定优先级” 是指调度器不会永久更改任务的优先级, 尽管它可能会因 优先级继承而暂时提高任务的优先级。
  • “抢占式调度” 是指调度器始终运行优先级最高且可运行的 RTOS 任务, 无论任务何时能够运行。例如, 如果中断服务程序 (ISR) 更改了优先级最高且可运行的任务, 调度器会停止当前正在运行的低优先级任务 并启动高优先级任务——即使这发生在同一个时间片内 。此时,据说高优先级任务 “抢占”了低优先级任务。
  • “轮询调度” 是指具有相同优先级的任务轮流进入运行状态。
  • “时间片” 是指调度器会在每个 tick 中断上在同等优先级任务之间进行切换, tick 中断之间的时间构成一个时间片。tick 中断是 RTOS 用来衡量时间的周期性中断。

3.任务间通信(liunx中也作为线程间通信)

3.1 任务通知数组

3.2 互斥锁

        互斥锁是包含优先级继承机制的二进制信号量。 二进制信号量 能更好实现实现同步(任务间或任务与中断之间), 而互斥锁有助于更好实现简单互斥(即相互排斥)。

3.3 信号量

        通常可以用任务通知数组来实现

3.4 队列

        队列是任务间通信的主要形式。 它们可以用于在任务之间以及中断和任务之间发送消息。 在大多数情况下,它们作为线程安全的 FIFO(先进先出)缓冲区使用,新数据被发送到队列的后面, 尽管数据也可以发送到前面。        

3.5 事件

事件组是一组二进制标志(或位), 应用程序编写者可以对其中的每一个指定含义。 RTOS 任务可以 进入“阻塞”状态以等待组内的一个或多个标志激活。 待验证的 RTOS 任务处于“阻塞”状态时不会占用任何 CPU 时间。

当使用任务通知代替事件组时,接收任务的 通知值被用于代替 事件组,接收任务通知值中的位被用作 事件标志,而 xTaskNotifyWait() API 函数被用于代替事件组的 xEventGroupWaitBits () API 函数。

同样,使用 xTaskNotify() 和 xTaskNotifyFromISR() API 函数(其 eAction 参数设置为 eSetBits)来分别代替 xEventGroupSetBits () 和 xEventGroupSetBitsFromISR () 函数,从而设置位。

与 xEventGroupSetBitsFromISR() 相比,xTaskNotifyFromISR() 具有显著的性能优势, 这是因为 xTaskNotifyFromISR () 完全在 ISR 中执行,而 xEventGroupSetBitsFromISR () 必须将一些处理推迟到 RTOS 守护进程任务中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值