单片机:第四篇 给STM32移植RTOS(Real Time OS)实时操作系统

本文最后更新于:9 个月前

RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性。实时操作系统又分为硬实时和软实时。硬实时要求在规定的时间内必须完成操作 ,硬实时系统不允许超时,在软实时里面处理过程超时的后果就没有那么严格。

有什么用?

实时操作系统是保证在一定时间限制内完成特定功能的操作系统。实时操作系统有硬实时和软实时之分,硬实时要求在规定的时间内必须完成操作,这是在操作系统设计时保证的;软实时则只要按照任务的优先级,尽可能快地完成操作即可。我们通常使用的操作系统在经过一定改变之后就可以变成实时操作系统。

大体上,实时操作系统(RTOS)要求:

  • 多任务

  • 处理能被区分优先次序的进程线

  • 一个中断水平的充份数量
    被装入作为微型设备一部分的内含小操作系统经常要求实时操作系统。一些核心问题能被考虑以符合实时操作系统的需求。然而,因为像设备驱动程序这样的其他成份,也通常被特别的方法需要,一个实时操作系统通常比核心更大。

    ————来自百度百科

项目需要上RTOS吗?

根据自己的需求

RTOS的缺点

  • 正所谓,项目越大,代码越多,BUG越多。所以如果你只是自己做个小玩意啥的,并没有上RTOS的必要。
  • 其次,RTOS如果运行过多的进程,会占用大量的系统RAM,经常会出现不能及时回收内存,导致单片机卡顿。
  • 使用RTOS是一项需要专业知识,以及需要长期经验积累才能用好。
  • RTOS使得任务执行顺序、执行时序更难分析,甚至不可能分析,裸机在任务出现异常的时候可以很快发现错误,但是使用RTOS后,即使某个任务出现异常,系统任然可以正常运行。

RTOS的优势

现在的单片机无论是运行内存还是性能相较于以前都有巨大的提升,特别是基于Cortex-M3内核的STM32F1x系列来说,512K的FLASH和64K的SRAM完全足够应付RTOS带来的系统开销。
未来的嵌入式开发肯定会逐渐模块化和操作系统化,所以RTOS的学习变得更加重要。
未来模块化的程序也会越来越多,比如Modbus通讯协议。使用RTOS来实现会轻松很多。
还有一些软件无法运行在裸机上,比如:乐鑫、Realtek、 ti 和 联发科 提供的 WIFi SOC SDK ,一些蓝牙 SOC 的 SDK 也都是只支持操作系统,所以,如果你不了解、不会使用操作系统,这些芯片也就玩不转了。

如何选择?

现在的RTOS有很多种,比如uC/OS-III,RT-Thread这些,但我建议选择FreeRTOS,因为开源免费商用,或者RT-Thread,易用性高。我看了一下两个系统,我自己更喜欢RT-Thread的风格。

给STM32移植FreeRTOS

下载RTOS

RT-Thread studio:点击下载
FreeRTOS:点击下载

RT-Thread

下载RT-Thread STUDIO后点击创建新工程。
20210118231545-2021-01-18

这样就轻松创建好了基于STM32的RT-Thread工程,可以在上面使用图形化的界面来对串口以及IO口进行操作。
PS:RT-Thread STUDIO是一款非常好用的开发工具,甚至可以替代Keil做日常的开发。

或者也可以下载RT-Thread官方的keil例程:RT-Thread Simulator 例程
RTT

FreeRTOS

FreeRTOS可以很轻松的在STM32CubeMX上创建。

或者是自己手动下载移植一下FreeRTOS文件进行移植。
手动移植:http://blog.chinaunix.net/uid-22072065-id-5196763.html

FreeRTOS

这是我在STM32VET6上的移植。下载

运行RTOS

主要代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "main.h" 

void redLed_Task(void *pvParameters)
{
static u8 state = 0;
pvParameters = pvParameters;

while(1)
{
(state = !state) == 1 ? (LED1 = 0) : (LED1 = 1);
vTaskDelay(500/portTICK_RATE_MS);
}
}

void greenLed_Task(void *pvParameters)
{
static u8 state = 0;
pvParameters = pvParameters;

while(1)
{
(state = !state) == 1 ? (LED2 = 0) : (LED2 = 1);
vTaskDelay(1000/portTICK_RATE_MS);
}
}

int main(void)
{
delay_init(8); //延时初始化
LED_Init();

xTaskCreate( redLed_Task, "LED1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL); //创建任务
xTaskCreate( greenLed_Task, "LED2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+2, NULL ); //创建任务

vTaskStartScheduler(); //启动任务
return 0;
}

运行之后,两个LED灯就会交替闪烁。

总结

实时性一般,或者功能较为简单的项目不建议用。
学习的话,必须得学。