文章目录
实验环境
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 软件包,过程如下:
- 打开 CubeMX,从菜单栏 help 进入 Manage embedded software packages 界面,点击 From Url 按钮,进入 User Defined Packs Manager 界面,其次点击 new,填入上述网址,然后点击 check,
- 下载安装完成后如下,前面的勾选框变为绿色
三、Keil MDK安装 RT-Thread
-
IDE内安装具体步骤
(1)打开 MDK 软件,点击工具栏的 Pack Installer 图标:
(2)点击右侧的 Pack,展开 Generic,可以找到 RealThread::RT-Thread,点击 Action 栏对应的 Install ,就可以在线安装 Nano Pack 了。
四、CubeMX 项目配置
- 芯片选择STM32F103C8
- 选择 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);
}
}
- 找到Middlewares/RT-Thread/RTOS/kernel文件夹下的board.c文件,修改串口USART2为USART1
- 找到Application/User/Core里app_rt_thread.c下的rtconfig.h
- 在main.c文件中添加代码:
extern void MX_RT_Thread_Init(void);
extern void MX_RT_Thread_Process(void);
- 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 */
}
- 另外还有重写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开源免费,小巧,简单是它的优点。