3.7 FreeeRTOS----不运行状态

        到目前为止,创建的任务一直都有进行处理,从来没有必要等待任何事情,因为它们不必等待任何东西,它们总是能够进入运行状态。这种“连续处理”任务的有用性有限,因为它们只能以最低优先级创建。如果它们以任何其他优先级运行,它们将防止优先级更低的任务完全运行。

        为了使任务变得有用,它们必须重写为事件驱动。事件驱动的任务只有在触发事件的事件发生后才能执行(处理),并且在该事件发生之前不能进入运行状态。调度程序总是选择能够运行的最高优先级任务。高优先级任务无法运行意味着调度程序不能选择它们,而是选择能够运行的较低优先级的任务。因此,使用事件驱动的任务意味着可以以不同的优先级创建任务,而没有最高优先级的任务使处理时间的所有较低优先级任务变得饥饿。

阻塞状态(Block)

        正在等待事件的任务被称为处于“已阻止”状态,这是“不运行”状态的子状态。

        任务可以进入阻止状态等待两种不同类型的事件:

  1. 时间(时间相关)事件 - 事件是延迟期到期或绝对时间到达。例如,任务可能进入阻塞状态等待10毫秒。
  2. 同步事件 - 事件来自另一个任务或中断。例如,任务可以进入阻塞状态以等待数据到达队列。同步事件涵盖广泛的事件类型。
        FreeRTOS队列,二进制信号量,计数信号量,互斥体,递归互斥体,事件组和直接任务通知均可用于创建同步事件。

        一个任务可以用一个超时来阻止同步事件,同时有效地阻止这两种类型的事件。例如,任务可以选择等待最多10毫秒的数据到达队列。如果任何一个数据在10毫秒内到达,或10毫秒内没有数据到达,任务将离开阻塞状态。

暂停、挂起(Suspended)

        “暂停”也是不运行的子状态。 挂起状态的任务对调度程序不可用。 进入暂停状态的唯一方法是通过调用vTaskSuspend()API函数,离开暂停状态的唯一方法是通过调用vTaskResume()或xTaskResumeFromISR()API函数。 大多数应用程序不使用暂停状态。

就绪(Ready)

       处于非运行状态但未被阻止或暂停的任务据说处于就绪状态。 他们能够运行,处于“准备”运行,但目前不处于运行状态。

状态转换图

        图15展开了先前的过度简化状态图,以包括本节中描述的所有不运行子状态。 迄今为止在示例中创建的任务没有使用被阻止或已暂停的状态; 它们只在就绪状态和运行状态之间进行转换 - 由图15中的粗线突出显示。









FreeRTOS 是一个实时操作系统(RTOS),它支持多种硬件平台和处理器架构。在 FreeRTOS 中,硬件定时器通常用于实现操作系统的定时功能,如时间片轮转调度、延时函数等。如果 FreeRTOS任务没有进入硬件定时器中断,可能是由于以下几个原因: 1. 定时器未正确配置:硬件定时器需要被正确配置才能产生中断。如果定时器配置不正确,例如时钟源没有选择、中断使能未开启、定时器未启动或者定时器的重载值设置错误等,都会导致定时器中断无法发生。 2. 中断优先级问题:在某些微控制器中,如果中断优先级设置不当,可能会导致定时器中断被更高优先级的中断屏蔽掉。检查当前系统中是否配置了其他高优先级中断,或者是否在中断服务程序中执行了过多的操作,导致定时器中断被延迟处理。 3. FreeRTOS 系统时钟未启用:在 FreeRTOS 中,系统时钟通常依赖于硬件定时器中断来更新。如果没有启用 FreeRTOS 的系统时钟(如通过 `vTaskStartScheduler` 启动调度器),则定时器中断可能不会用于调度任务,从而看起来像是没有进入硬件定时器中断。 4. 中断处理函数未正确编写:如果硬件定时器中断发生,但是其中断处理函数没有正确处理或者调用 FreeRTOS 的相关函数(如 `xTaskIncrementTick`),则不会触发任务切换。 5. 调试器或系统问题:如果在调试过程中硬件中断被调试器中断,或者硬件问题导致中断无法正常触发,也可能出现不进入硬件定时器中断的现象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值