目录

  • 一、初识FreeRTOS
  • 1、什么是FreeRTOS?
  • 2、为什么选择 FreeRTOS ?
  • 3、FreeRTOS 特点
  • 二、FreeRTOS的移植(STM32开发板)
  • 1、FreeRTOS源码获取
  • 2、FreeRTOS的移植
  • 三、FreeRTOS的多任务进程
  • 小结


一、初识FreeRTOS

1、什么是FreeRTOS?

  • Free 即免费的,RTOS 全称是 Real Time Operating System,中文就是实时操作系统。注意,RTOS 不是指某一个确定的系统,而是指一类系统。比如 uC/OS,FreeRTOS,RTX,RT-Thread 等这些都是 RTOS 类操作系统。
  • 操作系统允许多个任务同时运行,这个叫做多任务。实际上,一个处理器核心在某一时刻只能运行一个任务。操作系统中任务调度器的责任就是决定在某一时刻究竟运行哪个任务。任务调度在各个任务之间的切换非常快,就给人们造成了同一时刻有多个任务同时运行的错觉。
  • 某些操作系统给每个任务分配同样的运行时间,时间到了就轮到下一个任务,比如Unix 操作系统。 FreeRTOS 操作系统则是由用户给每个任务分配一个任务优先级,任务调度器就可以根据此优先级来决定下一刻应该运行哪个任务。
  • FreeRTOS 是 RTOS 系统的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行,当然,FreeRTOS 不仅局限于在微控制器中使用。但从文件数量上来看 FreeRTOS 要比uC/OSII 和 uC/OSIII 小的多。

2、为什么选择 FreeRTOS ?

RTOS 类系统有很多,比如 uC/OS,资料很多,尤其是中文资料,那为什么要选择 FreeRTOS 呢?

  • FreeRTOS是免费的,学习RTOS操作系统的话 uC/OS是首选,但要做产品的话,免费的FreeRTOS操作系统就是个不错的选择。
  • 许多半导体厂商产品的 SDK(Software Development Kit—软件开发工具包) 包就使用 FreeRTOS 作为其操作系统,尤其是 WIFI、蓝牙这些带协议栈的芯片或模块。
  • 简单,因为FreeRTOS 的文件数量很少。

3、FreeRTOS 特点

FreeRTOS 是一个可裁剪的小型 RTOS 系统,其特点包括:

  • FreeRTOS 的内核支持抢占式,合作式和时间片调度。
  • 提供了一个用于低功耗的 Tickless 模式。
  • 系统的组件在创建时可以选择动态或者静态的 RAM,比如任务、消息队列、信号量、软件定时器等等。
  • FreeRTOS-MPU 支持 Corex-M 系列中的 MPU 单元,如 STM32F429。
  • FreeRTOS 系统简单、小巧、易用,通常情况下内核占用 4k-9k 字节的空间。
  • 高可移植性,代码主要 C 语言编写。
  • 高效的软件定时器。
  • 强大的跟踪执行功能。
  • 堆栈溢出检测功能。
  • 任务数量不限。
  • 任务优先级不限。

二、FreeRTOS的移植(STM32开发板)

1、FreeRTOS源码获取

百度盘:野火官方资料(内含源码)

2、FreeRTOS的移植

1、在网盘解压后,会得到系统源码和实验程序实例等相关文件,如图:

从freeSSl到51 freertos_从freeSSl到51


2、然后找到FreeRTOS的源码:

从freeSSl到51 freertos_Source_02


3、然后进行FreeRTOS源码的一些路径变化:

①FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil目录下的FreeRTOSConfig.h放到source下

从freeSSl到51 freertos_从freeSSl到51_03


从freeSSl到51 freertos_多任务_04


②再将FreeRTOSv9.0.0\FreeRTOS\Source\portable\IAR目录下的ARM_CM3复制到keil文件中

从freeSSl到51 freertos_Source_05


从freeSSl到51 freertos_Source_06


4、我们以网盘下在下载的实验实例进行一下移植:

  • 随便打开一个基础工程,然后添加一个FreeRTOS组:

从freeSSl到51 freertos_多任务_07

  • 然后向其中添加一些FreeRTOS的源文件:

源文件清单路径如下:
FreeRTOS\Source\list.c
FreeRTOS\Source\tasks.c
FreeRTOS\Source\portable\Keil\ARM_CM3\port.c
FreeRTOS\Source\portable\MemMang\heap_4.c
FreeRTOS\Source\FreeRTOSConfig.h

  • 然后继续添加头文件:

从freeSSl到51 freertos_从freeSSl到51_08


至此,移植基本上完成了。

三、FreeRTOS的多任务进程

接下来完成两项任务:

task1: 每间隔500ms闪烁(变化)一次LED;
task2: 每间隔2000ms,向串口发送一次指令数据“helloworld!";
( 由于没有AHT20,暂不进行task3。)

此时我们可以直接用下载下来的实例:

从freeSSl到51 freertos_多任务_09

  • 路径为:1-程序源码_教程文档\3-[野火]《FreeRTOS内核实现与应用开发实战指南》\1-书籍配套程序\2-第二部分程序:FreeRTOS内核应用开发\基于STM32F103_指南者_开发板\ebf_freertos_base_code_stm32f103_zhinanzhe\14-3,SRAM动态创建多任务\Project\RVMDK(uv5)

然后对main.c做一点简单的修改:

把static void LED2_Task()函数的内容改为以下

while (1)
    {
        printf("hello world!\n"); 
        vTaskDelay(2000);  		
    }

然后生成HEX文件

从freeSSl到51 freertos_从freeSSl到51_10

把生成的HEX文件用mcuisp 软件进行编程:

从freeSSl到51 freertos_多任务_11


可以在串口助手上看到以下信息:

从freeSSl到51 freertos_Source_12


然后连接的下行机也会闪烁:(这里不知道为什么上传以后动图就不动了)

从freeSSl到51 freertos_优先级_13


至此,两个任务就进行完成了。

小结

本次实验了解了FreeRTOS的基本情况,然后又通过基于stm32的FreeRTOS的移植,通过移植好的系统,就可以在开发板上进行多任务的进程。通过本次实验很好的认识到某些操作系统给每个任务分配同样的运行时间,时间到了就轮到下一个任务,比如Unix 操作系统。 FreeRTOS 操作系统则是由用户给每个任务分配一个任务优先级,任务调度器就可以根据此优先级来决定下一刻应该运行哪个任务,同时也又一次的熟悉了开发板软件的使用。