“我报名参与金石计划1期应战——分割10万奖池,这是我的第6篇文章,点击检查活动概况”

学完了 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 专栏记载的开发环境:

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 项目,如下图:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (一、无线温湿度传感器 之 新建项目)

然后进入项目创立页面,项目基于芯片,然后在系列中挑选 STM32L0 系列,假如没有需求增加,如下图:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (一、无线温湿度传感器 之 新建项目)

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

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (一、无线温湿度传感器 之 新建项目)

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

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (一、无线温湿度传感器 之 新建项目)

新建完结工程今后,会直接在资源办理器出现,曾经的项目不会被关闭:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (一、无线温湿度传感器 之 新建项目)

二、初始项目代码剖析

最初咱们学习运用的开发板是自己画的 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:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (一、无线温湿度传感器 之 新建项目)

发动文件咱们了解一下即可,根本没有差异。

咱们进入到rtthread_startup函数,咱们在曾经剖析过,他的流程如下:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (一、无线温湿度传感器 之 新建项目)

关于这些根本流程,他们都是相同的,可是咱们要看的东西,在这些过程里边。

感觉上面写了一堆没用的,可是我仍是放出来了,由于我自己的确便是这样去剖析,查找的,希望能给我们做个参阅。 可是假如熟悉了初始化的过程,其实能够直接在 rtconfig.h 中直接看宏界说,所有的装备一望而知,后边咱们会说一下。

2.1 内存堆

我在 rtthread_startup函数依照过程往下看,进入到rt_hw_board_init函数,发现 L051 是默许不运用堆,也就不会初始化堆空间,如下图:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (一、无线温湿度传感器 之 新建项目)

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (一、无线温湿度传感器 之 新建项目)

其实很好了解,由于 L051 的内存是在是太小了。当然咱们自己也能够去修正装备,可是为了体系的稳定性,最好不要这么去做。

这儿除了知道L051C8 没有运用堆今后,还得留意,没有运用堆,就不能用内核对象的动态创立函数,等于说咱们的线程包含其他的IPC机制 都得运用静态初始化方式!!!

2.2 main 线程初始化

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

创立 main 线程,由于没有运用heap,所以只能运用静态初始化的方式,这倒不是什么问题,可是咱们需求留意的是,线程栈的巨细为2K :

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (一、无线温湿度传感器 之 新建项目)

总共就8K 的RAM,一个main 线程就占用了 2K,算是很大了,这儿得留意下这个巨细,后续运用中看看是否需求调整。

2.3 软件定时器

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

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (一、无线温湿度传感器 之 新建项目)

在软件定时器下一个是rt_thread_idle_init();,初始化的闲暇线程,这个当地是相同的,其间了解闲暇线程的巨细为 256 个字节。

我曾经在介绍软件定时器的时分提到过,内存不行是不主张运用软件定时器的,由于软件定时器需求占用内存。

正好这儿默许也是不能运用软件定时器。

2.4 rtconfig.h

上面初始化完结今后体系就开端调度了,能够正常的进行咱们的用户程序设计,然后咱们经过上面的剖析,发现了在小内存的 STM32L051 上有些东西未敞开,这些界说都是在 rtconfig.h 文件中装备的,所以咱们能够打开这个装备程序去做个比较。

实践上关于操作体系来说, 咱们一开端就能够直接检查装备文件,看看界说了那些可用,哪些不可用。

具体的比较就不逐个剖析了,这儿我把在实践运用可能需求用到的做个列举,也方面自己后边写运用的时分检查:

  • 勾子函数默许都不能运用
  • 软件定时器默许不能运用
  • IPC机制中只能运用 信号量,互斥量和邮箱,事情集和音讯行列默许不能够运用
  • 没有内存堆,不能运用动态创立函数
  • 没有内存办理,无法运用内存池
  • 默许没有FinSH,无法运用shell命令

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

三、初始项目占RAM巨细

由于运用芯片内存太小了,跑 RTOS 有一个关键的问题,便是内存不行,所以咱们得时间重视这一点咱们来看一下,一看有点吓一跳:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (一、无线温湿度传感器 之 新建项目)

至于上图结论怎样得出来的,能够看这篇很通俗很具体很好的博文:

STM32的内存办理相关(内存架构,内存办理,map文件剖析)

里边有说明:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (一、无线温湿度传感器 之 新建项目)

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

四、时间坚持检查测验成果

从0开端做一个项目,要坚持杰出的习气,时间坚持检查测验成果,能够把复杂的问题简略化,出问题很容易找出问题的来源。

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

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (一、无线温湿度传感器 之 新建项目)

下载到板子,一切正常。

结语

尽管本文只是新建了一个 RT-Thread Nano工程,可是咱们剖析了初始化项目代码,说明了一些与学习时分大容量芯片不同且需求留意的当地,不仅让咱们更了解 RT-Thread Nano 的一些根本装备和初始化情况,一起也为咱们后续的程序设计做好了足够的预备,能够防止一些不必要的问题产生。

下一篇的内容便是经过 STM32CubeMX 做外设的根本装备,然后增加一些简略的测验代码。

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

好了,本文就到这,谢谢我们!