期间几个月时间关于 rt-thread 的项目有好几个,感觉最近 rt-thread 越来越火,
在几年前用过 rt-thread,那个时候都还没有rt-thread studio ide,现在啥都有了。
rt-thread官方资料也多,理论,示例,说明应有尽有,自己重新学习一边,做个记录贴。
目录
前言
1、rt-thread 版本(以哪个版本开始学习)
1.1 rt-thread nano
1.2 rt-thread 标准版
1.3 rt-thread smart
2、rt-thread 开发环境
2.1 开发板(自己画的开发板)
2.2 开发工具
2.3 环境搭建
2.4 rt-thread studio for vscode
3、第一个工程
3.1 根据自己环境新建工程
3.2 配合 cubemx 配置使用
3.2.1 sconscript 文件修改
3.2.2 cubemx 再次修改配置问题记录
3.3 创建一个跑马灯任务
————————————————
前言 作为一款国产的操作系统,相对其他操作系统,官网对大部分工程师来说友好到了极点 = =!
什么资料直接可以查看官网即可。所以有问题,先上官网!
1、rt-thread 版本(以哪个版本开始学习) 目前来说,rt-thread 主要分为3个大版本,这个在文档中心就有,这里列出来根据自己的情况简单说明一下:
1.1 rt-thread nano
rt-thread nano 和 freertos 是比较类似的东西 ,一个内核,nano适用于一些 内存 空间小的mcu, 就比如我现在常用的 stm32l051c8 ,只有8kb 的ram 空间,在讲解freertos 的时候使用 stm32l051c8 不止一次的提到内存问题。
学习的话根据自己需要,建议还是从标准版本开始学习,因为标准版本包含nano的一切,还多出了很多组件,方便使用的软件包等。
实际应用的话,在一般普通的应用项目上,nano估计用起来还更多,内存就是成本!
rt-thread nano 的资料可以查看官方文档中心,记住一点就行,它是一个极简版的硬实时内核。
1.2 rt-thread 标准版 rt-thread 标准版本是包含 nano 的,标准版带带有丰富的组件软件包,这是它与 freertos 主要区别之一,在一些应用,比如 mqtt,云端接入等使用上,rt-thread 具备现成的软件包,使用起来简单方便。
学习的话建议从标准版 入手,虽然在某些情况下,丰富的组件,软件包可能会让初学者犯难,组件和软件包到底是如何与硬件相互关联,但是只要确实去学习了解了以后,才会发现其便捷之处,同时了解了原理,也能够针对自己的应用对组件进行对应的裁剪,增加,更加能够满足各种项目需求。
介绍还是去官网查看,简介截取自官网:
rt-thread 与其他很多 rtos 如 freertos、uc/os 的主要区别之一是,它不仅仅是一个实时内核,还具备丰富的中间层组件:
即便是选好了 rt-thread 标准版 作为学习的版本,但是就标准版而言,也有很多版本:
具体版本的不同以及如何选择可以参考官方说明。
1.3 rt-thread smart rt-thread smart 几年前是没有的,最近出来的分之,是针对于带 mmu 的芯片,就是以前可以跑 linux 系统的芯片。
比如近两年比较火的多家出了开发板的 stm32mp1 和 imx6ull 两款系列芯片。出的开发板最初当然都是以 linux 系统为主,现在 rt-thread 也能够跑在这些芯片上了。
这个版本就不是本栏目的博文需要记录的了,如果后期在写完 嵌入式linux 后,有机会也来做些记录。
简介截取自官网:
rt-thread smart(简称 rt-smart)是基于 rt-thread 操作系统衍生的新分支,面向带 mmu,中高端应用的芯片,例如 arm cortex-a 系列芯片,mips 芯片,带 mmu 的 risc-v 芯片等。rt-smart 在 rt-thread 操作系统的基础上启用独立、完整的进程方式,同时以混合微内核模式执行。
2、rt-thread 开发环境 2.1 开发板(自己画的开发板) 通过上面的介绍,我们将以标准版来进行 rt-thread 的记录。
板子使用的是自己以前画的 stm32f103vgt6(rom:1mb ram:96kb):
2.2 开发工具 还记得以前学习 rt-thread 的时候,还没有出 rt-thread studio ide,整体的工程搭建 需要用到 env,scons 等工具,不管是mdk,ira,gcc工具链开发,都得先用到 env 和scons 工具,配置操作一遍, 对于初学者来说,很不友好,具体的这些详细介绍可以在官网查询:
最初的学习根据官方的文档手册视频等内容,自己倒是也用起来了,但是,一段时间没用,命令还是忘得差不多了。
现在好了,rt-thread 官方团队推出了 rt-thread studio 。rt-thread studio把以前的这些开发工具集成好了,不用死记以前那些命令,界面图形话的工程搭建相对以前更加的简便和直观。
作为国产的 ide,界面操作那是相当的友好, 我们本系列的教程是以项目为目的,为了能够使用 rt-thread 完成一个完整项目的开发,所以不会去花太多精力去折腾 工程架构的搭建之类的 事情,所以使用 rt-thread studio 是完美的选择。
2.3 环境搭建 根据上面介绍,我们定下使用 rt-thread studio 来作为本系列博文的开发 ide,安装下载可直接在官方找到,根据手册安装走起来:
等待安装完成,运行软件需要登录一下 rt-thread 账号:
根据官方文档说明,第一步先安装更新 sdk 包:
在我这台电脑上,以前搭建过环境,我有点感觉 rt-thread studio 会自动识别电脑中的环境变量,以找到电脑上已经存在的环境,比如上面的版本,和我使用的 gcc 工具链版本:
安装好了sdk包,基本上就可以开始建立工程测试了。
再次说明, rt-thread studio 使用手册,界面配置等操作,官方文档,视频,都有详细的说明。 这里记录的是自己使用中必须的步骤。
2.4 rt-thread studio for vscode (待更新… 先还是使用 ide 熟练起来,再来 vscode 里用插件玩玩,毕竟相对来说 还是 ide 配置更简单)
3、第一个工程 3.1 根据自己环境新建工程 在上面操作结束以后,我们直接来新建一个工程,新建工程之前:
再次说明一下本文说使用的环境:
使用 rt-thread 标准版 自己画的开发板,基于stm32f103vgt6 所以我们在 rt-thread studio 里面新建项目的界面做如下选择:
点击完成,等待工程自动生成,因为串口1是在新建工程的时候默认已经配置好,然后直接编译一下,烧录:
通过串口助手连接上开发板,波特率默认的位115200:
可以看到 rt-thread 已经在板子上正常运行起来:
3.2 配合 cubemx 配置使用 上面的通过终端看到的测试结果,也只用到了 串口 功能,至于万年不变的开局跑马灯,我们都没有看到,那么如何真正的在硬件上能够体现出来呢,在官方文档也有对应的介绍:
但是官方这部分的说明不是太多,我们这里还是需要测试说明下,测试结果前面还算顺利,后面的操作也有一些小问题,需要注意!!!
点击工程目录下面的 cubemx setting:
打开了以后注意,以前使用 cubemx 该怎么设置就怎么设置,时钟,串口(如果只使用打印串口,不用其他串口通讯这里可以不设置,工程中已经做过打印串口初始化),io口等,虽然开始我们在工程建立的时候已经是能过时钟,串口,但是打开了这个设置,就得重新全部设置一遍!
我们根据步骤,把基本的 时钟,调试方式,串口,led,按键 配置好进行初步的简单测试。
在生产代码前把 code generator 栏目勾选一下:
然后点击生成工程。
工程生成后不需要打开,但是必须关闭 cubemx,这样才能在rt-thread studio 上正常进行下面的操作 !
生成工程以后,关闭cubemx会提示cubemx.ioc 已经被修改,是否要保存配置,点击确定,如下图:
分析一下使用了cubemx生成代码后的工程:
原来的hal_conf.h就被cubemx新生成的替换掉 rt-thread studio 会且只会使用cubemx生成的 inc 和 src 文件夹下的内容 主函数 rt-thread studio 会在 cubemx生成的 main 函数前用 _weak 声明 时钟初始化函数,会使用 cubemx 中的设置
一些基本的构建现在版本的rt-thread studio 都会自动设置好,通过sconscript。
工程可以直接编译通过。
我们主函数是在 applications 下面的 main.c 文件中,所以使用cubemx生成的配置,我们需要在applications 下面的 main.c 文件中包含对应的头文件,和函数main中调用初始化。
3.2.1 sconscript 文件修改 但是没想到在这里遇到了一个问题:
仔细看了看,发现这是找不到这两个初始化的实现,看着工程架构中确实没有这两个.c文件,研究了半天,还是找到方法,修改sconscript文件,类似makefile:
注意!修改完sconscript之后,是需要同步 scons 配置才能生效的,操作如下:
同步 scons 以后 cubemx -> src -> 下面多了对应的 .c 文件,重新构建能按照我们的设置编译了!
额外说明:
上面我示例中我还是使用了mx_usart1_uart_init();,其实这里并不需要,因为串口1 在工程 drivers 文件夹里的drv_usart.c 文件中已经使用init_board_export(rt_hw_usart_init); 初始化了,所以不需要再次初始化,这里如果再配置一次,也不会出现问题,但是最好是不需要。
通过 makefile 可以直接看到我们 cubemx 生成了多少 .c 文件:
我们在上面除了 rt-thread studio 默认给我们添加的,我们还添加了 gpio 和 串口 的驱动文件,还有一个 it 是和中断有关的,我们并没有添加!!
那么是不是中断就无法响应了呢?
还有,如果不添加 cubemx生成的 gpio 和 串口 的驱动文件,不使用cubemx中的初始化,是不是gpio就不能用了呢?
这些问题暂时不做解释,rt-thread 内核自己还有板级驱动, 因为这是后面文章需要介绍的 rt-thread 内核驱动的一些知识。
3.2.2 cubemx 再次修改配置问题记录 第一次我们为了测试,配置比较简单,所以初始化的外设也比较少,随着我们学习的深入,需要添加的外设越来越多,我们需要使用 cubemx setting 再次修改配置,那么一些问题也随之而来,这里就做个记录:
1、__weak int main(void) 前面的 __weak 需要手动添加,注意这两个下横线是两个英文的下划线。
2、新添加的外设文件,需要通过修改sconscript文件添加,步骤就按照上面说明:
注意有个文件stm32f1xx_it.c是不建议加的,因为其中的一些中断响应函数在 rt-thread 内部有实现这里会冲突,除非自己完全能懂哪些需要哪些不需要。
(stm32f1xx_it.c这个文件在后面 rt-thread 应用篇 — 在stm32l051上使用 rt-thread 系列博文中会使用到,里面说明了如何修改)
3.3 创建一个跑马灯任务 完成上述配置,我们开始可以跑马灯走起来了,既然用了 rtos,那么当然是通过创建 一个 led 跑马灯任务来完成我们的快速上手。
我们在程序中 静态创建一个线程 led1_blink ,上电就启动调度,开始运行;
动态创建一个线程 led2_blink, 需要通过命令启动调度,程序源码如下:
/* * copyright (c) 2006-2022, rt-thread development team * * spdx-license-identifier: apache-2.0 * * change logs: * date author notes * 2022-02-16 qzh first lesson for test */#include #include main.h#include usart.h#include gpio.h#define dbg_tag main#define dbg_lvl dbg_log#include static struct rt_thread led1_thread; //led1线程static char led1_thread_stack[256];static rt_thread_t led2_thread = rt_null; //led2线程static void led1_thread_entry(void *par){ while(1){ led1_on; rt_thread_mdelay(1000); led1_off; rt_thread_mdelay(1000); }}static void led2_thread_entry(void *par){ while(1){ led2_on; rt_thread_mdelay(500); led2_off; rt_thread_mdelay(500); }}int main(void){ mx_gpio_init(); mx_usart1_uart_init(); int count = 1; rt_err_t rst2; rst2 = rt_thread_init(&led1_thread, led1_blink , led1_thread_entry, rt_null, &led1_thread_stack[0], sizeof(led1_thread_stack), rt_thread_priority_max -1, 50); if(rst2 == rt_eok){ rt_thread_startup(&led1_thread); } while (count++) { if(count = 0xffffff00) count = 0; rt_thread_mdelay(1000); } return rt_eok;}void led2_blink(){ led2_thread = rt_thread_create(led2_blink, led2_thread_entry, rt_null, 256, rt_thread_priority_max -1, 50); /* 如果获得线程控制块,启动这个线程 */ if (led2_thread != rt_null) rt_thread_startup(led2_thread);}msh_cmd_export(led2_blink, led2 sample);
上述代码测试的结果如下:
“鹰眼”高精度定位系统介绍
PLC通讯接口有什么用途
苹果申请AR眼镜新专利 2021年即将上市
阿斯麦(ASML)2023三季度财报
苹果即将推出的VR头盔将配备12多个摄像头
RT-Thread记录(一、版本开发环境及配合CubeMX)
造成消防电源模块发热的四个关键因素分别是什么
如何将光投影技术用于自动化制造业
小怪兽mini破壁料理机评测:小身材大马力,集合多种产品功能
高压供电系统常见方式
集MCU、DSP、FPGA于一身的多核MCU,你造吗?
使用FOMO物体检测算法实现无人机野生动物计数系统的设计
数码相机选购技巧
双十一哪款颈挂式蓝牙耳机好?2020双十一颈挂式耳机榜单出炉
苹果在智能手机市场的影响力在下降,延迟发布5G手机将让它当前不利的境况加剧
工业互联网安全的基础是什么
显示技术不断进化 大屏电视会越来越接近一块屏幕的概念
中国通号深耕轨道交通控制系统领域
充电电池发生异常时如何处理
华为海思如何突破桎梏 两大战略布局不可少