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

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

3天内不再提示

STM32L051上使用RT-Thread (一、新建项目)

just_2010 来源:矜辰所致 作者:矜辰所致 2022-06-25 20:45 次阅读
学完了 RT-Thread 内核基础,来使用 RT-Thread 实现一个小应用。
硬件平台:STM32L051C8  TCM310(Enocean无线芯片)
软件平台:RT-Thread Studio  STM32CubeMX
产品名称:无线温度传感器
实现功能:STM32L051 通过 I2C 协议读取 SHT21D 温湿度传感器数据,然后通过串口和 Enocean
		通讯,按照标准Enocean协议,将温湿度数据发送出去

目录

  • 前言
  • 一、使用 RT-Thread Studio 新建项目
  • 二、初始项目代码分析
    • 2.1 内存堆
    • 2.2 main 线程初始化
    • 2.3 软件定时器
    • 2.4 rtconfig.h
  • 三、初始项目占RAM大小
  • 四、时刻保持查看测试结果
  • 结语

前言

RT-Thread 专栏更新到今天,已经把内核基础全部讲完,还没有一个使用 RT-Thread Studio 完整的项目实例,我在第一篇文章中介绍版本的时候就说过,在一般普通的应用项目上,Nano估计用起来还更多,内存就是成本! 既然我们把 RT-Thread Nano 内容大都过了一遍,那就来使用它实现一个传感器小项目。

看过我博文的朋友都知道为什么我会使用 STM32L051,我在前面博文 ST芯片涨价后,你是如何做的?已经提到过原因,满足应用要求,替换成本低。


本文完全从 0 开始新建工程,工程代码分析,修改,移植,测试,步步为营,最终完成一个完整的应用。

❤️
本 RT-Thread 专栏记录的开发环境:
RT-Thread记录(一、RT-Thread 版本、RT-Thread Studio开发环境 及 配合CubeMX开发快速上手)
RT-Thread记录(二、RT-Thread内核启动流程 — 启动文件和源码分析)
❤️
RT-Thread 内核篇系列博文链接:
RT-Thread记录(三、RT-Thread 线程操作函数及线程管理与FreeRTOS的比较)
RT-Thread记录(四、RT-Thread 时钟节拍和软件定时器)
RT-Thread记录(五、RT-Thread 临界区保护)
RT-Thread记录(六、IPC机制之信号量、互斥量和事件集)
RT-Thread记录(七、IPC机制之邮箱、消息队列)
RT-Thread记录(八、理解 RT-Thread 内存管理)
RT-Thread记录(九、RT-Thread 中断处理与阶段小结)
❤️

一、使用 RT-Thread Studio 新建项目

首先,我们还是使用 RT-Thread Studio 新建工程,我们选择 Nano 项目,如下图:

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

然后进入项目创建页面,项目基于芯片,然后在系列中选择 STM32L0 系列,如果没有需要添加,如下图:

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

在上面图点击 添加更多,然后在 SDK 管理器中,安装 STM32L0 的资源包,选中,点击安装即可,如下图:

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

完成上述步骤,再回过头来重新新建项目,整个选项如下图所示:

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

新建完成工程以后,会直接在资源管理器出现,以前的项目不会被关闭:

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

二、初始项目代码分析

最初我们学习使用的开发板是自己画的 STM32F103VGT6,有着 96KB 的 RAM,已经是很大的内存了,而目前博主实际项目上很多产品使用的是 STM32L051C8 只有 8KB 的RAM,在使用 FreeRTOS 的时候我遇到的一个大问题就是 RAM 空间不足的问题。

L051 的 RAM 实在是太小了,所以对于这种小内存的芯片肯定在配置上,初始化上与大内存的会有些差异,所以我们有必要来看一看刚刚生成的项目程序,应该能够看到些细节。

代码从哪里开始分析,当然是从初始化开始,我们在《RT-Thread记录(二、RT-Thread内核启动流程 — 启动文件和源码分析)》已经知道了启动流程,我们就从头开始看看。

对于 STM32 来说,整个系列的启动文件基本都是一样的,唯一不同的地方在于,有些芯片外设多,所以中断向量表会多一些。

在启动文件中,有一条语句bl SystemInit,这个SystemInit 里面对于不同型号的STM32也会不一样,但是这里我们也不用太在意,这都是ST官方提供的标准初始化。

其他的地方能修改的或许也只有堆栈的大小了,但是在 RT-Thread 上,我们在启动文件中并没有在启动文件中定义 堆 (heap) 的大小,所以只剩下栈(.stack)的大小了,根据我以前使用 STM32L051 的经验,在这种传感器单品项目上栈使用 0x400 是没问题的,系统也正好是默认是 0x400:

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

启动文件我们了解一下即可,基本没有区别。

我们进入到rtthread_startup函数,我们在以前分析过,他的流程如下:

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

对于这些基本流程,他们都是一样的,但是我们要看的东西,在这些步骤里面。

感觉上面写了一堆没用的,但是我还是放出来了,因为我自己确实就是这样去分析,查找的,希望能给大家做个参考。
但是如果熟悉了初始化的步骤,其实可以直接在 rtconfig.h 中直接看宏定义,所有的配置一目了然,后面我们会说一下。

2.1 内存堆

我在 rtthread_startup函数按照步骤往下看,进入到rt_hw_board_init函数,发现 L051 是默认不使用堆,也就不会初始化堆空间,如下图:

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

poYBAGK25zaAcr6HAAA3O1Y3qBw901.png

其实很好理解,因为 L051 的内存是在是太小了。当然我们自己也可以去修改配置,但是为了系统的稳定性,最好不要这么去做。

这里除了知道L051C8 没有使用堆以后,还得注意,没有使用堆,就不能用内核对象的动态创建函数,等于说我们的线程包括其他的IPC机制 都得使用静态初始化方式!!!

2.2 main 线程初始化

还是在 rtthread_startup中往下看,进入到rt_application_init函数,就是 main 线程的初始化函数。

创建 main 线程,因为没有使用heap,所以只能使用静态初始化的方式,这倒不是什么问题,但是我们需要注意的是,线程栈的大小为2K :

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

总共就8K 的RAM,一个main 线程就占用了 2K,算是很大了,这里得注意下这个大小,后续应用中看看是否需要调整。

2.3 软件定时器

rtthread_startup往下走,进入到rt_system_timer_thread_init函数:

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

在软件定时器下一个是rt_thread_idle_init();,初始化的空闲线程,这个地方是一样的,其中了解空闲线程的大小为 256 个字节。

我以前在介绍软件定时器的时候提到过,内存不够是不建议使用软件定时器的,因为软件定时器需要占用内存。
正好这里默认也是不能使用软件定时器。

2.4 rtconfig.h

上面初始化完成以后系统就开始调度了,可以正常的进行我们的用户程序设计,然后我们通过上面的分析,发现了在小内存的 STM32L051 上有些东西未开启,这些定义都是在 rtconfig.h 文件中配置的,于是我们可以打开这个配置程序去做个比较。

实际上对于操作系统来说, 我们一开始就可以直接查看配置文件,看看定义了那些可用,哪些不可用。

具体的比较就不一一分析了,这里我把在实际使用可能需要用到的做个列举,也方面自己后面写应用的时候查看:

  • 勾子函数默认都不能使用
  • 软件定时器默认不能使用
  • IPC机制中只能使用 信号量,互斥量和邮箱,事件集和消息队列默认不可以使用
  • 没有内存堆,不能使用动态创建函数
  • 没有内存管理,无法使用内存池
  • 默认没有FinSH,无法使用shell命令

其他的以后遇到再说,当然更高级点的功能当然也不能使用,比如设备模型组件软件包那些,我们还没学 = =!

三、初始项目占RAM大小

因为使用芯片内存太小了,跑 RTOS 有一个关键的问题,就是内存不够,所以我们得时刻关注这一点我们来看一下,一看有点吓一跳:

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

至于上图结论怎么得出来的,可以看这篇很通俗很详细很好的博文:STM32的内存管理相关(内存架构,内存管理,map文件分析)

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

感觉有点烦,啥都没写,就已经 5840 字节了,估计后面会很难受,不过想想开始那个 main 线程使用了 2048 字节,所以还有调整的余地,到时候我们来看看!

四、时刻保持查看测试结果

从0开始做一个项目,要保持良好的习惯,时刻保持查看测试结果,可以把复杂的问题简单化,出问题很容易找出问题的来源。

最后看一下程序下载到芯片是否正常:

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

下载到板子,一切正常。

结语

虽然本文只是新建了一个 RT-Thread Nano工程,但是我们分析了初始化项目代码,说明了一些与学习时候大容量芯片不同且需要注意的地方,不仅让我们更了解 RT-Thread Nano 的一些基本配置和初始化情况,同时也为我们后续的程序设计做好了充足的准备,可以避免一些不必要的问题发生。

下一篇的内容就是通过 STM32CubeMX 做外设的基本配置,然后添加一些简单的测试代码。

好的开始是成功的一半! 这个项目已经做完一半了!= =!

好了,本文就到这,谢谢大家!

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

    关注

    2270

    文章

    10900

    浏览量

    356151
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1488

    浏览量

    123806
  • RT-Thread
    +关注

    关注

    31

    文章

    1290

    浏览量

    40153
收藏 人收藏

    评论

    相关推荐

    STM32L051使用RT-Th (二、CubeMX配置)

    应用篇-在STM32L051使用RT-Thread 第二篇,使用STM32CubeMX 进行对应外设配置,同时做些简单测试。
    的头像 发表于 06-26 14:02 4546次阅读
    <b class='flag-5'>STM32L051</b><b class='flag-5'>上</b>使用<b class='flag-5'>RT</b>-Th (二、CubeMX配置)

    STM32L051使用RT-Threa (三、I2C通讯)

    应用篇-在STM32L051使用RT-Thread 第三篇,学习RT-Thread Studio如何添加自定义的.c .h文件,
    的头像 发表于 06-27 10:32 3717次阅读
    <b class='flag-5'>STM32L051</b><b class='flag-5'>上</b>使用<b class='flag-5'>RT</b>-Threa (三、I2C通讯)

    STM32L051使用RT-Thread (四、串口通讯)

    应用篇-在STM32L051使用RT-Thread 第四篇,巧妙的使用信号量处理串口通讯。
    的头像 发表于 06-28 10:59 5278次阅读
    <b class='flag-5'>STM32L051</b><b class='flag-5'>上</b>使用<b class='flag-5'>RT-Thread</b> (四、串口通讯)

    STM32L051使用RT-Thread (五、完结篇)

    应用篇-在STM32L051使用RT-Thread 第五篇,也是本次应用的完结篇。
    的头像 发表于 06-29 10:34 3996次阅读
    <b class='flag-5'>STM32L051</b><b class='flag-5'>上</b>使用<b class='flag-5'>RT-Thread</b> (五、完结篇)

    从0到1教你写RT-Thread新建工程

    仿真,然后我们再开始步地教大家把 RT-Thread 内核从 0 到 1 写出来,让大家彻底搞懂 RT-Thread的内部实现和设计的哲学思想。最后我们再把
    发表于 11-18 14:17 1615次阅读

    RT-Thread Studio 使用 RT-Thread Nano

    本文介绍了如何在 RT-Thread Studio 使用 RT-Thread Nano,并以创建 stm32f103RB 的 Nano 工程为例。准备工作安装
    发表于 05-18 15:59

    RT-Thread Studio 新建项目项目导入介绍

    /stm32l475-atk-pandora 工程为例,演示如何导入个 MDK 工程到 RT-Thread Studio 中,导入前工程目录如下图所示:在 Studio 资源管理器窗口中点击右键,在下拉菜单中选择导入功能
    发表于 08-10 16:52

    如何使用RT-Thread Studio来新建项目

    RT-Thread Studio学习之使用外部时钟系统简介新建RT-Thread项目使用外部时钟简介本文将基于STM32F407VET芯片介
    发表于 01-20 07:51

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

    使用RT-Thread系列STM32L051使用RT-Thread (
    发表于 07-26 14:56

    使用rt-thread新建基于芯片的项目失败是何原因呢

    使用rt-thread stdio 新建基于芯片的项目,芯片使用stm32f7,新建默认的项目
    发表于 12-30 15:15

    RT-Thread零基础快速入门第1讲——新建工程

    RT-Thread零基础快速入门第2讲——新建工程目录RT-Thread零基础快速入门第2讲——新建工程、前言二、使用ENV工具
    发表于 11-30 19:21 16次下载
    <b class='flag-5'>RT-Thread</b>零基础快速入门第1讲——<b class='flag-5'>新建</b>工程

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

    ,没有更新最新版本软件)RT-Thread内核:V4.0.2STM32 CubeMX: V5.6.0、创建RT-Thread项目打开
    发表于 12-14 18:45 14次下载
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>STM32</b> 配置系统时钟(使用外部晶振)

    RT-Thread文档_RT-Thread 潘多拉 STM32L475 上手指南

    RT-Thread文档_RT-Thread 潘多拉 STM32L475 上手指南
    发表于 02-22 18:23 9次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 潘多拉 <b class='flag-5'>STM32L</b>475 上手指南

    【RTT征文精选】画板子、敲代码、玩RTOS、搞Linux,大家起“秀”!

    //STM32L051使用RT-Thread(新建项目)
    的头像 发表于 08-25 09:56 718次阅读
    【RTT征文精选】画板子、敲代码、玩RTOS、搞Linux,大家<b class='flag-5'>一</b>起“秀”!

    rt-thread studio新建stm32f407工程

    rt-thread studio新建stm32f407工程,使用的版本是:2.2.6,stm32f4的支持包版本为0.2.2。先不用0.2.3,因为使用0.2.3建立的模板编译会报错。
    的头像 发表于 10-12 17:42 1357次阅读