目录
一、裸机与RTOS
1.1、裸机
1.2、RTOS
二、FreeRTOS简介
2.1、介绍
2.2、特点
2.3、如何查找相关资料
三、FreeROTS基础
3.1、任务调度
3.2、任务状态
一、裸机与RTOS
1.1、裸机
不带操作系统,又称为前后台系统,前台系统指中断服务函数,后台系统指主程序的大循环,即应用程序。
特点:
1)实时性差(程序轮流执行)
2)空等待(在delay时,cpu不执行其他代码)
3)结构性差(实现功能全放在主函数循环中)
1.2、RTOS
Real-time OS,也就是实时操作系统。
特点:
1)多任务,每个功能可以划分为一个任务
2)任务调度,高优先级任务延时时,会让出cpu试用期给低优先级使用
3)任务抢占,高优先级任务可以抢占低优先级任务
4)任务堆栈,每个任务都有自己的栈空间,用来保存相关数据
注意点:
1)中断可以打断任何等级的任务
2)可以存在优先级相同的不同任务
二、FreeRTOS简介
2.1、介绍
Free,免费的,RTOS实时操作系统,FreeRTOS就是一个免费的嵌入式实时操作系统。
2.2、特点
1)免费开源(降低了开发成本)
2)可裁剪(核心代码只有三个.c文件,9000行)
3)简单(可移植性好)
4)优先级不限(任务优先级分配没有限制,多任务可以同一优先级,硬件限制0-31)
5)任务不限(可创建的实时任务没有软件限制)
6)支持抢占/协程/时间片(任务调度)
2.3、如何查找相关资料
1)官网:https://www.freertos.org/
2)网络上其它分享平台如:正点原子学习资料、野火学习资料
ARM Cortex-M知识参考:<Cortex M3权威指南(中文)><Cortex M3、M4权威指南>
三、FreeROTS基础
3.1、任务调度
FreeROTS支持三种任务调度方式,如下:
1)抢占式调度:针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务;
2)时间片调度:一个时间片就等于SysTick中断周期(默认1ms),可设置,针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会跟根据系统时钟节拍到的时候切换任务;
3)携程式调度:当前执行任务将会一直运行,同时高优先级的任务不会抢占的优先级的任务,FreeROTS现在虽然还支持,但是官方已经表示不会在更新携程式调度。
3.2、任务状态
FreeROTS中任务存在4中状态,如下:
1)运行态:正在执行的任务,该任务就处于运行态,在STM32中,同一时间仅一个任务处于运行态;
2)就绪态:该任务已经能够执行,但目前还未被执行,那么该任务就处于就绪态;
3)阻塞态:任务因延时或等待外部事件发生,那么这个任务就处于阻塞态;
4)挂起态:类似于暂停,调用函数vTaskSuspend()进入挂起态,需要调用解挂函数vTaskResume()才可以进入就绪态。
注意:
1)任务中途被打断或阻塞,没有用完的时间片不会被二次使用,在下次轮到该任务执行时,分配的是一个新的时间片;
2)仅就绪态可转变成运行态;
3)其它状态的任务想运行,必须先转变成就绪态。
四种状态转换图,如下图1:
图1
这四种状态中,除了运行态,其他三种任务状态的任务都有其对应的任务状态列表,如下:
就绪列表:pxReadyTasksLists[x],其中x代表任务优先级数值-->常用硬件较为稳定0-31,数字大优先级高
阻塞列表:pxDelayedTaskList
挂起类别:xSuspendedTaskList
那么如何知道列表中有没有任务呢?
定义一个32位的变量,当某个位置1时,代表所对应的优先级就绪列表有任务存在。
调度器总是在所以处于就绪列表的任务中,选择具有最高优先级的任务来执行。