FreeRTOS基础知识学习笔记

         先说RTOS,在以前单片机中要执行完上一个程序才会执行下一个程序(当然有中断来临会先执行中断程序),在RTOS中会将两个程序交叉进行。比如,写作业和锻炼在单片机中写作业时锻炼是没有执行的,或者锻炼时没有写作业(可以看出这种的cpu效率不高,不是那么实时)。在RTOS中会将写作业和锻炼交叉进行(这种运行效率大大提高,实时性较好)。RTOS是实时操作系统,具有即时响应和高可靠性的特点,而且任务间独立性高,低耦合。  RTOS操作系统:FreeRTOS、UCOS、RTX、RT—Thread、DJYOS等。

  一、FreeRTOS的任务

       多任务系统将一个大问题分解成小问题分别解决(小任务是并行处理,指的是小任务之间运行速度快好像一块处理实际上一个时间只能运行一个任务),任务调度器负责任务执行的顺序,不同的系统其任务调度器的实现方法也不同。FreeRTOS 是一个抢占式的实时多任务系统, 其任务调度器也是抢占式的。

FreeRTOS基础知识学习笔记_第1张图片

 上图为正点原子FreeRTOS教程中,FreeRTOS会有一个任务优先级高优先级会打断低优先级任务抢占CPU的使用权(每 个 任 务 都 可 以 分 配 一 个 从 0~(configMAX_PRIORITIES-1) 的 优 先 级 , configMAX_PRIORITIES 在文件 FreeRTOSConfig.h 中有定义。 优先级数字越低表示任务的优先级越低,0 的优先级最低,configMAX_PRIORITIES-1 的优 先级最高。空闲任务的优先级最低,为 0。 FreeRTOS 调度器确保处于就绪态或运行态的高优先级的任务获取处理器使用权,换句话说 就是处于就绪态的最高优先级的任务才会运行。当宏 configUSE_TIME_SLICING 定义为 1 的时 候多个任务可以共用一个优先级,数量不限。默认情况下宏 configUSE_TIME_SLICING 在文件 FreeRTOS.h 中已经定义为 1。此时处于就绪态的优先级相同的任务就会使用时间片轮转调度器 获取运行时间。)。

二、任务状态

   FreeRTOS 中的任务永远处于下面几个状态中的某一个:

FreeRTOS基础知识学习笔记_第2张图片

 

● 运行态 当一个任务正在运行时,那么就说这个任务处于运行态,处于运行态的任务就是当前正在 使用处理器的任务。如果使用的是单核处理器的话那么不管在任何时刻永远都只有一个任务处 于运行态。

● 就绪态 处于就绪态的任务是那些已经准备就绪(这些任务没有被阻塞或者挂起),可以运行的任务, 但是处于就绪态的任务还没有运行,因为有一个同优先级或者更高优先级的任务正在运行! ● 阻塞态 如果一个任务当前正在等待某个外部事件的话就说它处于阻塞态,比如说如果某个任务调 用了函数 vTaskDelay()的话就会进入阻塞态,直到延时周期完成。任务在等待队列、信号量、事 件组、通知或互斥信号量的时候也会进入阻塞态。任务进入阻塞态会有一个超时时间,当超过 这个超时时间任务就会退出阻塞态,即使所等待的事件还没有来临!

● 挂起态 像阻塞态一样,任务进入挂起态以后也不能被调度器调用进入运行态,但是进入挂起态的 任务没有超时时间。任务进入和退出挂起态通过调用函数 vTaskSuspend()和 xTaskResume()。 

三、任务控制块

FreeRTOS 的每个任务都有一些属性需要存储,FreeRTOS 把这些属性集合到一起用一个结 构体来表示,这个结构体叫做任务控制块:TCB_t,在使用函数 xTaskCreate()创建任务的时候就 会自动的给每个任务分配一个任务控制块。

四、 任务堆栈

FreeRTOS 任务调度器在进行任务切换的时候会将当前任务的现场(CPU 寄存器值等)保存在此任务的任务堆栈中,任务堆栈就像是提供一块地方储当前任务的值,以至于任务切换后再次返回可以找到之前的值并继续从上次的地方开始运行。

创建任务的时候需要给任务指定堆栈,如果使用的函数 xTaskCreate()创建任务(动态方法) 的话那么任务堆栈就会由函数 xTaskCreate()自动创建,后面分析 xTaskCreate()的时候会讲解。 如果使用函数 xTaskCreateStatic()创建任务(静态方法)的话就需要程序员自行定义任务堆栈,然 后堆栈首地址作为函数的参数 puxStackBuffer 传递给函数。

 

       文档参考《正点原子FreeRTOS开发手册》    

你可能感兴趣的:(FreeRTOS基础知识,学习)