目录
一、RTOS的基本概念
实时操作系统(Real Time Operating System)简称 :RTOS,是指具有实时性、能支持实时控制系统工作的操作系统。
++++RTOS的首要任务就是调度所有可以利用的资源来完成实时控制任务的工作++++,其次才是提高工作效率。
绝大多数比较简单的产品(中小型产品)是直接在单片机上"裸奔"的,也就是产品不搭载RTOS的,但是产品的各个功能想要正常工作都需要主程序来进行调度。
RTOS本质是一段代码,只不过这段代码在开发板复位后优先被执行,而传感器的代码要插入到已经运行的代码中,合体成一段代码。
可以理解为 :RTOS是用户的主程序,只不过用户把产品的其他功能(子程序)都建立在RTOS之上,在RTOS中可以调用API函数为每个子程序都创建一个任务(也可以叫做线程) ,用户只需要调用RTOS内核中的相关的API函数接口就可以控制子程序,而且可以为每个任务设置不同的优先级,通过RTOS的调度器进行调度,这样就可以合理的使用CPU。
这里就涉及到产品的设计思路(裸机开发 or RTOS)以及程序的运行方式,可以分为三种:
-
轮询式系统
-
前后台系统
-
多任务系统
多任务系统的外部事件也是在中断中进行响应,但是外部事件的处理是任务中进行处理。
任务具有优先级,优先级高的任务先处理。
程序就会被分割为一个个的任务,任务是一个独立的死循环,并且不能返回,可以由操作系统进行任务的调度。
多任务系统
//任务1
void * task1(void *arg)
{
while(1)
{
//
}
}
//任务2
void * task2(void *arg)
{
while(1)
{
//
}
}
int main()
{
//2.创建任务,并设置任务的属性(优先级、内存分配、时间片)
}
二、RTOS的种类对比
RTOS是实时操作系统的统称,不意味着是某一种确定的操作系统,而是指某一类操作系统,比如最常用的uC/OSII、uC/OSIII、FreeRTOS、RTX、RT-Thread、Huawei LiteOS...
三、FreeRTOS概述
FreeRTOS也是RTOS的一种,是免费的,很多的半导体公司都和FreeRTOS有很紧密的合作关系。比如半导体公司发布的SDK(开发工具包)一般也采用FreeRTOS,另外,像蓝牙、WIFI等带协议栈的芯片或者模块也是采用FreeRTOS。
FreeRTOS的文件数量少,占用内存空间少 ,所以在移植到不同硬件平台的时候更加轻松,FreeRTOS对于任务数量没有限制的,而是对于任务的优先级也没有限制。
FreeRTOS支持抢占式、合作式、时间片调度等算法,而且FreeRTOS是完全免费的,这也是FreeRTOS的核心竞争力。
FreeRTOS的官网下载源码以及关于RTOS的API函数的参考手册以及新手教程。 官网地址:www.freertos.org
四、FressRTOS的的源码下载
FreeRTOS官网把源码托管在Github上。
下载v9.0.0的版本。


五、FressRTOS的的源码结构
源码包的顶层目录里的readme里阐述:
" FreeRTos/source包含了实时操作系统的内核源代码 "
" FreeRTos/demo包含了若干已经提前被配置好的和MCU架构相关的案例工程 "
" 在每个目录下都有自己的自述文件 "
" 最简单的方式就是直接使用FreeRTOS提供的和MCU的架构相关的官网案例来进行学习和移植 "

- 来到 " FreeRTos/source "目录下,有3个公共的文件必须要移植 " list.c "、" queue.c "、" task.c "
- 必须要移植 " 和MCU以及编译器相关的可移植文件' FreeRTos/source/ include ' "
- " FreeRTos/Source/Portable "下根据编译器选择要移植具体文件
- " FreeRTos/Source/portable/MemMang "路径下移植 " heap_4.c "

用户需要移植:3个公共源文件(list.c、queue.c、tasks.c)、和MCU架构相关的2个文件(port.c和portmacro.h)、和1个内存管理相关的源文件(heap_4.c)、和内核相关的头文件。
六、FressRTOS的的移植流程

可见,在编译工程时,出现提示找不到FreeRTOSConfig.h头文件,需要了解一下该头文件的作用,用户可以选择从FreeRTOS内核源码中的案例demo中移植FreeRTOSConfig.h!!!


再次编译,发现出现新错误,提示SystemCoreClock标识符未定义,原因是因为在FreeRTOSConfig.h中使用了该变量,但是头文件中没有定义该变量,所以需要在FreeRTOSConfig.h中声明SystemCoreClock是外部文件的,但是如下图:

可以看到,这个变量声明是有条件的,当用户定义了宏_ICCARM_则该声明是启用的,但是_ICCARM_是在IAR软件中使用的,但是现在采用的开发环境是KEIL,而KEIL软件采用的是__CC_ARM宏定义,解决方案:把_ICCARM_替换为__CC_ARM即可。

再次编译,发现出现新错误,可以发现是在port.c和stm32f4xx_it.c中出现了函数重复定义的情况,所以通过阅读stm32f4xx_it.c源文件,可以知道该文件中只是提前定义这三个函数,但是并没有使用,所以只需要把stm32f4xx_it.c中三个函数接口注释即可。

再次编译,发现出现新错误,错误原因是没有定义相关的回调函数,在FreeRTOSConfig.h中如果启用某些功能,则需要定义该功能的回调函数,如果不需要使用该功能,则解决方案是在FreeRTOSConfig.h头文件把这些宏定义禁用,设置为0。


RTOS作为一个载体,这个载体运行传感器的程序。
利用RTOS提供的接口,完成任务的创建 ==> 可以给某个传感器创建一个任务(可视为线程)
单核处理器无法并发。
任务数量受限:受硬件的内存限制。
任务上下文
每个任务都有自己的堆栈空间,任务不会一次性执行完,可能执行到一半时间片没了,要保留任务上下文,保留任务上下文的时候,地址变量要备份下来,备份的时候要用到存储单元,所以创建任务的时候一定要给任务分配堆栈空间。
FreeRTOS的工程,在运行的时候是要先运行汇编文件的 "xxx.s",从而汇编文件跳转到自己的main函数里。
Q :怎么使用FreeRTOS
A :我自己移植的。
Q :如何移植的FreeRTOS?
A :
(1)去托管网站下载源码
(2)在FreeRTOS上有移植指南,参考移植指南和源码中的自述文件。
分析源码包的目录结构,并阅读源码包中的自述文件,直到源码包中哪些文件需要移植。
①有3个公共的文件 " list.c "、" queue.c "、" task.c "
②我用的MCU的内核是arm架构,ArmCortex-M4架构,我找到了和我现在MCU架构相同的源文件和头文件;
由于当前的MCU内Flash容量小,只有512KB,所以搭载了FreeRTOS之后我对内存进行管理,我分析FreeRTOS源码提供的相关源文件,我对此进行移植。
③而这些源文件都会依赖一些头文件,所以我从FreeRTOS中把需要的头文件拷贝,再对我的工程进行配置,提供编译查找错误并解决错误,从而确保移植成功。
Q :如何裁剪FreeRTOS?
A :对配置文件FreeRTOSConfig.h来实现
Q :这个配置文件里有说明内容?
A :有宏定义
Q :如何对功能进行裁剪,详细描述
A :FreeRTOS源码都是采用条件编译的,在头文件中让某个功能启用,启用之后在条件编译时会保留宏所对应的这部分代码。
中断是MCU内部的资源。
任务是MCU移植的FreeRTOS中裁剪处理的任务优先级。
多个任务优先级相同,要实现并发,用时间片轮询的调度策略。
多个任务优先级不同,要实现并发,用抢占式的调度策略。