RT-Thread入门(一)
前言:在使用单片机的时候一直有听说RT-Thread十分强大,这几天稍稍接触了一些,发现确实十分好用,总结一些使用过程中的步骤,希望对大家的开发有些许帮助,因本人能力有限,某些地方可能介绍的不是很清楚,大家有什么问题可以留言交流。
之前学习32都是跟着原子哥的视频学的,这里很多内容借鉴正点原子的内容,代码风格也与他的类似;至于固件库st既然一直推广hal库就使用他啦,这样在移植到F4、F7以上的单片机时就容易多了。
好的下面进入正题:至于RT-Thread的介绍网上已经有很多了,这里我就不再罗嗦了。
电脑环境:win10+keil5.14+jlink
rt-thread:版本 RT-Thread 3.0.4
硬件环境:stm32c8t6
软件环境:HAL库,正点原子例程
文件移植
1 从官网下载RT-Thread源码,里面包含stm32f1xx的例程。https://www.rt-thread.org/page/download.html
新建一个名叫Project的文件夹,把rtconfig.h放到里面,以后在application放置用户文件,Project放置Keil工程文件。
Bsp ———————— 板级支持包,针对不同的板子规划出的不同的驱动文件;
components ———— 包含RT-Thread的各个组件:finsh、文件系统,等;
documentation ———一些介绍性文档,包括代码的风格要求;
examples —————各种示例代码,是很好的学习素材;
include ——————一些头文件;
libcpu———————各种CPU体系结构下的相关移植;
src————————RT-Thread内核核心代码;
tools ———————使用Scon自动化创建工具时需要的一些文件;
文件有这些就够了,下面就是新建工程了。
2 建立工程
新建工程,芯片型号选择stm32f103c8
因为我们已经把源码拷到工程目录里了,这里什么都不选直接点击OK。
这样就建立了一个空白工程。
3 向项目中添加文件
文件夹 | 路径 | 文件 |
---|---|---|
Applications | \applications | main.c |
Drivers | /drivers | board.c、stm32f1xx_it.c、drv_gpio.c、drv_usart.c |
STM32_HAL | /Libraries/STM32F1xx_HAL_Driver/Src \Libraries\CMSIS\Device\ST\STM32F1xx\Source\Templates \Libraries\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm | Src下所有 system_stm32f1xx.c startup_stm32f103xb.s |
Kernel | \src | src下所有 |
CORTEX-M3 | \libcpu\arm\common 和 \libcpu\arm\cortex-m3 | common下所有 cortex-m3下cpuport.c、context_rvds.S |
DeviceDrivers | \components\drivers\misc和\components\drivers\serial和\components\drivers\src | pin.c、serial.c和src下所有 |
finsh | \components\finsh | cmd.c、msh.c、msh_cmd.c、msh_file.c、shell.c、symbol.c |
4 添加头文件
头文件就把下面这个图里面的路径都添加到里面就行了,添加的时候顺便把C99Mode选上,并且把Define 填上 STM32F103xE, USE_HAL_DRIVER。
5 编译一下,发现没有错误没有警告,这样文件部分就移植完成了。
如果有错误就自行百度吧,哈哈哈哈哈哈哈,嗯应该不会有太大的问题的吧。
6 验证程序
下面就可以测试一下rtos是否可以跑起来啦。
这里我们使用正点原子提供和HAL库里面的驱动文件 ,将正点原子的led和sys文件夹里的文件放到application文件夹中,然后添加到工程中。
编译一下,发现有一个错误 error: #20: identifier “GPIO_SPEED_HIGH” is undefined
这是什么原因呢?这就是一个定义啊,在原工程中肯定是没错的啊?
我们打开刚才移植用的工程,寻找一下他在哪里定义的。
发现他是在stm32_hal_legacy.h中定义的。这个文件是做什么的,他在哪?
在原工程中全局查找一下这个头文件在哪里使用了。
发现这里有一个#ifdef 查找一下发现它并没有用到,我们需要使用这个文件那就把#if defined 和#endif删掉试试吧,编译一下,没有错误没有警告。
OK,下面就是添加初始化和功能部分了。
简单看一下RT-Thread就会知道系统启动会先执行board.c下面的rt_hw_board_init()然后再执行main.c里的main函数,这里将初始化程序放到rt_hw_board_init()函数里面。
这里我们使用一个LED灯和串口来测试,led使用刚才移植过来的led.c,串口的话系统已经为我们配置好了,只要将初始化放到这里就可以了。
首先,添加头文件和初始化部分:
#include "led.h"
#include "drv_usart.h"
/**
* This function will initial STM32 board.
*/
void rt_hw_board_init(void)
{
HAL_Init();
SystemClock_Config();
LED_Init();
rt_hw_usart_init();
#ifdef RT_USING_HEAP
rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
#endif
#ifdef RT_USING_COMPONENTS_INIT
rt_components_board_init();
#endif
#ifdef RT_USING_CONSOLE
rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif
}
修改main.c
#include <rtthread.h>
#include "LED.h"
int main(void)
{
/* user app entry */
while(1)
{
LED0=0;
rt_thread_mdelay(500);
LED0=1;
rt_thread_mdelay(500);
rt_kprintf("hello RT-Thread!\n");
}
}
编译一下,没有错误没有警告,下面就是下载实验了。
串口初始化会把RT-Thread的信息显示出来。也可以看到小灯开始闪烁了,程序没问题了;
这篇文章就结束了,下一篇我们开始建立线程跑一个真正的程序了。
总结
确实RT-Thread还是比较容易移植的,虽然网上的教程不是很多,不过官网的支持和各种文档比较详细。
在移植过程中,有很多文件也是非必需的,比如HAL库中很多文件没有使用到就可以不添加到工程里面,还有finsh分组存放的是系统的插件也是非必需加到工程中的,这里全部都加进来了方便移植,并且我还未测试哪些文件删除之后不会对工程产生影响。
留下几个网站方便大家查找资料:
rt-thread官网:https://www.rt-thread.org
rt-thread文档中心:https://www.rt-thread.org/document/site/
《RT-Thread编程指南》:https://www.rt-thread.org/document/site/um4003-rtthread-programming-manual.pdf
PS:第一次写博客,鉴于本人能力有限上文存在一些错误和不好的地方欢迎大家批评指正,相互交流学习。