目录
前言:
FreeRTOS 是市场领先的面向微控制器和小型微处理器的实时操作系统 (RTOS),与世界领先的芯片公司合作开发,现在每 170 秒下载一次。FreeRTOS 通过 MIT 开源许可免费分发,包括一个内核和一组不断丰富的 IoT 库,适用于所有行业领域。FreeRTOS 的构建强调可靠性和易用性。
声明:博客笔记根据正点原子视频教程编辑,仅供学习交流!
一、裸机与RTOS
1、裸机
简介:裸机又称为前后台系统,前台系统指的中断服务函数,后台系统指的大循环,即应用程序。
例子:打游戏和回复信息,需要打完游戏才可回复信息,或者回复完信息才可打游戏。
特点:①实时性差:应用程序轮流执行。②delay:空等待,CPU不执行其他代码(浪费了资源)。③结构臃肿:实现的功能都放在无限循环。
2、RTOS
二、FreeRTOS
简介:FreeRTOS 是一个嵌入式实时操作系统。
特点:①免费开源:商业产品中使用,无潜在商业风险,无须担心。②可裁剪:使得FreeRTOS的核心代码只有9000行左右。③简单:简单易用,可移植性好。④优先级不限:任务优先级分配没有限制,多任务可同一优先级。⑤任务不限:可创建的实时任务数量没有软件限制。⑥支持抢占式,协程式、时间片流转任务调度。
1、任务调度
首先Task1在运行中,在这个过程中Task2就绪了,在抢占式调度器的作用下Task2会抢占Task1的运行;Task2运行过程中,Task3就绪了,在抢占式调度器的作用下Task3会抢占Task2的运行;Task3运行过程中,如果Task3阻塞了(即系统延时或等待信号量等),此时就绪态中优先级最高的任务Task2执行;如果Task3阻塞解除了(延时到了或者接收到信号量),此时Task3恢复到就绪态中,抢占TasK2的运行。
总结:①高优先级任务,优先执行。②高优先级任务不停止,低优先级任务无法执行。③被抢占的任务将会进入就绪态。
首先Task1运行完一个时间片后,切换至Task2运行;Task2运行完一个时间片后,切换至Task3运行;Task3运行过程中还不到一个时间片阻塞了(系统延时或等待信号量等),此时直接切换到下一个任务Task1;Task1运行完一个时间片后,切换至Task2运行。
总结:①同等优先级任务,轮流执行;时间片流转。②一个时间片大小,取决为滴答定时器中断周期。③注意没有用完的时间片不会再使用,下次任务Task3得到执行还是按照一个时间片的时钟节拍运行(下次重新开始一个时间片计时)。
2、任务状态(4种)
①运行态:正在执行的任务,该任务就处于运行态,注意在STM32中,同一时间仅一个任务处于运行态。
②就绪态:如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态。
③阻塞态:如果一个任务因延时或等待外部事件发生,那么这个任务就处于阻塞态。
④挂起态:类似暂停,调用函数 vTaskSuspend() 进入挂起态,需要调用解挂函数vTaskResume() 才可以进入就绪态。
总结:仅就绪态可转变为运行态;其他状态的任务想运行,必须先转变成就绪态。
任务状态列表:
这四种状态中,除了运行态,其他三种任务状态的任务都有其对应的任务状态列表(类似链表)
新创建的任务会在就绪列表。32位的变量,当某个位置1时,代表所对应的优先级就绪列表有任务存在。
举例:假设,创建三个任务分别是:task1、task2、task3,优先级分别是:1、2、3。调度器总是在所有处于就绪列表的任务中,选择具有最高优先级的任务来执行。若出现相同优先级任务,任务会连接在同一个就绪列表上。
有关任务状态列表的知识后续会有专门的博客总结!
三、FreeRTOS源码说明&移植
源码
源码下载链接: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开发,因此这里只重点介绍其中的部分移植文件:
移植(基于HAL库开发,基于库函数的稍有不同)
①添加FreeRTOS源码:将FreeRTOS源码添加至基础工程、头文件路径等
②FreeRTOSConfig.h:添加FreeRTOSConfig.h 配置文件。
总结:
对于配置和移植总结不全,随后会补充!
往期精彩: