1 FreeRTOS任务基础

  • 1.1 多任务系统
    在51单片机、AVR、STM32裸机编程时,我们通常都是用一个main函数里面加一个while(1)做一个大循环来完成所有的事务处理,同时在加上中断处理一些较为紧急的事务。相对于多任务系统而言,这个就是单任务系统,也称作前后台系统,中断服务函数
    作为前台程序,大循环while(1)作为后台程序,如图 1.1.1 所示:

    图1.1.1 前后台系统
    前后台系统的实时性较大(尤其是调度任务较多),每个任务都是轮流执行,没有轮到该任务运行的时候,不管该任务有多么的紧急,就只能等着,大家拥有一样的优先级。但是该类系统简单,所消耗的资源较少。
    多任务系统可以将一个大问题分成很多个具有共性的小问题,逐一的将这些小问题解决,进而大问题将得到全面的解决,我们可将每一个小问题都视为一个任务。这些小任务是并发处理的,由于他们的执行时间很短,我们所能感觉到的是所有的任务都是同时进行的。那么多任务运行的问题就来了,这就涉及到任务执行的先后顺序及什么任务该执行不该执行了。该模块的功能将由任务调度器来完成,具体如何实现,各类系统是有很大差别的,通常来说我们可分为抢占式(UCos、FreeRTOS)和非抢占式(Linux)。FreeRTOS是一个支持抢占式的实时操作系统,其任务运行如图1.1.2所示:

    图1.1.2 抢占式多任务系统

  • 1.2 FreeRTOS任务
    在使用RTOS的时候一个实时应用可以一个独立的任务,每个任务都有自己的运行环境,CPU在任一时间点只能运行一个任务,具体运行哪一个任务将由任务调度器决定。因此,任务调度器将会不断的开启和关闭任务,任务无需了解RTOS调度器的行为,RTOS调度器的功能是确保一个任务在开始执行的时候与上一次退出的时候的运行环境相同(寄存器值、堆栈内容等),这就是上下文切换(Linux中将该过程称为:进程上下文切换)。学过Linux的就会很清楚的知道每一个进程都拥有自己的堆栈,RTOS也是一样,每一个任务都拥有自己独立的堆栈,当任务发生切换时任务调度器就会将其上下文环境保存在堆栈中,等到该任务拿到CPU的使用权时再从其堆栈中取出所保存的上下文环境,继续运行该任务。
    RTOS的任务特性:
    任务简单,相对于Linux来说该类任务简单很多;
    没有使用限制,任务可以运行无数次;
    支持抢占和优先级;
    每个任务都拥有独立的堆栈,导致RAM必须较大;

  • 1.3 FreeRTOS任务状态
    FreeRTOS中的任务状态有运行态、就绪态、阻塞态、挂起态,但任一任务只能处于这几种状态中的一个。

  • 1.3.1 运行态
    当一个任务正在运行时(这一时刻该任务的代码在CPU中执行),那么该任务就处于运行态。如果所使用的是单核CPU,那么不管任何时刻只有一个任务处于运行态,这就证明了CPU在某一时刻只能被一个任务拿到使用权。

  • 1.3.2 就绪态
    就绪态是指那些已经准备好了的任务,可以随时拿到CPU的使用权,进而进入运行态,但是此时此刻该状态的任务还没有执行,主要是因为当前有一个同优先级或者更高优先级的任务正在运行。

  • 1.3.3 阻塞态
    如果一个任务当前正在等待某一外部事件的发生所处于的状态,如:任务正在等待队列、信号量、事件组等都会进入阻塞态。任务进入阻塞态是有一定的时间限制,当超时等待时,该任务将退出阻塞态,进入就绪态,等待拿到CPU的使用权,进入运行态。

  • 1.3.4 挂起态
    任务进入挂起的状态和阻塞态一样,将不会被任务调度器所调用,但是出于挂起态的任务是没有超时的问题。在FreeRTOS中,任务进入和退出挂起态只能通过调用VTaskSuspend()和xTaskReume()。

    图1.3.1 任务状态间的转换

  • 1.3.5 任务优先级
    FreeRTOS中每一个任务都可以都可以分配从 0~(configMAX_PRIORITIES-1) 的 优 先 级 ,configMAX_PRIORITIES 在文件 FreeRTOSConfig.h 中有定义。如果所使用的硬件平台支持类似计算前导零这样的指令(可以通过该指令选 择 下 一 个 要 运 行 的 任 务 , Cortex-M 处 理 器 是 支 持 该 指 令 的 ) , 并 且 宏configUSE_PORT_OPTIMISED_TASK_SELECTION 也 设 置 为 了 1 , 那 么 宏configMAX_PRIORITIES 不能超过 32!也就是优先级不能超过 32 级。其他情况下宏configMAX_PRIORITIES 可以为任意值,但是考虑到 RAM 的消耗,宏 configMAX_PRIORITIES最好设置为一个满足应用的最小值。
    优先级的数字越低表示任务的优先级越低,0的任务优先级最低,configMAX_PRIORITIES-1的优先级最高。空闲任务的优先级最低,为0。

  • 1.3.6 任务控制块
    任务控制块(Task Contrl Block,简称TCB),FreeRTOS的每一个任务都有一些属性需要存储,所有的信息将存储在一个结构体中,该结构体叫做任务控制块:TCB_t,在使用xTaskCreate()创建任务时将会自动给每一个任务分配一个任务控制块,此结构体在文件task.c中有定义,具体成员如下:

      typedef struct tskTaskControlBlock{volatile StackType_t  *pxTopOfStack;              //任务堆栈栈顶#if ( portUSING_MPU_WRAPPERS == 1 )xMPU_SETTINGS xMPUSettings;            //MPU 相关设置#endifListItem_t  xStateListItem;                     //状态列表项ListItem_t  xEventListItem;                  //事件列表项UBaseType_t uxPriority;                          //任务优先级StackType_t *pxStack;                        //任务堆栈起始地址char pcTaskName[ configMAX_TASK_NAME_LEN ];   //任务名字#if ( portSTACK_GROWTH > 0 )StackType_t *pxEndOfStack;                 //任务堆栈栈底#endif#if ( portCRITICAL_NESTING_IN_TCB == 1 )UBaseType_t uxCriticalNesting;              //临界区嵌套深度#endif#if ( configUSE_TRACE_FACILITY == 1 ) //trace 或到 debug 的时候用到UBaseType_t uxTCBNumber; UBaseType_t uxTaskNumber; #endif#if ( configUSE_MUTEXES == 1 )UBaseType_t uxBasePriority;       //任务基础优先级,优先级反转的时候用到UBaseType_t uxMutexesHeld;          //任务获取到的互斥信号量个数#endif#if ( configUSE_APPLICATION_TASK_TAG == 1 )TaskHookFunction_t pxTaskTag;#endif#if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) //与本地存储有关Void *pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ];#endif#if( configGENERATE_RUN_TIME_STATS == 1 )uint32_t ulRunTimeCounter;           //用来记录任务运行总时间#endif#if ( configUSE_NEWLIB_REENTRANT == 1 )struct  _reent xNewLib_reent;                   //定义一个 newlib 结构体变量#endif#if( configUSE_TASK_NOTIFICATIONS == 1 )     //任务通知相关变量volatile uint32_t ulNotifiedValue;                //任务通知值volatile uint8_t ucNotifyState;                      //任务通知状态#endif#if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )// 用来标记任务是动态创建的还是静态创建的,// 如果是静态创建的此变量就为 pdTURE,// 如果是动态创建的就为 pdFALSE uint8_t  ucStaticallyAllocated;#endif#if( INCLUDE_xTaskAbortDelay == 1 )uint8_t ucDelayAborted;#endif} tskTCB;
    

FreeRTOS学习(一)相关推荐

  1. freertos 创建互斥量_STM32CubeMX+FreeRTOS学习[6] 互斥量(Lu)

    FreeRTOS 学习之六:互斥量 前提:默认已经装好 MDK V5 和 STM32CubeMX ,并安装了 STM32F1xx 系列的支持包. 硬件平台: STM32F1xx 系列. 目的:学习互斥 ...

  2. FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析

    FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析 怎么查找就绪任务中优先级最高的? tasks.c中声明了一个全局变量 uxTopReadyPriority,任务从其他状态进入就绪 ...

  3. freeRtos学习笔记 (9) 移植和CPU利用率统计

    freeRtos学习笔记 (9) 移植和CPU利用率统计 使用官方固件移植 首先准备一个能跑的裸机工程 注意,freertos需要使用systick定时器,而stm32HAL库默认使用systick作 ...

  4. freeRtos学习笔记 (8) 任务通知

    freeRtos学习笔记 freeRtos任务通知 任务通知的优缺点 freeRtos任务控制块中包含两个32位的变量,用于任务通知,在一些情况下,任务通知可以替代信号量和事件组,并且比信号量和事件组 ...

  5. freeRtos学习笔记 (7)信号量

    freeRtos学习笔记 freeRtos信号量 信号量种类 信号量分为四种:二值信号量,互斥信号量,计数信号量和递归互斥信号量,其中计数信号量用于管理系统多个共享资源,用计数值表示可用资源数目;二值 ...

  6. freeRtos学习笔记 (6)软件定时器

    freeRtos学习笔记 freeRtos软件定时器 软件定时器需要注意事项 软件定时器的精度基于时钟节拍,例如系统时钟节拍为10ms, 软件定时器定时时间必须是10ms的整数倍,因此软件定时器一般用 ...

  7. freeRtos学习笔记 (5)事件组

    freeRtos学习笔记 freeRtos事件组 为什么要用事件组? 多任务环境下, 任务.中断之间往往需要同步操作,一个事件发生会告知等待中的任 务,即形成一个任务与任务.中断与任务间的同步.事件可 ...

  8. freeRtos学习笔(4)消息队列

    freeRtos学习笔记 freeRtos消息队列 为什么要用消息队列 消息队列可以在任务与任务间,中断与任务间传递信息.为什么不用全局数组?全局数组也可以传递信息,但是和消息队列相比,消息队列有一下 ...

  9. freeRtos学习笔(3)临界区管理

    freeRtos学习笔记 freeRtos临界区管理 freeRtos临界区 代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行不被中断,在进入临界段之前须 ...

  10. freeRtos学习笔(2)任务管理

    freeRtos学习笔记 freeRtos任务管理 freeRtos任务状态 freeRtos中任务有四种状态:就绪态.运行态.杜塞态.挂起态. 图 16-1(1): 创建任务→就绪态(Ready): ...

最新文章

  1. 事件相机特征跟踪-概率数据关联法
  2. Spring Cloud Netflix Zuul中的速率限制
  3. hive读取hdfs存放文件_Hive基本概念
  4. 机器学习知识点(十八)密度聚类DBSCAN算法Java实现
  5. 算法训练之STL使用汇总
  6. d.ts文件可以注释html吗,如何编写一个d.ts文件的步骤详解_旧店_前端开发者
  7. ThinkPHP6内核学生成绩管理系统源码 内附安装说明
  8. python中的import详解_如何在python中import
  9. 优秀案例UI素材模板|深层解析iPhone手机APP页面怎么设计?
  10. pymongo 怎么判断数据有没有添加成功_Python爬虫入门教程 29-100 手机APP数据抓取 pyspider...
  11. 《语音信号处理》 语音识别章节 读书笔记
  12. 计算机应用专业配置标准,计算机应用专业技能抽查考试标准.doc
  13. 机器学习之重温线性代数
  14. 什么是迭代计算机编程,什么是递归?什么是迭代?
  15. 使用openSSL制作SSL证书
  16. 微信小程序表白墙管理系统带后端带说明
  17. c语言多进程之进程间通信IPC:信号操作函数之signal,kill
  18. 硬件加速不支持的问题
  19. 计算机在英语写作中应用,多媒体计算机技术在初中英语写作中应用.doc
  20. MacOS下安装及配置Maven

热门文章

  1. SpringBoot实现文件上传和下载
  2. Ubuntu20.04安装NVIDIA显卡驱动、CUDA、CUDNN及突破NVENC并发限制
  3. 一个花里胡哨的渐变雷达图 echarts图表
  4. loj #6570. 毛毛虫计数
  5. Linux常用命令——screen命令
  6. 修复ASUS in WinRE教程
  7. MySQL攻略(2)
  8. (QT)qss与按钮
  9. 端口Banner信息的获取
  10. 4月5号-4月11号