200字
基础知识(任务调度&任务状态)
2023-12-07
2026-03-23

内容:任务调度&任务状态

02-FreeRTOS基础知识(课堂总结).pdf

任务调度(熟悉)

1、什么是任务调度器

答:任务调度器就是使用相关的调度算法来决定当前需要执行的哪个任务。

2、FreeRTOS 一共支持三种任务调度方式:

抢占式调度:主要是针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务

image

时间片调度:主要针对优先级相同的任务,当多个任务的优先级相同时, 任务调度器会在每一次系统时钟节拍到的时候切换任务。

image

协程式调度(合作式):当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务,FreeRTOS现在虽然还支持,但是官方已经表示不再更新协程式调度

image

二、任务状态( 熟悉)

FreeRTOS中任务共存在4种状态:

  1. 运行态(Running):正在执行的任务,该任务就处于运行态,注意在STM32中,同一时间仅一个任务处于运行态

  2. 就绪态(Ready):如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态

    任务创建后就处于就绪状态。当满足运行条件后切入运行态。

    主动让出CPU使用权方式主要有两种,执行vTaskSuspend进入挂起状态,执行阻塞类函数进入阻塞状态

  3. 阻塞态(BlockingFunction):

    如果一个任务因延时或等待外部事件发生,那么这个任务就处于阻塞态

    阻塞状态就是任务暂时被动让出CPU的使用权,处于一种等待的状态。

    BlockingFunction主要有两种;时间延迟函数和进程间通信的事件请求函数

  4. 挂起态(Suspended):类似暂停,调用函数 vTaskSuspend() 进入挂起态,需要调用解挂函数vTaskResume() 才可以进入就绪态

阻塞状态与挂起状态的区别在于:阻塞状态在条件满足的情况下可自动进入就绪态再次参与调度,挂起状态属于被动行为,无法自动进入就绪状态,需要在其他任务调用vTaskResume()函数使其进入就绪状态。

image

这四种状态中,除了运行态,其他三种任务状态的任务都有其对应的任务状态列表

就绪列表pxReadyTasksLists[x] ,其中x代表任务优先级数值 x:{0-31}

阻塞列表pxDelayedTaskList

挂起列表xSuspendedTaskListimage

调度器就是使用相关的调度算法来决定当前需要执行的任务

调度器总是在所有处于就绪列表的任务中,选择具有最高优先级的任务来执行

多个任务,不同优先级则是抢占式度,相同优先级的任务为时间片调度

任务优先级,数字越小优先级越低

知识补充

栈和堆

stm32 的 栈是向下生长

	堆是向上生长

堆和栈的地址生长方向

答:

的生长方向向上,内存地址由低到高;

的生长方向向下,内存地址由高到低。

压栈和出栈的地址增长方向

答:堆栈的生长方向从最本质的理解是堆栈入栈方向是从高地址向地址还是低地址向高地址。

从高地址向低地址生长一般叫做向下生长,也叫作逆向生长。

从低地址向高地址生长一般叫做向上生长,也叫作正向生长。

一般来说堆栈是逆向生长的。

  • 51单片机的堆栈生长方向为正向生长,因为执行PUSH指令时先将SP的值加1再将指定的8位数据单元的内容入栈。
  • 80x86微机的堆栈生长方向为逆向生长,因为执行PUSH指令时先将SP的值减2再将指定的16位数据单元内容入栈。高字节放高地址,低字节放低地址(小端模式)。
  • ** STM32的堆栈生长方向是逆向生长。 **

注意:C语言中传递参数,一般是从右向左入栈的,所以最左边的参数是最先出栈的。

单位

1s = 1000ms

1ms = 1000us

1us = 1000ns

1Mhz = 1000 000hz

hz转换为s公式:1s = 1/(1hz)

例如:10hz等于0.1s (0.1s = 1 / 10hz)。

评论