STM32F103C8移植RT_Thread

一、RT-Thread概述

1、国产RT-Thread操作系统的特点和优势

RT-Thread实时操作系统是一个分层的操作系统,它包括了:
• 组件层components,这些是基于RT-Thread核心基础上的外围组件,把一些功能模块划分成独立的一个个组件模块,做到组件与组件之间的低耦合,组件内部的高内聚。
 例如文件系统,命令行shell接口,lwIP轻型TCP/IP协议栈,GUI图形用户界面等。
• 硬实时内核kernel,这层是RT-Thread的核心,包括了内核系统中对象的实现,例如多线程及其调度,信号量,邮箱,消息队列,内存管理,定时器等实现。
•分支接口porting,主要由libcpu以及不同硬件平台的bsp构成,即RT-Thread支持的一个个芯片移植,外设驱动等
在这里插入图片描述

2、RTT Nano的功能框架

RT-Thread Nano是一个极简的硬实时内核,它还具备体积小、启动快速、实时性高、占用资源小等特点。
适用于系统资源紧张或是项目功能较为简单,仅需使用RTOS内核,无需丰富功能的场景,且开发时无需额外的辅助工具。
在这里插入图片描述

二、准备工作

1、CubeMX 安装Nano pack

(1)获取软件包地址

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

(2)打开 CubeMX

从菜单栏 help 进入 Manage embedded software packages 界面,点击 From Url 按钮,进入 User Defined Packs Manager 界面,其次点击 new,填入上述网址,然后点击 check
在这里插入图片描述

(3)下载安装完成后如下,前面的勾选框变为绿色

在这里插入图片描述

2、Keil MDK安装 RT-Thread

(1)打开 MDK 软件,点击工具栏的 Pack Installer 图标

在这里插入图片描述

(2)点击右侧的 Pack

展开 Generic,可以找到 RealThread::RT-Thread,点击 Action 栏对应的 Install ,就可以在线安装 Nano Pack 了。
在这里插入图片描述

三、CubuMX新建文件

1、芯片选择STM32F103C8

在这里插入图片描述

2、选择 Nano 组件

(1)点击 Softwares Packages

选择Select Components,进入组件配置界面
在这里插入图片描述

(2)选择 RealThread

然后根3.1.5版本的,然后点击 OK 按钮
在这里插入图片描述

(3)这时会新增Software Packs

展开就可以看见添加的RealThread.RT_Thread,勾选相应内容
在这里插入图片描述

3、RCC配置

在这里插入图片描述

4、SYS配置

在这里插入图片描述

5、USART1配置

在这里插入图片描述

6、GPIO选择A3,A4串口

在这里插入图片描述

7、NVIC选择

在这里插入图片描述

8、时钟树配置

在这里插入图片描述

9、生成项目

在这里插入图片描述
创建完成后用Keil MDK打开

四、代码修改

1、Keil添加 RT-Thread Nano 到工程

(1)打开刚才用CubeMX创建的项目

点击点击 Manage Run-Time Environment。
在这里插入图片描述

(2)找到 RTOS勾选 kernel,点击 OK

在这里插入图片描述

2、代码添加修改

(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(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);
	}
}

在这里插入图片描述

(2)找到board.c文件

修改串口USART2为USART1
在这里插入图片描述
在这里插入图片描述

(3)找到app_rt_thread.c下的rtconfig.h

在这里插入图片描述

(4)在main.c文件中添加代码

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
extern void MX_RT_Thread_Init(void);
extern void MX_RT_Thread_Process(void);
 
/* USER CODE END PTD */

(5)在main函数里添加如下代码

  MX_RT_Thread_Init();

while循环中添加代码

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

五、运行结果

在这里插入图片描述

六、总结

通过这学期的学习,我接触到了嵌入式系统基础这门课程,使我受益良多。在刚接触这门课的时候感觉有点难度,但我很庆幸我能坚持下来。

这一学期在这门课上花的还是蛮多的,学习了串口通信、点亮LED流水灯、点阵汉字的字模读取、modbus、RT-Thread等。嵌入式系统基础是一门软件硬件相结合的课程,没接触之前,感觉特别的难与抵触,但当我点亮第一个LED灯的时候,喜悦之情是无法用文字表达出来的。就这样,每次调试并成功运行,都成为了我学习的动力并对这门课多了一份热爱。

这次期末大作业,主要是stm32f103上移植 RTT Nano。由于之前在13周时已经完成了部分工作,所以此次作业总体来说难度不大,总体来说还算顺利。但过程中也遇到了一部分的问题,在一些步骤上卡住,但网上教程较多,跟着步骤一步步做下来,也能大致完成要求。在以后的学习中,我一定努力提升专业知识,从多角度完善该项目。

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

一、介绍RT-Thread特点和优势

RT-Thread是一款国产的实时操作系统,为了解决两个问题:

一个是早期的CPU任务切换的开销太大,实时调度器可以避免任务频繁切换导致CPU时间的浪费;
另一个是在一些特殊的应用场景中,必须要保证重要的任务优先被执行。
实时操作系统(RTOS)又称,即时操作系统,它会按照排序运行、管理系统资源,并为开发应用程序提供一致的基础。

实时操作系统与一般的操作系统相比,最大的特色就是“实时性”,如果有一个任务需要执行,实时操作系统会在较短时间内执行该任务,不会有较长的延时,以此保证了各个任务的及时执行。
实时操作系统中都要包含一个实时任务调度器,这个任务调度器与其他操作系统的最大不同是强调:严格按照优先级来分配CPU时间,并且时间片轮转不是实时调度器的一个必选项。

1.架构

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

2.组件

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

二、在CubeMx上创建项目

1.CubeMX 安装Nano pack

1.1 获取软件包地址
下载软件包
需要在 CubeMX 中添加
1.2 打开 CubeMX,从菜单栏 help 进入 Manage embedded software packages 界面,点击 From Url 按钮,进入 User Defined Packs Manager 界面,其次点击 new,填入上述网址,然后点击 check,
在这里插入图片描述

1.3 添加software packs
在这里插入图片描述

在这里插入图片描述

2.创建项目

可参考此博客https://blog.csdn.net/qq_55691662/article/details/122016507?

3.在keil中安装 RT-Thread

3.1 我们也可以从官网下载安装文件,RT-Thread Nano 离线安装包下载,下载结束后双击文件进行安装:
在这里插入图片描述

3.2 添加 RT-Thread Nano 到工程
3.2.1 打开已经准备好的可以运行的裸机程序,将 RT-Thread 添加到工程。如下图,点击 Manage Run-Time Environment。
在这里插入图片描述

3.2.2 在 Manage Rum-Time Environment 里 “Software Component” 栏找到 RTOS,Variant 栏选择 RT-Thread,然后勾选 kernel,点击 “OK” 就添加 RT-Thread 内核到工程了。
在这里插入图片描述

3.2.3 现在可以在 Project 看到 RT-Thread RTOS 已经添加进来了,展开 RTOS,可以看到添加到工程的文件:
在这里插入图片描述

三、代码修改

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(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);
	}
}

2.找到Middlewares/RT-Thread/RTOS/kernel文件夹下的board.c文件,修改串口USART2为USART1
在这里插入图片描述

在这里插入图片描述

3.找到Application/User/Core里app_rt_thread.c下的rtconfig.h
在这里插入图片描述

4.在main.c文件中添加代码:

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

5.在main函数里添加如下代码

  MX_RT_Thread_Init();

while循环中添加代码

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

四、心得体会

在这里插入图片描述

参考链接:

https://blog.csdn.net/chenchengwudi/article/details/115473104

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

一、RT-Thread概述

1、国产RT-Thread操作系统的特点和优势

RT-Thread实时操作系统是一个分层的操作系统,它包括了:
• 组件层components,这些是基于RT-Thread核心基础上的外围组件,把一些功能模块划分成独立的一个个组件模块,做到组件与组件之间的低耦合,组件内部的高内聚。
 例如文件系统,命令行shell接口,lwIP轻型TCP/IP协议栈,GUI图形用户界面等。
• 硬实时内核kernel,这层是RT-Thread的核心,包括了内核系统中对象的实现,例如多线程及其调度,信号量,邮箱,消息队列,内存管理,定时器等实现。
•分支接口porting,主要由libcpu以及不同硬件平台的bsp构成,即RT-Thread支持的一个个芯片移植,外设驱动等
在这里插入图片描述

2、RTT Nano的功能框架

RT-Thread Nano是一个极简的硬实时内核,它还具备体积小、启动快速、实时性高、占用资源小等特点。
适用于系统资源紧张或是项目功能较为简单,仅需使用RTOS内核,无需丰富功能的场景,且开发时无需额外的辅助工具。
在这里插入图片描述

二、准备工作

1、CubeMX 安装Nano pack

(1)获取软件包地址

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

(2)打开 CubeMX

从菜单栏 help 进入 Manage embedded software packages 界面,点击 From Url 按钮,进入 User Defined Packs Manager 界面,其次点击 new,填入上述网址,然后点击 check
在这里插入图片描述

(3)下载安装完成后如下,前面的勾选框变为绿色

在这里插入图片描述

2、Keil MDK安装 RT-Thread

(1)打开 MDK 软件,点击工具栏的 Pack Installer 图标

在这里插入图片描述

(2)点击右侧的 Pack

展开 Generic,可以找到 RealThread::RT-Thread,点击 Action 栏对应的 Install ,就可以在线安装 Nano Pack 了。
在这里插入图片描述

三、CubuMX新建文件

1、芯片选择STM32F103C8

在这里插入图片描述

2、选择 Nano 组件

(1)点击 Softwares Packages

选择Select Components,进入组件配置界面
在这里插入图片描述

(2)选择 RealThread

然后根3.1.5版本的,然后点击 OK 按钮
在这里插入图片描述

(3)这时会新增Software Packs

展开就可以看见添加的RealThread.RT_Thread,勾选相应内容
在这里插入图片描述

3、RCC配置

在这里插入图片描述

4、SYS配置

在这里插入图片描述

5、USART1配置

在这里插入图片描述

6、GPIO选择A3,A4串口

在这里插入图片描述

7、NVIC选择

在这里插入图片描述

8、时钟树配置

在这里插入图片描述

9、生成项目

在这里插入图片描述
创建完成后用Keil MDK打开

四、代码修改

1、Keil添加 RT-Thread Nano 到工程

(1)打开刚才用CubeMX创建的项目

点击点击 Manage Run-Time Environment。
在这里插入图片描述

(2)找到 RTOS勾选 kernel,点击 OK

在这里插入图片描述

2、代码添加修改

(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(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);
	}
}

在这里插入图片描述

(2)找到board.c文件

修改串口USART2为USART1
在这里插入图片描述
在这里插入图片描述

(3)找到app_rt_thread.c下的rtconfig.h

在这里插入图片描述

(4)在main.c文件中添加代码

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
extern void MX_RT_Thread_Init(void);
extern void MX_RT_Thread_Process(void);
 
/* USER CODE END PTD */

(5)在main函数里添加如下代码

  MX_RT_Thread_Init();

while循环中添加代码

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

五、运行结果

在这里插入图片描述

六、总结

通过这学期的学习,我接触到了嵌入式系统基础这门课程,使我受益良多。在刚接触这门课的时候感觉有点难度,但我很庆幸我能坚持下来。

这一学期在这门课上花的还是蛮多的,学习了串口通信、点亮LED流水灯、点阵汉字的字模读取、modbus、RT-Thread等。嵌入式系统基础是一门软件硬件相结合的课程,没接触之前,感觉特别的难与抵触,但当我点亮第一个LED灯的时候,喜悦之情是无法用文字表达出来的。就这样,每次调试并成功运行,都成为了我学习的动力并对这门课多了一份热爱。

这次期末大作业,主要是stm32f103上移植 RTT Nano。由于之前在13周时已经完成了部分工作,所以此次作业总体来说难度不大,总体来说还算顺利。但过程中也遇到了一部分的问题,在一些步骤上卡住,但网上教程较多,跟着步骤一步步做下来,也能大致完成要求。在以后的学习中,我一定努力提升专业知识,从多角度完善该项目。

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

一、介绍RT-Thread特点和优势

RT-Thread是一款国产的实时操作系统,为了解决两个问题:

一个是早期的CPU任务切换的开销太大,实时调度器可以避免任务频繁切换导致CPU时间的浪费;
另一个是在一些特殊的应用场景中,必须要保证重要的任务优先被执行。
实时操作系统(RTOS)又称,即时操作系统,它会按照排序运行、管理系统资源,并为开发应用程序提供一致的基础。

实时操作系统与一般的操作系统相比,最大的特色就是“实时性”,如果有一个任务需要执行,实时操作系统会在较短时间内执行该任务,不会有较长的延时,以此保证了各个任务的及时执行。
实时操作系统中都要包含一个实时任务调度器,这个任务调度器与其他操作系统的最大不同是强调:严格按照优先级来分配CPU时间,并且时间片轮转不是实时调度器的一个必选项。

1.架构

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

2.组件

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

二、在CubeMx上创建项目

1.CubeMX 安装Nano pack

1.1 获取软件包地址
下载软件包
需要在 CubeMX 中添加
1.2 打开 CubeMX,从菜单栏 help 进入 Manage embedded software packages 界面,点击 From Url 按钮,进入 User Defined Packs Manager 界面,其次点击 new,填入上述网址,然后点击 check,
在这里插入图片描述

1.3 添加software packs
在这里插入图片描述

在这里插入图片描述

2.创建项目

可参考此博客https://blog.csdn.net/qq_55691662/article/details/122016507?

3.在keil中安装 RT-Thread

3.1 我们也可以从官网下载安装文件,RT-Thread Nano 离线安装包下载,下载结束后双击文件进行安装:
在这里插入图片描述

3.2 添加 RT-Thread Nano 到工程
3.2.1 打开已经准备好的可以运行的裸机程序,将 RT-Thread 添加到工程。如下图,点击 Manage Run-Time Environment。
在这里插入图片描述

3.2.2 在 Manage Rum-Time Environment 里 “Software Component” 栏找到 RTOS,Variant 栏选择 RT-Thread,然后勾选 kernel,点击 “OK” 就添加 RT-Thread 内核到工程了。
在这里插入图片描述

3.2.3 现在可以在 Project 看到 RT-Thread RTOS 已经添加进来了,展开 RTOS,可以看到添加到工程的文件:
在这里插入图片描述

三、代码修改

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(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);
	}
}

2.找到Middlewares/RT-Thread/RTOS/kernel文件夹下的board.c文件,修改串口USART2为USART1
在这里插入图片描述

在这里插入图片描述

3.找到Application/User/Core里app_rt_thread.c下的rtconfig.h
在这里插入图片描述

4.在main.c文件中添加代码:

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

5.在main函数里添加如下代码

  MX_RT_Thread_Init();

while循环中添加代码

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

四、心得体会

在这里插入图片描述

参考链接:

https://blog.csdn.net/chenchengwudi/article/details/115473104

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

生成海报
点赞 0

weixin_47300459

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

暂无评论

发表评论

相关推荐

【STM32Cube笔记】2-STM32Cube安装教程

【STM32Cube笔记】系列文章目录 1-基于STM32的VSCode入门级教程前言 2-STM32Cube安装教程 3-STM32CubeIDE汉化 4-STM32Cube配置时钟设置 5-跑马灯引脚配置 6-Cortex-M7内核基本配

STM32F4最小系统硬件设计

对于硬件工程师来讲,想要入门STM32相关的开发,我想除了深入阅读一下STM32的数据手册外,最实用且有效的方法就是自己实际做一个STM32的最小系统板了。本文将以一个小的STM32F427VG的电路最