| 编辑推荐: |
本文主要介绍了FreeRTOS裸机、RTOS开发与任务调度、任务状态、源码与移植相关内容,
希望对您的学习有所帮助。
本文来自于微信公众号二象性Libo,由火龙果软件Linda编辑、推荐。
|
|
FreeRTOS 是市场领先的面向微控制器和小型微处理器的实时操作系统
(RTOS),与世界领先的芯片公司合作开发,现在每 170 秒下载一次。FreeRTOS 通过 MIT
开源许可免费分发,包括一个内核和一组不断丰富的 IoT 库,适用于所有行业领域。FreeRTOS 的构建强调可靠性和易用性。
一、裸机与RTOS
1、裸机
简介:裸机又称为前后台系统,前台系统指的中断服务函数,后台系统指的大循环,即应用程序。
例子:打游戏和回复信息,需要打完游戏才可回复信息,或者回复完信息才可打游戏。
特点:①实时性差:应用程序轮流执行。②delay:空等待,CPU不执行其他代码(浪费了资源)。③结构臃肿:实现的功能都放在无限循环。
2、RTOS
简介:RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性。
例子:打游戏和回复信息,不需要等某一件事做完,可每间隔1ms(一个时间片时钟节拍),然后交替做这两件事,因为速度很快,从宏观的意义上来看,类似同步执行!
特点:①分而治之:实现功能划分多个任务。②延时函数:不会空等待,会让CPU的使用权给其他任务,即任务调度。③抢占式:高优先级任务抢占低优先级任务。④任务堆栈:每个任务都有自己的栈空间,用于保存局部变量以及任务的上下文信息。
注意:①中断可以打断任何任务。②任务可以同等优先级。
问题:如果高优先级的任务一直在运行,会使得低优先级任务无法运行。
二、FreeRTOS
简介:FreeRTOS 是一个嵌入式实时操作系统。
特点:①免费开源:商业产品中使用,无潜在商业风险,无须担心。②可裁剪:使得FreeRTOS的核心代码只有9000行左右。③简单:简单易用,可移植性好。④优先级不限:任务优先级分配没有限制,多任务可同一优先级。⑤任务不限:可创建的实时任务数量没有软件限制。⑥支持抢占式,协程式、时间片流转任务调度。
1、任务调度
调度器就是使用相关的调度算法来决定当前需要执行的任务。FreeRTOS支持抢占式、时间片、携程式三种调度方式。
①抢占式调度:针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务。
首先Task1在运行中,在这个过程中Task2就绪了,在抢占式调度器的作用下Task2会抢占Task1的运行;Task2运行过程中,Task3就绪了,在抢占式调度器的作用下Task3会抢占Task2的运行;Task3运行过程中,如果Task3阻塞了(即系统延时或等待信号量等),此时就绪态中优先级最高的任务Task2执行;如果Task3阻塞解除了(延时到了或者接收到信号量),此时Task3恢复到就绪态中,抢占TasK2的运行。
总结:①高优先级任务,优先执行。②高优先级任务不停止,低优先级任务无法执行。③被抢占的任务将会进入就绪态。
②时间片调度:针对优先级相同的任务,当多个任务的优先级相同时, 任务调度器会在每一次系统时钟节拍到的时候切换任务。同等优先级任务轮流地享有相同的
CPU 时间(可设置), 叫时间片,在FreeRTOS中,一个时间片就等于SysTick 中断周期。
首先Task1运行完一个时间片后,切换至Task2运行;Task2运行完一个时间片后,切换至Task3运行;Task3运行过程中还不到一个时间片阻塞了(系统延时或等待信号量等),此时直接切换到下一个任务Task1;Task1运行完一个时间片后,切换至Task2运行。
总结:①同等优先级任务,轮流执行;时间片流转。②一个时间片大小,取决为滴答定时器中断周期。③注意没有用完的时间片不会再使用,下次任务Task3得到执行还是按照一个时间片的时钟节拍运行(下次重新开始一个时间片计时)。
③协程式调度:了解即可,当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务。官方已不会再更新此种方式的任务调度。
2、任务状态(4种)
①运行态:正在执行的任务,该任务就处于运行态,注意在STM32中,同一时间仅一个任务处于运行态。
②就绪态:如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态。
③阻塞态:如果一个任务因延时或等待外部事件发生,那么这个任务就处于阻塞态。
④挂起态:类似暂停,调用函数 vTaskSuspend() 进入挂起态,需要调用解挂函数vTaskResume()
才可以进入就绪态。
总结:仅就绪态可转变为运行态;其他状态的任务想运行,必须先转变成就绪态。
任务状态列表:
这四种状态中,除了运行态,其他三种任务状态的任务都有其对应的任务状态列表(类似链表)
新创建的任务会在就绪列表。32位的变量,当某个位置1时,代表所对应的优先级就绪列表有任务存在。
举例:假设,创建三个任务分别是:task1、task2、task3,优先级分别是:1、2、3。调度器总是在所有处于就绪列表的任务中,选择具有最高优先级的任务来执行。若出现相同优先级任务,任务会连接在同一个就绪列表上。
有关任务状态列表的知识后续会有专门的博客总结!
三、FreeRTOS源码说明&移植
1、源码
源码下载链接:https://www.freertos.org/
这三个文件依次是内核、组件和工具,其中第一个FreeRTOS内核包括Demo(FreeRTOS演示例程)、License(FreeRTOS相关许可)、Source(源码)、Test(公用以及移植层测试代码)。
源码Source里需要注意include(头文件)、portable(移植文件)、list.c(列表相关文件)、queue.c(队列相关文件)、task.c(任务相关文件)、timers.c(软件定时器相关文件)。
FreeRTOS操作系统归根到底是一个软件层面的东西,靠portable(移植文件)与硬件联系起来,我们使用MDK开发,因此这里只重点介绍其中的部分移植文件:
2、 移植(基于HAL库开发,基于库函数的稍有不同)
①添加FreeRTOS源码:将FreeRTOS源码添加至基础工程、头文件路径等
②FreeRTOSConfig.h:添加FreeRTOSConfig.h
配置文件。
③修改SYSTEM文件:修改SYSTEM文件中的sys.c、delay.c、usart.c。
④修改中断相关文件:修改Systick中断、SVC中断、PendSV中断。
⑤添加应用程序:验证移植是否成功。
FreeRTOSConfig.h 配置文件作用:对FreeRTOS的功能进行配置和裁剪,以及API函数的使能等
相关宏大致可分为三类: “INCLUDE”用于配置FreeRTOS中可选的API函数;“config”完成FreeRTOS的功能配置和裁剪;其他配置项PendSV宏定义、SVC宏定义等。 |