RT-thread Nano移植

一.获取 RT-Thread NANO软件包

链接

二、打开STM32CubeMx

1.添加NANO软件包

在这里插入图片描述
在这里插入图片描述
添加链接
在这里插入图片描述

2.安装

在这里插入图片描述

3.创建工程

在这里插入图片描述
在这里插入图片描述
这三个不选
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三.keil代码实现

1.在Application/User文件夹,新建app_rt_thread.c文件,并添加如下代码

#include "rtthread.h"
#include "main.h"
#include "stdio.h"
 
struct rt_thread led_thread;
rt_uint8_t rt_led_thread_stack[128];
void led_task_entry(void *parameter);
 
//初始化线程函数
void MX_RT_Thread_Init(void)
{
	//初始化LED线程
	rt_thread_init(&led_thread,"led",led_task_entry,RT_NULL,&rt_led_thread_stack[0],sizeof(rt_led_thread_stack),3,20);
	//开启线程调度
	rt_thread_startup(&led_thread);
}
 
//主任务
void MX_RT_Thread_Process(void)
{
	printf("Hello RT_Thread!!!");
	rt_thread_delay(2000);
}
 
//LED任务
void led_task_entry(void *parameter)
{
	while(1)
	{
		HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin, GPIO_PIN_RESET);
		rt_thread_delay(500);
		HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin, GPIO_PIN_SET);
		rt_thread_delay(500);
	}
}

2.在usart.c文件添加如下代码:

/* USER CODE BEGIN 0 */
#include "stdio.h"
 
/* USER CODE END 0 */
.
.
.
/* USER CODE BEGIN 1 */
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}
 
/* USER CODE END 1 */

3,在main.c文件添加如下代码:

/* USER CODE END Header */
 
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"
 
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
 
/* USER CODE END Includes */
 
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
extern void MX_RT_Thread_Init(void);
extern void MX_RT_Thread_Process(void);
 
/* USER CODE END PTD */
.
.
.
 
 
int main(void)
{
  /* USER CODE BEGIN 1 */
 
  /* USER CODE END 1 */
 
  /* MCU Configuration--------------------------------------------------------*/
 
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
 
  /* USER CODE BEGIN Init */
 
  /* USER CODE END Init */
 
  /* Configure the system clock */
  SystemClock_Config();
 
  /* USER CODE BEGIN SysInit */
 
  /* USER CODE END SysInit */
 
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  MX_RT_Thread_Init();
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	MX_RT_Thread_Process();
    /* USER CODE END WHILE */
 
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

四.结果

在这里插入图片描述

在这里插入图片描述

五.参考

基于 STM32CubeMX 添加 RT-Thread 操作系统组件(一)- 详细介绍操作步骤

版权声明:本文为CSDN博主「xyj_xyjxyj」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xyj_xyjxyj/article/details/122223505

RT-thread

概述

RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。事实上,一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务的执行时间很短、任务与任务之间通过任务调度器进行非常快速地切换(调度器根据优先级决定此刻该执行的任务),给人造成多个任务在一个时刻同时运行的错觉。在 RT-Thread 系统中,任务是通过线程实现的,RT-Thread 中的线程调度器也就是以上提到的任务调度器。

RT-Thread 主要采用 C 语言编写,浅显易懂,方便移植。它把面向对象的设计方法应用到实时系统设计中,使得代码风格优雅、架构清晰、系统模块化并且可裁剪性非常好。针对资源受限的微控制器(MCU)系统,可通过方便易用的工具,裁剪出仅需要 3KB Flash、1.2KB RAM 内存资源的 NANO 版本(NANO 是 RT-Thread 官方于 2017 年 7 月份发布的一个极简版内核);而对于资源丰富的物联网设备,RT-Thread 又能使用在线的软件包管理工具,配合系统配置工具实现直观快速的模块化裁剪,无缝地导入丰富的软件功能包,实现类似 Android 的图形界面及触摸滑动效果、智能语音交互效果等复杂功能。

相较于 Linux 操作系统,RT-Thread 体积小,成本低,功耗低、启动快速,除此以外 RT-Thread 还具有实时性高、占用资源小等特点,非常适用于各种资源受限(如成本、功耗限制等)的场合。虽然 32 位 MCU 是它的主要运行平台,实际上很多带有 MMU、基于 ARM9、ARM11 甚至 Cortex-A 系列级别 CPU 的应用处理器在特定应用场合也适合使用 RT-Thread。

架构

RT-Thread 与其他很多 RTOS 如 FreeRTOS、uC/OS 的主要区别之一是,它不仅仅是一个实时内核,还具备丰富的中间层组件
在这里插入图片描述

  • 内核层:RT-Thread 内核,是 RT-Thread 的核心部分,包括了内核系统中对象的实现,例如多线程及其调度、信号量、邮箱、消息队列、内存管理、定时器等;libcpu/BSP(芯片移植相关文件 / 板级支持包)与硬件密切相关,由外设驱动和 CPU 移植构成。

  • 组件与服务层:组件是基于 RT-Thread 内核之上的上层软件,例如虚拟文件系统、FinSH 命令行界面、网络框架、设备框架等。采用模块化设计,做到组件内部高内聚,组件之间低耦合。

  • RT-Thread 软件包:运行于 RT-Thread 物联网操作系统平台上,面向不同应用领域的通用软件组件,由描述信息、源代码或库文件组成。RT-Thread 提供了开放的软件包平台,这里存放了官方提供或开发者提供的软件包,该平台为开发者提供了众多可重用软件包的选择,这也是 RT-Thread 生态的重要组成部分。软件包生态对于一个操作系统的选择至关重要,因为这些软件包具有很强的可重用性,模块化程度很高,极大的方便应用开发者在最短时间内,打造出自己想要的系统。RT-Thread 已经支持的软件包数量已经达到 60+,如下举例:

  • 物联网相关的软件包:Paho MQTT、WebClient、mongoose、WebTerminal 等等。

  • 脚本语言相关的软件包:目前支持 JerryScript、MicroPython。

  • 多媒体相关的软件包:Openmv、mupdf。

  • 工具类软件包:CmBacktrace、EasyFlash、EasyLogger、SystemView。

  • 系统相关的软件包:RTGUI、Persimmon UI、lwext4、partition、SQLite 等等。

  • 外设库与驱动类软件包:RealTek RTL8710BN SDK。

  • 其他。

完整丰富的组件

  1. 实时操作系统内核
    资源占用极少,最小版本仅需要3KB ROM和2KB RAM;线程上下文切换时间很短,在Cortex-M3上测试,挂起操作引起上下文切换时间仅为4.25us

  2. 设备框架
    名字化的对象化设备模型,上层应用与底层硬件设备无关,上层应用只需要查找相应的设备名获得设备句柄即可采用抽象的设备接口进行底层硬件的访问操作

  3. 虚拟文件系统
    为上层应用提供统一的文件访问接口,而不需要关心底层文件系统的具体实现及存储方式;支持FAT、UFFS、NFSv3 、 ROMFS和RAMFS等多种文件系统

  4. 应用框架
    RTT提供了各类应用框架来满足应用快速开发需求,如TLS/DTLS、实时数据库SQL LITE、机器间通信M2M、拨号网络框架RealRIL等

  5. 用户接口
    提供方便用户调试、查看信息的各种接口,包括Finsh、Msh、GDB Stub等

  6. GUI
    RTT的Persimmon UI异常强大,支持多点触摸操作和多种界面动画增强效果;支持TTF矢量字库,针对MCU优化的自定义图像格式,大幅提升图片加载和渲染速度;支持多国语言

  7. 网络协议栈
    支持丰富的市场所需的各种网络协议栈,包括MQTT、LWM2M、CoAP、HTTP、Web socket、LWIP、UDP、PPP、IPv6、Modbus、CAN工业协议等

  8. 低功耗组件
    提供了与上层应用无关的低功耗框架组件,开发者能够方便的开发出低功耗特性

许可协议

RT-Thread 系统完全开源,3.1.0 及以前的版本遵循 GPL V2 + 开源许可协议。从 3.1.0 以后的版本遵循 Apache License 2.0 开源许可协议,可以免费在商业产品中使用,并且不需要公开私有代码。

RTT-nano

RT-Thread Nano是一个极简的硬实时内核,它还具备体积小、启动快速、实时性高、占用资源小等特点。

适用于系统资源紧张或是项目功能较为简单,仅需使用RTOS内核,无需丰富功能的场景,且开发时无需额外的辅助工具。
在这里插入图片描述

创建项目

项目创建参考:

代码

  • 主函数中添加
        HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_4);
		rt_thread_delay(1000);
        HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_3);
		rt_thread_delay(1000);
  • Application/User/Core中新建文件app_rt_thread.c
#include "rtthread.h"
#include "main.h"
#include "stdio.h"
 
struct rt_thread led1_thread;
rt_uint8_t rt_led1_thread_stack[128];
void led1_task_entry(void *parameter);
 
//初始化线程函数
void MX_RT_Thread_Init(void)
{
	//初始化LED1线程
	rt_thread_init(&led1_thread,"led1",led1_task_entry,RT_NULL,&rt_led1_thread_stack[0],sizeof(rt_led1_thread_stack),3,20);
	//开启线程调度
	rt_thread_startup(&led1_thread);
}
 
//主任务
void MX_RT_Thread_Process(void)
{
	printf("Hello RT_Thread!!!");
	rt_thread_delay(2000);
}
 
//LED1任务
void led1_task_entry(void *parameter)
{
	while(1)
	{
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3, GPIO_PIN_RESET);
		rt_thread_delay(500);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3, GPIO_PIN_SET);
		rt_thread_delay(500);
	}
}

  • 修改board.c内的串口为USART1
    在这里插入图片描述
  • 取消rtconfig.h中的注释
    在这里插入图片描述

编译运行

在这里插入图片描述

总结

  1. 仍旧需要注意的是烧录时Boot0要置1,查看结果时Boot0要置0,并Reset。
  2. RT-thread的移植相较于uCOSII的移植来说要简单很多了,按步骤,没问题的。

裸机程序的运行缺点

采用中断和查询结合的方式可以解决大部分裸机应用,但随着工程的复杂,裸机方式的缺点就暴露出来了:

  1. 必须在中断 (ISR) 内处理时间关键运算 内处理时间关键运算
  2. ISR ISR 函数变得非常复杂,并且需要很长执行时间 。
  3. ISR ISR 嵌套可能产生不预测的执行时间和堆栈 需求。
  4. 超级循环和 ISR 之间的 数据交换是通过全局共享变量进行:
  5. 应用程序的员必须确保数据一致性 。
  6. 超级循环可以与系统计时器轻松同步,但:
  7. 如果系统需要多种不同的周期时间,则会很难实现 。
  8. 超过 超级循环周期的耗时函数需要做拆分。
  9. 增加 软件开销,应用程序难以理解 。
  10. 超级循环 使得 应用程序变得非常复杂,因此难以扩展 :
  11. 一个简单的更改就可能产生不预测副作用 ,对这种副作用进行分析非常耗时。
  12. 超级循环概念的这些缺点可以通过使用实时操作系统 (RTOS) 来解决。

更多详情:freeRTOS与裸机程序相比有什么区别??

参考

版权声明:本文为CSDN博主「天狼溯光者」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_51120713/article/details/122252160

一、添加Nano软件包

RT-Thread Nano软件包地址:https://www.rt-thread.org/download/cube/RealThread.RT-Thread.pdsc
打开CubeMX,选择Help下的Manage embedded software packages:在这里插入图片描述
选择From Url…:在这里插入图片描述
点击New,并添加上述的Nano软件包地址https://www.rt-thread.org/download/cube/RealThread.RT-Thread.pdsc:

在这里插入图片描述
勾选并OK后,成功:
同时,安装RT-Thread:
在这里插入图片描述
同意:
在这里插入图片描述
安装成功:在这里插入图片描述

二、新建工程

在这里插入图片描述
RCC配置:在这里插入图片描述
SYS设置:在这里插入图片描述
时钟树设置:在这里插入图片描述
选择组件:在这里插入图片描述
选择RT-Thread组件,OK:在这里插入图片描述
将选择的模块进行勾选:在这里插入图片描述
NVIC配置:在这里插入图片描述
生成代码:在这里插入图片描述
在这里插入图片描述

三、代码编写

添加新文件:在这里插入图片描述
添加.c文件:在这里插入图片描述
app_rt_thread.c:

#include "rtthread.h"
#include "main.h"
#include "stdio.h"
 
struct rt_thread led1_thread;
rt_uint8_t rt_led1_thread_stack[128];
void led1_task_entry(void *parameter);
 
//初始化线程函数
void MX_RT_Thread_Init(void)
{
	//初始化LED1线程
	rt_thread_init(&led1_thread,"led1",led1_task_entry,RT_NULL,&rt_led1_thread_stack[0],sizeof(rt_led1_thread_stack),3,20);
	//开启线程调度
	rt_thread_startup(&led1_thread);
}
 
//主任务
void MX_RT_Thread_Process(void)
{
	printf("Hello RT_Thread!!!");
	rt_thread_delay(2000);
}
 
//LED1任务
void led1_task_entry(void *parameter)
{
	while(1)
	{
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3, GPIO_PIN_RESET);
		rt_thread_delay(500);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3, GPIO_PIN_SET);
		rt_thread_delay(500);
	}
}

修改board.c的77行:在这里插入图片描述
将rtconfig.h的145行取消注释:在这里插入图片描述
在main.c中添加代码:

extern void MX_RT_Thread_Init(void);
extern void MX_RT_Thread_Process(void);

在这里插入图片描述
在while循环中添加以下代码:在这里插入图片描述

	  HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_4);
		rt_thread_delay(1000);

版权声明:本文为CSDN博主「weixin_50909683」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_50909683/article/details/122253936

一.获取 RT-Thread NANO软件包

链接

二、打开STM32CubeMx

1.添加NANO软件包

在这里插入图片描述
在这里插入图片描述
添加链接
在这里插入图片描述

2.安装

在这里插入图片描述

3.创建工程

在这里插入图片描述
在这里插入图片描述
这三个不选
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三.keil代码实现

1.在Application/User文件夹,新建app_rt_thread.c文件,并添加如下代码

#include "rtthread.h"
#include "main.h"
#include "stdio.h"
 
struct rt_thread led_thread;
rt_uint8_t rt_led_thread_stack[128];
void led_task_entry(void *parameter);
 
//初始化线程函数
void MX_RT_Thread_Init(void)
{
	//初始化LED线程
	rt_thread_init(&led_thread,"led",led_task_entry,RT_NULL,&rt_led_thread_stack[0],sizeof(rt_led_thread_stack),3,20);
	//开启线程调度
	rt_thread_startup(&led_thread);
}
 
//主任务
void MX_RT_Thread_Process(void)
{
	printf("Hello RT_Thread!!!");
	rt_thread_delay(2000);
}
 
//LED任务
void led_task_entry(void *parameter)
{
	while(1)
	{
		HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin, GPIO_PIN_RESET);
		rt_thread_delay(500);
		HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin, GPIO_PIN_SET);
		rt_thread_delay(500);
	}
}

2.在usart.c文件添加如下代码:

/* USER CODE BEGIN 0 */
#include "stdio.h"
 
/* USER CODE END 0 */
.
.
.
/* USER CODE BEGIN 1 */
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}
 
/* USER CODE END 1 */

3,在main.c文件添加如下代码:

/* USER CODE END Header */
 
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"
 
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
 
/* USER CODE END Includes */
 
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
extern void MX_RT_Thread_Init(void);
extern void MX_RT_Thread_Process(void);
 
/* USER CODE END PTD */
.
.
.
 
 
int main(void)
{
  /* USER CODE BEGIN 1 */
 
  /* USER CODE END 1 */
 
  /* MCU Configuration--------------------------------------------------------*/
 
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
 
  /* USER CODE BEGIN Init */
 
  /* USER CODE END Init */
 
  /* Configure the system clock */
  SystemClock_Config();
 
  /* USER CODE BEGIN SysInit */
 
  /* USER CODE END SysInit */
 
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  MX_RT_Thread_Init();
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	MX_RT_Thread_Process();
    /* USER CODE END WHILE */
 
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

四.结果

在这里插入图片描述

在这里插入图片描述

五.参考

基于 STM32CubeMX 添加 RT-Thread 操作系统组件(一)- 详细介绍操作步骤

版权声明:本文为CSDN博主「xyj_xyjxyj」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xyj_xyjxyj/article/details/122223505

一、添加Nano软件包

RT-Thread Nano软件包地址:https://www.rt-thread.org/download/cube/RealThread.RT-Thread.pdsc
打开CubeMX,选择Help下的Manage embedded software packages:在这里插入图片描述
选择From Url…:在这里插入图片描述
点击New,并添加上述的Nano软件包地址https://www.rt-thread.org/download/cube/RealThread.RT-Thread.pdsc:

在这里插入图片描述
勾选并OK后,成功:
同时,安装RT-Thread:
在这里插入图片描述
同意:
在这里插入图片描述
安装成功:在这里插入图片描述

二、新建工程

在这里插入图片描述
RCC配置:在这里插入图片描述
SYS设置:在这里插入图片描述
时钟树设置:在这里插入图片描述
选择组件:在这里插入图片描述
选择RT-Thread组件,OK:在这里插入图片描述
将选择的模块进行勾选:在这里插入图片描述
NVIC配置:在这里插入图片描述
生成代码:在这里插入图片描述
在这里插入图片描述

三、代码编写

添加新文件:在这里插入图片描述
添加.c文件:在这里插入图片描述
app_rt_thread.c:

#include "rtthread.h"
#include "main.h"
#include "stdio.h"
 
struct rt_thread led1_thread;
rt_uint8_t rt_led1_thread_stack[128];
void led1_task_entry(void *parameter);
 
//初始化线程函数
void MX_RT_Thread_Init(void)
{
	//初始化LED1线程
	rt_thread_init(&led1_thread,"led1",led1_task_entry,RT_NULL,&rt_led1_thread_stack[0],sizeof(rt_led1_thread_stack),3,20);
	//开启线程调度
	rt_thread_startup(&led1_thread);
}
 
//主任务
void MX_RT_Thread_Process(void)
{
	printf("Hello RT_Thread!!!");
	rt_thread_delay(2000);
}
 
//LED1任务
void led1_task_entry(void *parameter)
{
	while(1)
	{
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3, GPIO_PIN_RESET);
		rt_thread_delay(500);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3, GPIO_PIN_SET);
		rt_thread_delay(500);
	}
}

修改board.c的77行:在这里插入图片描述
将rtconfig.h的145行取消注释:在这里插入图片描述
在main.c中添加代码:

extern void MX_RT_Thread_Init(void);
extern void MX_RT_Thread_Process(void);

在这里插入图片描述
在while循环中添加以下代码:在这里插入图片描述

	  HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_4);
		rt_thread_delay(1000);

版权声明:本文为CSDN博主「weixin_50909683」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_50909683/article/details/122253936

RT-thread

概述

RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。事实上,一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务的执行时间很短、任务与任务之间通过任务调度器进行非常快速地切换(调度器根据优先级决定此刻该执行的任务),给人造成多个任务在一个时刻同时运行的错觉。在 RT-Thread 系统中,任务是通过线程实现的,RT-Thread 中的线程调度器也就是以上提到的任务调度器。

RT-Thread 主要采用 C 语言编写,浅显易懂,方便移植。它把面向对象的设计方法应用到实时系统设计中,使得代码风格优雅、架构清晰、系统模块化并且可裁剪性非常好。针对资源受限的微控制器(MCU)系统,可通过方便易用的工具,裁剪出仅需要 3KB Flash、1.2KB RAM 内存资源的 NANO 版本(NANO 是 RT-Thread 官方于 2017 年 7 月份发布的一个极简版内核);而对于资源丰富的物联网设备,RT-Thread 又能使用在线的软件包管理工具,配合系统配置工具实现直观快速的模块化裁剪,无缝地导入丰富的软件功能包,实现类似 Android 的图形界面及触摸滑动效果、智能语音交互效果等复杂功能。

相较于 Linux 操作系统,RT-Thread 体积小,成本低,功耗低、启动快速,除此以外 RT-Thread 还具有实时性高、占用资源小等特点,非常适用于各种资源受限(如成本、功耗限制等)的场合。虽然 32 位 MCU 是它的主要运行平台,实际上很多带有 MMU、基于 ARM9、ARM11 甚至 Cortex-A 系列级别 CPU 的应用处理器在特定应用场合也适合使用 RT-Thread。

架构

RT-Thread 与其他很多 RTOS 如 FreeRTOS、uC/OS 的主要区别之一是,它不仅仅是一个实时内核,还具备丰富的中间层组件
在这里插入图片描述

  • 内核层:RT-Thread 内核,是 RT-Thread 的核心部分,包括了内核系统中对象的实现,例如多线程及其调度、信号量、邮箱、消息队列、内存管理、定时器等;libcpu/BSP(芯片移植相关文件 / 板级支持包)与硬件密切相关,由外设驱动和 CPU 移植构成。

  • 组件与服务层:组件是基于 RT-Thread 内核之上的上层软件,例如虚拟文件系统、FinSH 命令行界面、网络框架、设备框架等。采用模块化设计,做到组件内部高内聚,组件之间低耦合。

  • RT-Thread 软件包:运行于 RT-Thread 物联网操作系统平台上,面向不同应用领域的通用软件组件,由描述信息、源代码或库文件组成。RT-Thread 提供了开放的软件包平台,这里存放了官方提供或开发者提供的软件包,该平台为开发者提供了众多可重用软件包的选择,这也是 RT-Thread 生态的重要组成部分。软件包生态对于一个操作系统的选择至关重要,因为这些软件包具有很强的可重用性,模块化程度很高,极大的方便应用开发者在最短时间内,打造出自己想要的系统。RT-Thread 已经支持的软件包数量已经达到 60+,如下举例:

  • 物联网相关的软件包:Paho MQTT、WebClient、mongoose、WebTerminal 等等。

  • 脚本语言相关的软件包:目前支持 JerryScript、MicroPython。

  • 多媒体相关的软件包:Openmv、mupdf。

  • 工具类软件包:CmBacktrace、EasyFlash、EasyLogger、SystemView。

  • 系统相关的软件包:RTGUI、Persimmon UI、lwext4、partition、SQLite 等等。

  • 外设库与驱动类软件包:RealTek RTL8710BN SDK。

  • 其他。

完整丰富的组件

  1. 实时操作系统内核
    资源占用极少,最小版本仅需要3KB ROM和2KB RAM;线程上下文切换时间很短,在Cortex-M3上测试,挂起操作引起上下文切换时间仅为4.25us

  2. 设备框架
    名字化的对象化设备模型,上层应用与底层硬件设备无关,上层应用只需要查找相应的设备名获得设备句柄即可采用抽象的设备接口进行底层硬件的访问操作

  3. 虚拟文件系统
    为上层应用提供统一的文件访问接口,而不需要关心底层文件系统的具体实现及存储方式;支持FAT、UFFS、NFSv3 、 ROMFS和RAMFS等多种文件系统

  4. 应用框架
    RTT提供了各类应用框架来满足应用快速开发需求,如TLS/DTLS、实时数据库SQL LITE、机器间通信M2M、拨号网络框架RealRIL等

  5. 用户接口
    提供方便用户调试、查看信息的各种接口,包括Finsh、Msh、GDB Stub等

  6. GUI
    RTT的Persimmon UI异常强大,支持多点触摸操作和多种界面动画增强效果;支持TTF矢量字库,针对MCU优化的自定义图像格式,大幅提升图片加载和渲染速度;支持多国语言

  7. 网络协议栈
    支持丰富的市场所需的各种网络协议栈,包括MQTT、LWM2M、CoAP、HTTP、Web socket、LWIP、UDP、PPP、IPv6、Modbus、CAN工业协议等

  8. 低功耗组件
    提供了与上层应用无关的低功耗框架组件,开发者能够方便的开发出低功耗特性

许可协议

RT-Thread 系统完全开源,3.1.0 及以前的版本遵循 GPL V2 + 开源许可协议。从 3.1.0 以后的版本遵循 Apache License 2.0 开源许可协议,可以免费在商业产品中使用,并且不需要公开私有代码。

RTT-nano

RT-Thread Nano是一个极简的硬实时内核,它还具备体积小、启动快速、实时性高、占用资源小等特点。

适用于系统资源紧张或是项目功能较为简单,仅需使用RTOS内核,无需丰富功能的场景,且开发时无需额外的辅助工具。
在这里插入图片描述

创建项目

项目创建参考:

代码

  • 主函数中添加
        HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_4);
		rt_thread_delay(1000);
        HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_3);
		rt_thread_delay(1000);
  • Application/User/Core中新建文件app_rt_thread.c
#include "rtthread.h"
#include "main.h"
#include "stdio.h"
 
struct rt_thread led1_thread;
rt_uint8_t rt_led1_thread_stack[128];
void led1_task_entry(void *parameter);
 
//初始化线程函数
void MX_RT_Thread_Init(void)
{
	//初始化LED1线程
	rt_thread_init(&led1_thread,"led1",led1_task_entry,RT_NULL,&rt_led1_thread_stack[0],sizeof(rt_led1_thread_stack),3,20);
	//开启线程调度
	rt_thread_startup(&led1_thread);
}
 
//主任务
void MX_RT_Thread_Process(void)
{
	printf("Hello RT_Thread!!!");
	rt_thread_delay(2000);
}
 
//LED1任务
void led1_task_entry(void *parameter)
{
	while(1)
	{
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3, GPIO_PIN_RESET);
		rt_thread_delay(500);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3, GPIO_PIN_SET);
		rt_thread_delay(500);
	}
}

  • 修改board.c内的串口为USART1
    在这里插入图片描述
  • 取消rtconfig.h中的注释
    在这里插入图片描述

编译运行

在这里插入图片描述

总结

  1. 仍旧需要注意的是烧录时Boot0要置1,查看结果时Boot0要置0,并Reset。
  2. RT-thread的移植相较于uCOSII的移植来说要简单很多了,按步骤,没问题的。

裸机程序的运行缺点

采用中断和查询结合的方式可以解决大部分裸机应用,但随着工程的复杂,裸机方式的缺点就暴露出来了:

  1. 必须在中断 (ISR) 内处理时间关键运算 内处理时间关键运算
  2. ISR ISR 函数变得非常复杂,并且需要很长执行时间 。
  3. ISR ISR 嵌套可能产生不预测的执行时间和堆栈 需求。
  4. 超级循环和 ISR 之间的 数据交换是通过全局共享变量进行:
  5. 应用程序的员必须确保数据一致性 。
  6. 超级循环可以与系统计时器轻松同步,但:
  7. 如果系统需要多种不同的周期时间,则会很难实现 。
  8. 超过 超级循环周期的耗时函数需要做拆分。
  9. 增加 软件开销,应用程序难以理解 。
  10. 超级循环 使得 应用程序变得非常复杂,因此难以扩展 :
  11. 一个简单的更改就可能产生不预测副作用 ,对这种副作用进行分析非常耗时。
  12. 超级循环概念的这些缺点可以通过使用实时操作系统 (RTOS) 来解决。

更多详情:freeRTOS与裸机程序相比有什么区别??

参考

版权声明:本文为CSDN博主「天狼溯光者」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_51120713/article/details/122252160

生成海报
点赞 0

天狼溯光者

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

RT-thread Nano移植

RT-thread 概述 RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务

串口不定长接收

一、保留接收区和开启接收的语句    uint8_t buffer[5];HAL_UART_Transmit_IT(&huart1,buffer,3); 二、写入开启空闲中断的语句    __HAL_UART_ENABLE_IT(&huart