基于RTT Nano的多任务嵌入式程序设计
作者:互联网
基于RTT Nano的多任务嵌入式程序设计
一、国产RT-Thread操作系统概述
1.简述
RT-Thread实时操作系统是一个分层的操作系统,它包括了:
• 组件层components,这些是基于RT-Thread核心基础上的外围组件,把一些功能模块划分成独立的一个个组件模块,做到组件与组件之间的低耦合,组件内部的高内聚。
例如文件系统,命令行shell接口,lwIP轻型TCP/IP协议栈,GUI图形用户界面等。
• 硬实时内核kernel,这层是RT-Thread的核心,包括了内核系统中对象的实现,例如多线程及其调度,信号量,邮箱,消息队列,内存管理,定时器等实现。
•分支接口porting,主要由libcpu以及不同硬件平台的bsp构成,即RT-Thread支持的一个个芯片移植,外设驱动等
2.特点
①体积小,可伸缩、易裁剪最小资源占用 1.2KB RAM 和 2.5KB flash。
②针对物联网场景提供的众多组件和软件包,比如 AT组件、WiFi、蓝牙、LoRa、Sensor、AI 等等,以及针对安全和低功耗的优化,
③代码质量优秀,linux内核风格,增加了小程序、SMP 多核调度、PSA 安全支持等多项的功能。
3.优势
相比Linux操作系统,RT-Thread体积小、功耗低、启动快速,还具有实时性高、占用资源小等特点,非常适用于各种资源受限的场合。
而“美”则是RT-Thread优化了使用和开发体验,增加了小程序、SMP多核调度、PSA安全支持等多项实用的新功能,使得RT-Thread系统能实现灵活极简的应用开发,能扩展至众多高性能、高安全的应用领域。
二、RTT-Nano的功能框架
RT-Thread Nano是一个极简的硬实时内核,它还具备体积小、启动快速、实时性高、占用资源小等特点。
适用于系统资源紧张或是项目功能较为简单,仅需使用RTOS内核,无需丰富功能的场景,且开发时无需额外的辅助工具。
三、在stm32F103上移植RTT Nano
1.添加RT-Thread系统组件
获取RT-Thread Nano软件包
软件包
2.创建工程及配置项目
在CubeMX中新建项目(同之前)
配置sys
配置RCC
设置引脚PA6和PA7
设置串口USART1
设置时钟树
配置RT-Thread组件
选择
填写项目相关信息
生成代码(在keil中打开)
3.点灯
在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_6, GPIO_PIN_RESET);
rt_thread_delay(500);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6, GPIO_PIN_SET);
rt_thread_delay(500);
}
}
Middlewares/RT-Thread/RTOS/kernel文件夹下的board.c,修改串口为USART2。
在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 */
在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 */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_RT_Thread_Init();
在main函数的while循环中添加代码
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_7);
rt_thread_delay(1000);
编译烧录运行代码
在硬件在stm32F103上实现电灯
四、心得体会
采用中断和查询结合的方式可以解决大部分裸机应用,但随着工程的复杂,裸机方式的缺点就暴露出来了: 必须在中断 (ISR) 内处理时间关键运算 内处理时间关键运算 ; ISR ISR 函数变得非常复杂,并且需要很长执行时间 ; ISR ISR 嵌套可能产生不预测的执行时间和堆栈 需求;超级循环和 ISR 之间的 数据交换是通过全局共享变量进行; 应用程序的员必须确保数据一致性 ; 超级循环可以与系统计时器轻松同步,但 如果系统需要多种不同的周期时间,则会很难实现 。而针对这些情况,使用多任务系统就可以解决这些问题。多任务系统或者说RTOS的实现,重点就在这个调度器上,而调度器的作用就是使用相关的调度算法来决定当前需要执行的任务。创建了任务并完成OS初始化后,就可以通过调度器来决定任务A,任务B和任务C的运行,从而实现多任务系统。
学习了嵌入式系统基础这门课,对嵌入式操作系统有了基本的认识和基础的掌握;能运用CubeMX生成项目用keil运行从而实现一些stm3F103硬件的操作。使用过程中遇到了很多问题,需要耐心的查找资料或者向同学询问,不能轻易放弃,一旦放弃就是会累积从而跟不上老师的节奏,心态要平和态度要积极才能学有所得学有所成。
标签:RT,rt,Thread,thread,Nano,RTT,void,led1,多任务 来源: https://blog.csdn.net/qq_51086303/article/details/122517807