任务的调度 和 任务的状态

FreeRTOS是一个实时操作系统,采用抢占式调度,高优先级任务可抢占低优先级任务。任务有运行、就绪、阻塞和挂起四种状态。例如,任务调用Delay时会进入阻塞态,让高优先级任务执行。系统通过vTaskStartScheduler()或封装后的osKernelStart()启动调度。

任务的调度

Q: 什么是任务调度?

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

FreeRTOS中开启任务调度的函数是 vTaskStartScheduler() ,但在 CubeMX 中被封装为 osKernelStart()

这个“osKernelStart()”就是在main.c中main函数中,FreeRTOS系统初始化之后执行的函数:

 同时注意系统生成的注释:当FreeRTOS被使用时,程序永远不会执行到main函数的while(1)循环中,因为此时程序已经由FreeRTOS的任务调度器所掌权了。

FreeRTOS的任务调度

FreeRTOS 是一个实时操作系统,它所奉行的调度规则:

  • 高优先级抢占低优先级任务,系统永远执行最高优先级的任务(即抢占式调度)
  • 同等优先级的任务轮转调度(即时间片调度)

还有一种调度规则是协程式调度,但官方已明确表示不更新,主要是用在小容量的芯片上,用得 也不多。

抢占式调度运行过程

Q:Task3为什么会发生阻塞?

A:比如Task3调用Delay函数的时候,就会发送阻塞

  • 高优先级任务,优先执行
  • 高优先级任务不停止,低优先级任务无法执行
  • 被抢占的任务将会进入就绪态

时间片调度运行过程

  • 同等优先级任务,轮流执行,时间片流转
  • 一个时间片大小,取决为滴答定时器中断周期
  • 注意没有用完的时间片不会再使用,下次任务 Task3 得到执行,还是按照一个时间片的时钟 节拍运行(假如一个时间片1秒,Task3运行到0.5秒的时候发送了阻塞,那就会去直接执行下一个任务,当再次轮转到Task3时,会从0秒重新计时运行1秒

任务的状态

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

Running 运行态

当任务处于实际运行状态称之为运行态,即CPU的使用权被这个任务占用(同一时间仅一个任务处于运行态)。

Ready 就绪态

处于就绪态的任务是指那些能够运行(没有被阻塞和挂起),但是当前没有运行的任务,因为同优先级或更高优先级的任务正在运行。

Blocked 阻塞态

如果一个任务因延时,或等待信号量消息队列事件标志组等而处于的状态被称之为阻塞态。

Suspended 挂起态

类似暂停,通过调用函数 vTaskSuspend() 对指定任务进行挂起,挂起后这个任务将不被执行, 只有调用函数 xTaskResume() 才可以将这个任务从挂起态恢复

 

  • 仅就绪态可转变成运行态
  • 其他状态的任务想运行,必须先转变成就绪态 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值