RT-Thread Nano入门学习笔记

  • Post author:
  • Post category:其他




RT-Thread Nano入门学习笔记

作者:Linkk

更新时间:2021.02.17

学习过程中使用的芯片:stm32f103c8t6

库函数:标准库



资料获取

RT-Thread官网:

https://www.rt-thread.org/

RT-Thread Nano 文档中心:

https://www.rt-thread.org/document/site/tutorial/nano/an0038-nano-introduction/

RT-Thread 问答社区:

https://club.rt-thread.org/

RT-Thread Nano 入门教程:

https://www.bilibili.com/video/BV1of4y1S7Ju



RT-Thread Nano 官方简介

RT-Thread Nano 是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小,功能包括任务处理、软件定时器、信号量、邮箱和实时调度等相对完整的实时操作系统特性。适用于家电、消费电子、医疗设备、工控等领域大量使用的 32 位 ARM 入门级 MCU 的场合。

与 RT-Thread 完整版不同的是,Nano 不含 Scons 构建系统,不需要 Kconfig 以及 Env 配置工具,也去除了完整版特有的 device 框架和组件,仅是一个纯净的内核。



基于 Keil MDK 移植 RT-Thread Nano

官方文档教程:

https://www.rt-thread.org/document/site/tutorial/nano/nano-port-keil/an0039-nano-port-keil/

移植的过程在官方文档中写得很详细,也不难。将RT-Thread Nano添加到工程后,进入”stm32f10x_it.c”(我用的是芯片是stm32f103c8t6)删掉或注释掉三个函数即可:

1、void HardFault_Handler(void)

2、void PendSV_Handler(void)

3、void SysTick_Handler(void)

个人移植心得:

Nano Pack 安装时推荐使用手动安装,因为这样安装的速度更快。



RT-Thread Nano 配置

RT-Thread Nano 的配置在 rtconfig.h 中进行,通过开关宏定义来使能或关闭某些功能

官方文档教程:

https://www.rt-thread.org/document/site/tutorial/nano/nano-config/an0043-nano-config/



rt_kprintf 的实现

首先确保 RT_USING_CONSOLE 已经定义了,然后初始化要使用的串口,我用的是串口1

uart1_init(115200);

最后实现rt_hw_console_output函数即可,这个函数我放在urat.c中实现

//串口1发送一个字符串
void UART1_SendString(const char *str)
{	
	while(*str != '\0'){
		if(*str == '\n'){			//换行之前加一个回车
			while((USART1->SR&0X40)==0);  
			USART1->DR = (u8)'\r';
		}
		while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
		USART1->DR = (u8)*str++;
	}	
}

void rt_hw_console_output(const char *str)
{
	rt_enter_critical();	//进入临界段
	UART1_SendString(str);
	rt_exit_critical();		//退出临界段
}

注:rt_kprintf() 不能打印浮点数



在 Nano 上添加 FinSH 组件


RT-Thread FinSH

是 RT-Thread 的命令行组件(shell),提供一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息。它可以使用串口 / 以太网 / USB 等与 PC 机进行通信。

官方文档教程:

https://www.rt-thread.org/document/site/tutorial/nano/finsh-port/an0045-finsh-port/#nano-finsh



实现 rt_hw_console_getchar

要实现 FinSH 组件功能:既可以打印也能输入命令进行调试,控制台已经实现了打印功能,现在还需要在 board.c 中对接控制台输入函数,实现字符输入。

可以使用查询方式获取(注意不要死等,在未获取到字符时,需要让出 CPU),也可以使用中断方式获取。

如下是基于 STM32F103 标准库3.5的串口驱动对接的 rt_hw_console_getchar(),完成对接 FinSH 组件,其中获取字符采用查询方式。

// 移植 FinSH,实现命令行交互, 需要添加 FinSH 源码
char rt_hw_console_getchar(void)
{
 int ch = -1;
 if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
 {
     ch = (int)USART_ReceiveData(USART1);
 }
 else
 {
     if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)
     {
         USART_ClearFlag(USART1,USART_FLAG_TC);
     }
     rt_thread_mdelay(10);
 }
 return ch;  
}

移植FinSH成功后的效果:

在这里插入图片描述



版权声明:本文为weixin_45523734原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。