当前位置:网站首页>RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (一、无线温湿度传感器 之 新建项目)
RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (一、无线温湿度传感器 之 新建项目)
2022-04-21 23:57:00 【矜辰所致】
学完了 RT-Thread 内核基础,来使用 RT-Thread 实现一个小应用。
硬件平台:STM32L051C8 TCM310(Enocean无线芯片)
软件平台:RT-Thread Studio STM32CubeMX
产品名称:无线温度传感器
实现功能:STM32L051 通过 I2C 协议读取 SHT21D 温湿度传感器数据,然后通过串口和 Enocean
通讯,按照标准Enocean协议,将温湿度数据发送出去
目录
前言
RT-Thread 专栏更新到今天,已经把内核基础全部讲完,还没有一个使用 RT-Thread Studio 完整的项目实例,我在第一篇文章中介绍版本的时候就说过,在一般普通的应用项目上,Nano估计用起来还更多,内存就是成本! 既然我们把 RT-Thread Nano 内容大都过了一遍,那就来使用它实现一个传感器小项目。
看过我博文的朋友都知道为什么我会使用 STM32L051,我在前面博文 ST芯片涨价后,你是如何做的?已经提到过原因,满足应用要求,替换成本低。
本文完全从 0 开始新建工程,工程代码分析,修改,移植,测试,步步为营,最终完成一个完整的应用。
一、使用 RT-Thread Studio 新建项目
首先,我们还是使用 RT-Thread Studio 新建工程,我们选择 Nano 项目,如下图:

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

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

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

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

二、初始项目代码分析
最初我们学习使用的开发板是自己画的 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:

启动文件我们了解一下即可,基本没有区别。
我们进入到rtthread_startup函数,我们在以前分析过,他的流程如下:

对于这些基本流程,他们都是一样的,但是我们要看的东西,在这些步骤里面。
感觉上面写了一堆没用的,但是我还是放出来了,因为我自己确实就是这样去分析,查找的,希望能给大家做个参考。
但是如果熟悉了初始化的步骤,其实可以直接在 rtconfig.h 中直接看宏定义,所有的配置一目了然,后面我们会说一下。
2.1 内存堆
我在 rtthread_startup函数按照步骤往下看,进入到rt_hw_board_init函数,发现 L051 是默认不使用堆,也就不会初始化堆空间,如下图:


其实很好理解,因为 L051 的内存是在是太小了。当然我们自己也可以去修改配置,但是为了系统的稳定性,最好不要这么去做。
这里除了知道L051C8 没有使用堆以后,还得注意,没有使用堆,就不能用内核对象的动态创建函数,等于说我们的线程包括其他的IPC机制 都得使用静态初始化方式!!!
2.2 main 线程初始化
还是在 rtthread_startup中往下看,进入到rt_application_init函数,就是 main 线程的初始化函数。
创建 main 线程,因为没有使用heap,所以只能使用静态初始化的方式,这倒不是什么问题,但是我们需要注意的是,线程栈的大小为2K :

总共就8K 的RAM,一个main 线程就占用了 2K,算是很大了,这里得注意下这个大小,后续应用中看看是否需要调整。
2.3 软件定时器
rtthread_startup往下走,进入到rt_system_timer_thread_init函数:

在软件定时器下一个是rt_thread_idle_init();,初始化的空闲线程,这个地方是一样的,其中了解空闲线程的大小为 256 个字节。
我以前在介绍软件定时器的时候提到过,内存不够是不建议使用软件定时器的,因为软件定时器需要占用内存。
正好这里默认也是不能使用软件定时器。
2.4 rtconfig.h
上面初始化完成以后系统就开始调度了,可以正常的进行我们的用户程序设计,然后我们通过上面的分析,发现了在小内存的 STM32L051 上有些东西未开启,这些定义都是在 rtconfig.h 文件中配置的,于是我们可以打开这个配置程序去做个比较。
实际上对于操作系统来说, 我们一开始就可以直接查看配置文件,看看定义了那些可用,哪些不可用。
具体的比较就不一一分析了,这里我把在实际使用可能需要用到的做个列举,也方面自己后面写应用的时候查看:
- 勾子函数默认都不能使用
- 软件定时器默认不能使用
- IPC机制中只能使用 信号量,互斥量和邮箱,事件集和消息队列默认不可以使用
- 没有内存堆,不能使用动态创建函数
- 没有内存管理,无法使用内存池
- 默认没有FinSH,无法使用shell命令
其他的以后遇到再说,当然更高级点的功能当然也不能使用,比如设备模型组件软件包那些,我们还没学 = =!
三、初始项目占RAM大小
因为使用芯片内存太小了,跑 RTOS 有一个关键的问题,就是内存不够,所以我们得时刻关注这一点我们来看一下,一看有点吓一跳:

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

感觉有点烦,啥都没写,就已经 5840 字节了,估计后面会很难受,不过想想开始那个 main 线程使用了 2048 字节,所以还有调整的余地,到时候我们来看看!
四、时刻保持查看测试结果
从0开始做一个项目,要保持良好的习惯,时刻保持查看测试结果,可以把复杂的问题简单化,出问题很容易找出问题的来源。
最后看一下程序下载到芯片是否正常:

下载到板子,一切正常。
结语
虽然本文只是新建了一个 RT-Thread Nano工程,但是我们分析了初始化项目代码,说明了一些与学习时候大容量芯片不同且需要注意的地方,不仅让我们更了解 RT-Thread Nano 的一些基本配置和初始化情况,同时也为我们后续的程序设计做好了充足的准备,可以避免一些不必要的问题发生。
下一篇的内容就是通过 STM32CubeMX 做外设的基本配置,然后添加一些简单的测试代码。
好的开始是成功的一半! 这个项目已经做完一半了!
好了,本文就到这,谢谢大家!
版权声明
本文为[矜辰所致]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_42328389/article/details/124245845
边栏推荐
- Encapsulated JDBC tools
- TP4582B/TP4584B蓝牙充电座锂电池充放电芯片
- "Yushu technology" completed hundreds of millions of yuan of Series B financing and accelerated the large-scale commercial landing of quadruped robots
- Centos7 install MySQL using Yum - specify the version
- 7.9 线程 互斥锁
- [super detailed explanation plus source code and test results] a series of operation collection of sequence table
- 《数字电子技术基础》3.3 CMOS门电路(下)
- leetcode - 329. Longest increasing path in matrix
- 山洪灾害监测预警系统解决方案
- Multi table view creation problem: modify view data times 1062
猜你喜欢

7.5 thread waiting for termination

AVL tree deletion, detailed illustration

Multi table view creation problem: modify view data times 1062

R语言极值理论:希尔HILL统计量尾部指数参数估计可视化

Sp4522b is a mobile power IC with integrated output for 2A charging and boosting

TP4582B/TP4584B蓝牙充电座锂电池充放电芯片

Storage group physical quantity entity path

移动电源IC方案

Pytorch中如何获取某层Module?(方便改变梯度,获取特征图,CAM等)

AI helps to monitor the wearing of labor protection equipment and escort the safe production of enterprises
随机推荐
Centos7 install MySQL using Yum - specify the version
7-1 object array (100 points)
Degree of second offence
SP4522B 是一款专为2A充电升压集成输出移动电源IC
How does catboost handle non numeric (object) data
Three special data types of redis -- bitmap calculation
ascript基础:事件流以及常用的事件属性
Union, intersection and difference tool classes based on Apache set Toolkit
LeetCode_ 70 climb stairs
《Kubernetes部署篇:使用kubespray离线部署高可用kubernetes集群(方案一)》
What is the difference between machine learning, deep learning, neural network and deep neural network?
C dual insurance process monitor lol ensures that the monitored program runs' almost 'forever Keywords: process operation process view create process
【接口测试基础】第五篇 | 接口用例设计详解
JS notes data type judgment
A list of the latest changes in Mandelbrot set -- mandelbox, mandelbulb, burning ship, nebulabrot
DW07D 二合一锂电池保护 IC
14 custom XML
Distributed GNS3
Matlab implementation of Gan network notes
低成本成FS68001A、FS68003无线充SOC芯片