STM32 —— RT-Thread Nano 移植


实验环境

KEIL
STM32F103C8T6
杜邦线
mcuisp烧录工具
firetool串口助手

一、RT-Thread系统

概述

它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务。事实上一个处理器核心在某时刻只能运行一个任务,由于每次对一个任务的执行时间很短、任务与任务之间通过任务调度器进行快速的切换,给人造成多个任务在同一时刻同时运行的错觉。
RT-Threa系统中,任务通过线程实现的,RT-Thread中的线程调度器也就是以上提到的任务调度器。

架构

物联网操作系统是指以操作系统内核(RTOS\Linux等)为基础,包括如文件系统、图形库等较为完整的中间件组件,具备低功耗、安全、通信协议支持和云端连接能力的软件平台。
RT-Thread与其他很多RTOS主要区别之一是:它不仅仅是一个实时内核,还具备丰富的中间层组件,如下图所示。
在这里插入图片描述

  • 内核层:RT-Thread内核,是RT-Thread的核心部分,包括了内核系统中对象的实现,例如多线程及其调度、信号量、邮箱、消息队列、内存管理、定时器等;libcpu/BSP(芯片移植相关文件/板级支持包)与硬件密切相关,由外设驱动和CPU移植构成。
  • 组件与服务层:组件是基于RT-Thread内核之上的上层软件,例如虚拟文件系统、FinSH命令行界面、网络框架、设备框架等。采用模块化设计,做到组件内部高内聚,组件之间低耦合。
  • RT-Thread软件包:运行于RT-Thread物联网操作系统平台上,面向不同应用领域的通用软件组件,由描述信息、源代码或库文件组成。
  • 物联网相关的软件包:Paho MQTT、WebClient、mongoose、WebTerminal 等等。
  • 脚本语言相关的软件包:目前支持 JerryScript、MicroPython。
  • 多媒体相关的软件包:Openmv、mupdf。
  • 工具类软件包:CmBacktrace、EasyFlash、EasyLogger、SystemView。
  • 系统相关的软件包:RTGUI、Persimmon UI、lwext4、partition、SQLite 等等。
  • 外设库与驱动类软件包:RealTek RTL8710BN SDK。

二、CubeMX 安装 Nano Pack

这里我们可以参考官方的教程:基于 CubeMX 移植 RT-Thread Nano

要获取 RT-Thread Nano 软件包,需要在 CubeMX 中添加
https://www.rt-thread.org/download/cube/RealThread.RT-Thread.pdsc

这里我们需要使用在 CubeMX 中添加硬件包同样的方式来添加我们要使用的 RT-Thread Nano 软件包,过程如下:

  1. 打开 CubeMX,从菜单栏 help 进入 Manage embedded software packages 界面,点击 From Url 按钮,进入 User Defined Packs Manager 界面,其次点击 new,填入上述网址,然后点击 check,
    在这里插入图片描述
    在这里插入图片描述
  2. 下载安装完成后如下,前面的勾选框变为绿色
    在这里插入图片描述

三、Keil MDK安装 RT-Thread

  1. 官方参考资料
    具体请请参照:
    https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-nano/nano-port-keil/an0039-nano-port-keil?id=%E6%96%B9%E6%B3%95%E4%B8%80%EF%BC%9A%E5%9C%A8-ide-%E5%86%85%E5%AE%89%E8%A3%85

  2. IDE内安装具体步骤
    (1)打开 MDK 软件,点击工具栏的 Pack Installer 图标:
    在这里插入图片描述
    (2)点击右侧的 Pack,展开 Generic,可以找到 RealThread::RT-Thread,点击 Action 栏对应的 Install ,就可以在线安装 Nano Pack 了。
    在这里插入图片描述

四、CubeMX 项目配置

  1. 芯片选择STM32F103C8
    在这里插入图片描述
  2. 选择 Nano 组件
    (1)点击 Softwares Packages->Select Components,进入组件配置界面
    在这里插入图片描述
    (2)选择 RealThread, 然后根3.1.5版本的,然后点击 OK 按钮
    在这里插入图片描述
    (3)这时会新增Software Packs展开就可以看见添加的RealThread.RT_Thread,勾选相应内容
    在这里插入图片描述
    (4)RCC配置
    在这里插入图片描述
    (5)SYS配置
    在这里插入图片描述
    (6)USART1配置
    在这里插入图片描述
    (7)GPIO选择PC13,模式选择推挽输出,用于点亮LED
    在这里插入图片描述
    (8)NVIC选择
    在这里插入图片描述
    (9)时钟树配置
    在这里插入图片描述
    (10)生成项目
    在这里插入图片描述
    在这里插入图片描述

五、代码修改

1.创建任务

  • 主要是一个LED灯任务,一个串口发送任务,一个每0.5秒变化一次,一个每1秒发送一次。
  • 在Application/USER文件夹下新建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(1000);
}
 
//LED1任务
void led1_task_entry(void *parameter)
{
    
    
	while(1)
	{
    
    
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13, GPIO_PIN_RESET);
		rt_thread_delay(500);
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13, GPIO_PIN_SET);
		rt_thread_delay(500);
	}
}
  1. 找到Middlewares/RT-Thread/RTOS/kernel文件夹下的board.c文件,修改串口USART2为USART1
    在这里插入图片描述
  2. 找到Application/User/Core里app_rt_thread.c下的rtconfig.h
    在这里插入图片描述
  3. 在main.c文件中添加代码:
extern void MX_RT_Thread_Init(void);
extern void MX_RT_Thread_Process(void);
  1. main函数代码如下:
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)
  {
    
    
    /* USER CODE END WHILE */
	MX_RT_Thread_Process();
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

  1. 另外还有重写printf函数,在usart.c中添加以下代码,记住要加入#include<stdio.h>头文件
#ifdef __GNUC__
/* With GCC, 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__ */
 
 
PUTCHAR_PROTOTYPE
{
    
    
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART2 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}

要勾选上Use MicoLIB选项
在这里插入图片描述

六、运行结果

在这里插入图片描述

七、实验总结

本次实验用到了RT-Thread Nano ,它是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小。Nano开源免费,小巧,简单是它的优点。

猜你喜欢

转载自blog.csdn.net/qq_52187415/article/details/128447714