0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT-Thread记录(一、版本开发环境及配合CubeMX)

矜辰所致 来源:矜辰所致 作者:矜辰所致 2022-06-20 00:28 次阅读

期间几个月时间关于 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 的资料可以查看官方文档中心,记住一点就行,它是一个极简版的硬实时内核。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_19,color_FFFFFF,t_70,g_se,x_16


1.2 RT-Thread 标准版

RT-Thread 标准版本是包含 Nano 的,标准版带带有丰富的组件软件包,这是它与 FreeRTOS 主要区别之一,在一些应用,比如 MQTT,云端接入等使用上,RT-Thread 具备现成的软件包,使用起来简单方便。
学习的话建议从标准版 入手,虽然在某些情况下,丰富的组件,软件包可能会让初学者犯难,组件和软件包到底是如何与硬件相互关联,但是只要确实去学习了解了以后,才会发现其便捷之处,同时了解了原理,也能够针对自己的应用对组件进行对应的裁剪,增加,更加能够满足各种项目需求。

介绍还是去官网查看,简介截取自官网:
RT-Thread 与其他很多 RTOS 如 FreeRTOS、uC/OS 的主要区别之一是,它不仅仅是一个实时内核,还具备丰富的中间层组件:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16


即便是选好了 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 工具,配置操作一遍, 对于初学者来说,很不友好,具体的这些详细介绍可以在官网查询:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

最初的学习根据官方的文档手册视频等内容,自己倒是也用起来了,但是,一段时间没用,命令还是忘得差不多了。
现在好了,RT-Thread 官方团队推出了 RT-Thread Studio 。RT-Thread Studio把以前的这些开发工具集成好了,不用死记以前那些命令,界面图形话的工程搭建相对以前更加的简便和直观。


作为国产的 IDE,界面操作那是相当的友好, 我们本系列的教程是以项目为目的,为了能够使用 RT-Thread 完成一个完整项目的开发,所以不会去花太多精力去折腾 工程架构的搭建之类的 事情,所以使用 RT-Thread Studio 是完美的选择。

2.3 环境搭建

根据上面介绍,我们定下使用 RT-Thread Studio 来作为本系列博文的开发 IDE,安装下载可直接在官方找到,根据手册安装走起来:

在这里插入图片描述


等待安装完成,运行软件需要登录一下 RT-Thread 账号:

在这里插入图片描述

根据官方文档说明,第一步先安装更新 SDK 包:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

在我这台电脑上,以前搭建过环境,我有点感觉 RT-Thread Studio 会自动识别电脑中的环境变量,以找到电脑上已经存在的环境,比如上面的版本,和我使用的 GCC 工具链版本:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

安装好了SDK包,基本上就可以开始建立工程测试了。

再次说明, RT-Thread Studio 使用手册,界面配置等操作,官方文档,视频,都有详细的说明。 这里记录的是自己使用中必须的步骤。

2.4 RT-Thread Studio For Vscode

(待更新… 先还是使用 IDE 熟练起来,再来 Vscode 里用插件玩玩,毕竟相对来说 还是 IDE 配置更简单)

3、第一个工程

3.1 根据自己环境新建工程

在上面操作结束以后,我们直接来新建一个工程,新建工程之前:

再次说明一下本文说使用的环境:

  1. 使用 RT-Thread 标准版
  2. 自己画的开发板,基于STM32F103VGT6

所以我们在 RT-Thread Studio 里面新建项目的界面做如下选择:

在这里插入图片描述

点击完成,等待工程自动生成,因为串口1是在新建工程的时候默认已经配置好,然后直接编译一下,烧录:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

通过串口助手连接上开发板,波特率默认的位115200:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

可以看到 RT-Thread 已经在板子上正常运行起来:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

3.2 配合 CubeMX 配置使用

上面的通过终端看到的测试结果,也只用到了 串口 功能,至于万年不变的开局跑马灯,我们都没有看到,那么如何真正的在硬件上能够体现出来呢,在官方文档也有对应的介绍:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

但是官方这部分的说明不是太多,我们这里还是需要测试说明下,测试结果前面还算顺利,后面的操作也有一些小问题,需要注意!!!

点击工程目录下面的 CubeMx Setting:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

打开了以后注意,以前使用 CubeMx 该怎么设置就怎么设置,时钟,串口(如果只使用打印串口,不用其他串口通讯这里可以不设置,工程中已经做过打印串口初始化),IO口等,虽然开始我们在工程建立的时候已经是能过时钟,串口,但是打开了这个设置,就得重新全部设置一遍!

我们根据步骤,把基本的 时钟,调试方式,串口,LED,按键 配置好进行初步的简单测试。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

在生产代码前把 Code Generator 栏目勾选一下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

然后点击生成工程。

工程生成后不需要打开,但是必须关闭 CubeMX,这样才能在RT-Thread Studio 上正常进行下面的操作 !

生成工程以后,关闭CubeMX会提示cubemx.ioc 已经被修改,是否要保存配置,点击确定,如下图:

poYBAGKtyQSAAwIzAAAq4AVOpO8896.png

分析一下使用了CubeMX生成代码后的工程:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

  • 原来的hal_conf.h就被cubeMX新生成的替换掉
  • RT-Thread Studio 会且只会使用CubeMX生成的 Inc 和 Src 文件夹下的内容
  • 主函数 RT-Thread Studio 会在 CubeMX生成的 main 函数前用 _WEAK 声明
  • 时钟初始化函数,会使用 CubeMx 中的设置
poYBAGKtyQSAXF-mAABOWXHMRZo984.png

一些基本的构建现在版本的RT-Thread Studio 都会自动设置好,通过SConscript

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

工程可以直接编译通过。

我们主函数是在 applications 下面的 main.c 文件中,所以使用CubeMX生成的配置,我们需要在applications 下面的 main.c 文件中包含对应的头文件,和函数main中调用初始化。

3.2.1 SConscript 文件修改

但是没想到在这里遇到了一个问题:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

仔细看了看,发现这是找不到这两个初始化的实现,看着工程架构中确实没有这两个.c文件,研究了半天,还是找到方法,修改SConscript文件,类似Makefile:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

注意!修改完SConscript之后,是需要同步 scons 配置才能生效的,操作如下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_19,color_FFFFFF,t_70,g_se,x_16

同步 scons 以后 cubemx -> Src -> 下面多了对应的 .c 文件,重新构建能按照我们的设置编译了!

额外说明:

上面我示例中我还是使用了MX_USART1_UART_Init();,其实这里并不需要,因为串口1 在工程 drivers 文件夹里的drv_usart.c 文件中已经使用INIT_BOARD_EXPORT(rt_hw_usart_init); 初始化了,所以不需要再次初始化,这里如果再配置一次,也不会出现问题,但是最好是不需要。

通过 Makefile 可以直接看到我们 CubeMX 生成了多少 .c 文件:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_17,color_FFFFFF,t_70,g_se,x_16

我们在上面除了 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 需要手动添加,注意这两个下横线是两个英文的下划线。

pYYBAGKtyQ6Ab0CTAAAR7eZOn7Y511.png

2、新添加的外设文件,需要通过修改SConscript文件添加,步骤就按照上面说明:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

注意有个文件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 < 11){
            LOG_D("Hello RT-Thread!%d",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);

上述代码测试的结果如下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_18,color_FFFFFF,t_70,g_se,x_16

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RT-Thread
    +关注

    关注

    31

    文章

    1148

    浏览量

    38867
  • CubeMx
    +关注

    关注

    0

    文章

    28

    浏览量

    1207
收藏 人收藏

    评论

    相关推荐

    RT-Thread记录(三、RT-Thread线程操作函数)

    讲完了RT-Thread开发环境,启动流程,启动以后当然是开始跑线程了,那么自然我们得学会如何创建线程以及线程的有关操作。
    的头像 发表于 06-20 00:31 5565次阅读
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>记录</b>(三、<b class='flag-5'>RT-Thread</b>线程操作函数)

    RT-Thread记录(二、RT-Thread内核启动流程)

    在前面我们RT-Thread Studio工程基础之上讲一讲RT-Thread内核启动流程.
    的头像 发表于 06-20 00:30 4410次阅读
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>记录</b>(二、<b class='flag-5'>RT-Thread</b>内核启动流程)

    如何基于CubeMX移植RT-Thread Nano?

    档介绍了如何使用 CubeMX 移植 RT-Thread Nano,并以个 stm32f103 的基础工程作为示例进行讲解。
    发表于 03-29 06:56

    如何使用RT-Thread Studio和STM32CubeMx开发驱动?

    使用RT-Thread Studio和STM32CubeMx开发驱动可分为以下几个步骤 使用 RT-Thread Studio 新建 RT-Thr
    发表于 03-30 08:02

    基于 CubeMX 移植 RT-Thread Nano

    档介绍了如何使用 CubeMX 移植 RT-Thread Nano,并以个 stm32f103 的基础工程作为示例进行讲解。移植 Nano 的主要步骤:准备
    发表于 05-14 16:09

    rt-thread开发环境

    首先介绍下开发环境:硬件:STM32F107VC金牛开发板。 rt-thread版本:2.0.0下载器:jlink V9
    发表于 08-06 08:05

    记录RT-Thread Studio配合CubeMX联合开发遇到的坑

    前言边开发记录的过程,写的可能不是很好,请见谅。在使用CubeMX配合studio联合开发的时候遇到几个大坑,在此
    发表于 06-28 14:33

    【原创精选】RT-Thread征文精选技术文章合集

    、I2C通讯)STM32L051上使用RT-Thread (四、串口通讯)STM32L051上使用RT-Thread (五、完结篇)2. RT-Thread开发
    发表于 07-26 14:56

    RT-Thread开发,如何有效学习RT-Thread的五个步骤

    RT-Thread推出RT-Thread Inside战略开放RT-Thread开发平台授权合作,与硬件十万个为什么合作首次推出第一款RT-
    的头像 发表于 09-25 09:55 3.4w次阅读
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>开发</b>,如何有效学习<b class='flag-5'>RT-Thread</b>的五个步骤

    记录——基于 RT-Thread 实现 USB 虚拟串口

    记录——基于 RT-Thread 实现 USB 虚拟串口记录一下我在正点原子 F429 阿波罗开发板上实现 USB 虚拟串口的过程,希望可以帮助到其他想要学习 USB 的人。首先,我更
    发表于 12-02 17:21 6次下载
    <b class='flag-5'>记录</b>——基于 <b class='flag-5'>RT-Thread</b> 实现 USB 虚拟串口

    RT-Thread零基础快速入门第0讲——环境安装

    RT-Thread快速入门第1讲——环境安装目录RT-Thread快速入门第1讲——环境安装一、 前言二、 编程资料下载三、 ENV工具下载和安装Git下载和安装env下载和安装
    发表于 12-03 14:21 14次下载
    <b class='flag-5'>RT-Thread</b>零基础快速入门第0讲——<b class='flag-5'>环境</b>安装

    RT-Thread STM32 配置系统时钟(使用外部晶振)

    RT-Thread STM32 配置系统时钟开发环境芯片:STM32F103RCT6RT-Thread Studio: V1.0.6(现在已经更新到1.1.3,由于本人使用RTT
    发表于 12-14 18:45 14次下载
    <b class='flag-5'>RT-Thread</b> STM32 配置系统时钟(使用外部晶振)

    机智云设备移植RT-Thread

    开发环境:Keil版本:V5.30RT-Thread版本:3.1.5STM32cubeMX:V6
    的头像 发表于 04-19 18:39 544次阅读
    机智云设备移植<b class='flag-5'>RT-Thread</b>

    RT-Thread移植使用webserver (lwip+httpd)

    开发环境:野火的stm32f407,rt-thread studio版本版本: 2.2.6,stm32f4的资源包为0.2.2,
    的头像 发表于 10-12 12:49 556次阅读
    <b class='flag-5'>RT-Thread</b>移植使用webserver (lwip+httpd)

    RT-Thread使用Soft RTC(软件模拟RTC)

    开发环境:野火的stm32f407,rt-thread studio版本版本: 2.2.6,rt-th
    的头像 发表于 10-12 17:39 352次阅读
    <b class='flag-5'>RT-Thread</b>使用Soft RTC(软件模拟RTC)