1. 任务状态的切换

FreeRTOS中任务的状态可分为:未创建态、就绪态、运行态、挂起态、延时态五种状态。

a: 调用xTaskCreate()函数将新建一个任务,新建的任务会加入到就绪列表,若新建的任务的优先级足够高,调度器会立即将CPU资源分配给他,使它进入运行态

b: 调度器检查就绪列表中优先级高的任务,并将CPU资源分配给它,使他进入运行态

c: 运行态的任务可能创建/恢复了新的更高优先级的任务,或者因其操作了某事件(如发送了一个更高优先级的任务需要的消息),使更高优先级的任务进入了就绪表时,再或者更高优先级的任务延时到期自动加入就绪表时,更高优先级的任务将得到CPU资源,使当前运行的任务重新进入就绪态(虽然他还在就绪列表,但由于优先级低,而不被分配CPU资源)。

d: 任务对申请处理的事件操作成功、或者处理失败但发起获取申请时设置阻塞时间为0,将继续保留CPU资源,继续运行。

e: 正在运行的任务(毫无疑问,此时它是就绪表中优先级最高的任务之一),可能想要处理一个事件(如想获取一条消息队列中的消息),此时它将向事件资源管理者(即消息队列)发起申请。如使用以下函数尝试获取队列中的一条消息:

xQueueReceive( QueueHandle_t xQueue,void * pvBuffer,TickType_t xTicksTowait );

f: 任务对申请处理的事件操作失败、并且发起获取申请时设置阻塞时间大于0,则任务会从就绪列表,加入到阻塞延时列表;在等待期间尝试操作事件成功。

n: 运行态的任务调用vTaskDelay(),将把自己从就绪列表搬移到主动延时列表,并让就绪表的其他任务获取CPU资源。

h: 延时态的任务在延时结束时,若优先级比当前任务优先级高,就加入就绪队列,并立即获得CPU资源,进入运行。

g: 延时态的任务在延时结束时,若优先级比当前任务优先级低,就加入就绪队列,但是由于优先级不够,只能等待获取CPU资源。

i: 处于就绪态的任务被正在执行的高优先级的任务挂起,将从就绪列表加入到挂起列表,注意,在挂起列表中的任务,是被打入“冷宫”的任务,除非程序员在写代码时主动调用vTaskResume ()恢复该任务,否则该该任务永远不会回到就绪列表了,更不会被执行。

j: 运行态的任务,主动调用vTaskSuspend()函数挂起自己,将使自己从就绪列表加入挂起列表,并立即执行就绪列表中优先级高的其他任务。

k: 挂起态的任务,不会获得CPU资源了,因此只能等待被正在运行的任务(或中段)唤醒。m: 同上,被唤醒的任务会被从挂起列表加入到就绪列表,若被唤醒的任务的优先级比当前正在运行的任务优先级高,就立即将CPU资源分配给被唤醒的任务。

当然,我们还可以使用vTaskDelete()函数删除一个任务,删除一个任务会将该任务变为未创建态(它什么资源都没有了),除非重新调用vTaskCreat()函数重建它,否则永远不会加入到就绪列表了。

特别地,挂起一个处于延时态的任务会是什么情况,可以再具体讨论。

2.运行态的任务触发切换的情况总结

a. 正在运行的任务,触发调度器工作的途径有:(但凡有可能引出高优先级任务或中断的操作都会触发调度器检查)

1.创建新任务(显然,新建任务可能比自身的优先级高,因此可能触发调度器)

2.挂起自己、删除自己(往往代表我执行完了)、阻塞延时自己、普通延时自己

3.解阻塞高优先级任务、或触发中断(中断中解阻塞一些高优先级任务)

4.高优先级任务自动就绪(主要指高优先级任务延时结束,定时器任务,定时器任务优先级较  高的情况下,若定时溢出,将抢占CPU)

5.恢复一个挂起的高优先级任务。

b. 中断中触发调度器工作的途径有:(但凡有可能使高优先级任务就绪的操作都会触发调度器检查)

1.在中断处理函数中创建新的高优先级任务

2.在中断中释放信号量、消息等使高优先级任务解除阻塞进入就绪。

3.恢复优先级高的任务

3.任务优先级分配方案

对于初学者,有时候会纠结任务优先级设置为多少合适,因为任务优先级设置多少是没有标准的。对于这个问题,我们这里为大家推荐一个标准,任务优先级设置推荐方式如下图13.1 所示:

 IRQ 任务:IRQ 任务是指通过中断服务程序进行触发的任务,此类任务应该设置为所有任务里面优先级最高的。

 高优先级后台任务:比如按键检测,触摸检测,USB 消息处理,串口消息处理等,都可以归为这一类任务。

 低优先级的时间片调度任务:比如 emWin 的界面显示,LED 数码管的显示等不需要实时执行的都可以归为这一类任务。 实际应用中用户不必拘泥于将这些任务都设置为优先级 1 的同优先级任务,可以设置多个优先级,只需注意这类任务不需要高实时性。
 空闲任务:空闲任务是系统任务。
 特别注意:IRQ 任务和高优先级任务必须设置为阻塞式(调用消息等待或者延迟等函数即可),只有这样,高优先级任务才会释放 CPU 的使用权,,从而低优先级任务才有机会得到执行。
这里的优先级分配方案是我们推荐的一种方式,实际项目也可以不采用这种方法。 调试出适合项目需求的才是最好的。

4. 中断优先级和任务优先级区别

部分初学者也容易在这两个概念上面出现问题。 简单的说,这两个之间没有任何关系,不管中断的优先级是多少,中断的优先级永远高于任何任务的优先级,即任务在执行的过程中,中断来了就开始执行中断服务程序。
        另外对于 STM32F103,F407 和 F429 来说,中断优先级的数值越小,优先级越高。 而 FreeRTOS的任务优先级是,任务优先级数值越小,任务优先级越低。

[FreeRtos]任务状态切换和优先级设置相关推荐

  1. Android系统中的屏幕状态切换以及亮度设置

    Android系统的状态包括wake.earlysuspend以及suspend状态,其使用锁和定时器来进行状态的切换. 而在wake状态,屏幕首先是调至设定的亮度,如果没有其他动作,当经过一段时间后 ...

  2. Java 线程实例一(查看线程是否存活、获取当前线程名称、状态监测、线程优先级设置、死锁及解决方法、获取线程id、线程挂起)

    查看线程是否存活 以下实例演示了如何通过继承 Thread 类并使用 isAlive() 方法来检测一个线程是否存活: public class TwoThreadAlive extends Thre ...

  3. PDPS软件:机器人点焊伺服焊枪大开、小开、关闭状态切换设置

    本文已经首发在个人微信公众号:工业机器人仿真与编程(微信号:IndRobSim),欢迎关注! 在机器人点焊工艺中,为了缩小焊枪的无效开合时间,通常会设置点焊焊枪的大开.小开和关闭三种工作状态,大开状态 ...

  4. java不同进程的相互唤醒_Java线程生命周期与状态切换

    前提 最近有点懒散,没什么比较有深度的产出.刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期.状态切换以及线程的上下文切换等等.编写本文的时候, ...

  5. 详解Java线程生命周期与状态切换

    前提 最近有点懒散,没什么比较有深度的产出.刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期.状态切换以及线程的上下文切换等等.编写本文的时候, ...

  6. Java线程生命周期与状态切换

    前提# 最近有点懒散,没什么比较有深度的产出.刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期.状态切换以及线程的上下文切换等等.编写本文的时候 ...

  7. 在freertos中因为定时器任务优先级的问题导致定时器无法正常运行的问题

    在freertos中用到了软件的定时器,但是发现启动某个任务后导致定时器不能正常启动,经排查发现是定时器任务的优先级太低,在另外一个任务中有一段for的死循环,导致定时器Daemon线程无法被调度所以 ...

  8. QT实现窗口置顶、置顶状态切换、多窗口置顶优先关系

    我们使用QT进行界面开发时,可能会遇到需要将窗口置顶的情况.最常见的就是,需要制作一个悬浮工具栏,悬浮菜单,甚至是悬浮的画板.这就意味这我们需要将这个窗口置顶于"系统"以及我们自己 ...

  9. linux设置进程优先级,Linux线程属性及优先级设置

    POSIX.1线程属性及优先级设置 By zieckey All Right Reserved 线程的属性由pthread_attr_t结构类型表示. 在使用pthread_attr_t之前,需要调用 ...

最新文章

  1. 优雅的理解 call 和 apply 的使用方法
  2. php long2ip,php ip2long和long2ip函数实现
  3. C#使用SQL语句时候的万用密码问题
  4. [置顶] 分步实现具有分页功能的自定义DataList控件【附源代码】
  5. tar:file-changed-as-we-read-it报错处理
  6. mysql json invalid json text_MySQL 5.7新增加的json数据类型
  7. 如何证明CRM WebClient UI上的应用是有状态(Stateful)的
  8. Mac OS X下查看CPU信息
  9. vue2.0 element学习
  10. MATLAB —— 低通滤波器设计与信号滤波
  11. pdf 分形 张济忠_分形理论及其研究方法.pdf
  12. 操作rabbitMQ时,误删guest账户,无法登录
  13. elastic APM 简单使用
  14. MR:二:什么是MR混合现实技术?
  15. 基于ATMEGA16单片机,MQ-3酒精传感器,LCD1602液晶显示的酒精浓度检测阈值报警仪
  16. 笔记本电脑频繁假死的一个解决办法
  17. 阿里云短信服务不对个人开放?如何在阿里云市场免费购买短信服务?云市场购买到的短信服务如何使用?(以谷粒学院项目为例)
  18. 留痕笔记2.0升级到delphi11踩过的坑
  19. 《给青年的十二封信》1-谈读书—朱光潜
  20. Shogun网站上的关于主流机器学习工具包的比较

热门文章

  1. 加入windows7 正版大家庭
  2. 【设计模式】一:六大基本原则详解
  3. 烤仔观察 | 哈耶克最后的预言
  4. JavaScript 有趣的冷知识:tagged template literals
  5. 黄宇清 java_二面笔记 2015.9.19
  6. 2-9 CSS动画案例:跳动的心
  7. 自学SQL网题库答案
  8. 用python玩转数据测试与作业_用python玩转数据-实验5
  9. Paper Reading(1) : ICLR2015_Explaining and Harnessing Adversarial Examples
  10. java76-GUL单选按钮和复选按钮