“我报名参加金石计划1期挑战——分割10万奖池,这是我的第9篇文章,点击查看活动详情”

运用篇-在STM32L051上运用RT-Thread 第三篇,学习RT-Thread Studio怎么增加自定义的.c .h文件,
一起开端咱们的程序移植和规划。

前语

通过前面两篇文章的预备,咱们总算能够开端写运用代码了,在增加咱们自己的驱动文件之前,本文会阐明一下 RT-Thread Studio 怎么增加自己的.c 和 .h文件。

然后在此基础上,完结 SHT21 温湿度传感器的 I2C 驱动移植。

本 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 中止处理与阶段小结)

在STM32L051C8 上运用 RT-Thread 运用篇系列博文连接:

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

RT-Thread 运用篇 — 在STM32L051上运用 RT-Thread (二、无线温湿度传感器 之 CubeMX装备)

一、RT-Thread Studio增加自定义的.c .h文件

运用RT-Thread Studio增加自定义的.c .h文件有多种方法,本文根据博主的实践测验,别离阐明一下。

1.1 在现有文件夹下增加

直接在工程现有的文件夹下面右击,挑选新建头文件或者源文件,如下图:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

增加完结今后就能够直接编译了,上面我在 cubemx 文件夹下的Src 和 Inc 下别离增加了i2c.c和两个头文件,直接编译会相关进去的:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

可是这儿得阐明下,cubemx 是通过SConscript受SCons 构建东西办理的,所以直接这样增加的话,每次咱们自己增加一个.c文件,需求在 SConscript 文件中增加对应部分,要不然同步一下scons,不相关的.c文件就会被扫除构建:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

当然咱们也能够在其他文件夹下增加,比方 drivers 文件夹,里面.c.h文件是混在一起,咱们也能够直接在这儿面新建,如下图:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

总结一下,在现有文件夹下面增加是比较方便的一种方法,由于项目全体的构建系统现已处理好了这些文件下的.c.h文件的包括联系,咱们不必再进行增加头文件途径这种操作。 可是这种方法会影响项目原始框架,小项意图文件少却是无所谓,文件多了的话就很乱了。

1.2 新建文件夹增加

所以咱们要讲一下假如新建文件夹放置咱们自己的驱动程序应该怎么做。

首要,仍是右击挑选新建文件夹,然后出挑选文件夹放置的方位,输入文件夹姓名:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

新建好今后,咱们在左面资源办理器能够看到有文件夹了,咱们能够通过上面 1.1末节的内容增加文件,也能够直接打开文件夹所在的目录,直接把咱们要的文件仿制过来,如下图:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

新建文件夹仿制文件过来,不做任何操作直接编译,能够参加编译:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

可是要备其他文件夹中的文件包括,需求增加头文件途径,假如不增加,会出现如下过错:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

1.2.1 手动增加途径

在工程资源办理器界面右击点击构建装备,如下图:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

然后依照下图所示过程,把咱们自己新建的头文件所在文件夹途径增加(和keil东西相同的增加)即可:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

1.2.1 运用SConscript脚本增加

在自己想要放驱动的文件夹下面新建一个SConscript脚本,如下图:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

然后把自己想增加的.c.h文件放在对应文件夹下面,新建完结刷新工程,然后再右击,挑选“同步scons装备至项目”即可,脚本会把该文件途径主动增加至编译的途径中。

脚本内容如下:

from building import *
cwd     = GetCurrentDir()
src     = Glob('*.c') + Glob('*.S')
libpath = [cwd]
CPPPATH = [os.path.join(cwd)]
group = DefineGroup('mydrivers', src, depend = [''], CPPPATH = CPPPATH,LIBPATH = libpath)
Return('group')

二、I2C驱动移植

上面咱们讲解了假如增加自己的驱动文件,那么咱们就直接把曾经驱动文件移植过来,由于 SHT21 的驱动文件,在我曾经博文 STM32L051 和 nRF52832 专栏都阐明过 SHT21的程序(等本次运用篇结束我会把终究的源码上传的):

STM32L051测验 (三、I2C协议设备的增加测验)

咱们这儿只是把裸机运用的文件改成在 RT-Thread 上运用的文件。

2.1 移植过程

首要咱们把驱动文件都复制过来(Datadef.h 是我个人习惯运用的一些数据类型宏定义):

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

编译往后,仍是正常通过除了上面报的那个延时函数的正告:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

这是由于delay_us()这个函数在HAL库中是没有的额,曾经运用裸机的时分是我自己实现的,这儿咱们既然运用了 RT-Thread ,在咱们《RT-Thread记载(四、RT-Thread 时钟节拍和软件定时器)》中正好介绍到过 RT-Thread 中有 us 延时函数,咱们拿过来用用试试看。

咱们把一切 delay_us 改成rt_hw_us_delay,记住包括一下头文件:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

然后把文件驱动文件中中一切的HAL_Delay改成rt_thread_mdelay,比方:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

感觉现已好了……那么接下来看看作用。

2.2 运用测验

上面咱们驱动移植好了,咱们直接来测验一下,这儿咱们仍是新建一个线程把,这个温湿度读取的线程我根据经历,设置为192字节,然后每隔3s读取一次温湿度打印:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

程序编译正常没有问题,可是跑起来出问题了….

2.3 很多的问题= =!

按键没有修正,上篇文章相同预留的

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

尽管占用了7000多字节,可是应该仍是有空间的,可是在程序运转直接报错:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

key线程昨日测验的时分彻底没问题啊,这儿居然出错了,我考虑到今日也就多加了一个sht的线程,所以我将温湿度读取线程中的逻辑去掉,又出别的的问题提示:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

然后想着是不是刚发动的时分等一会读传感器,没有为什么,讲不出道理= =!所以:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

在这个时分我遽然想到浮点数的特殊性,曾经记住运用 RT-Thread 遇到过,然后网上查了下的确,rt_kprintf是不能打印浮点数的,是不是浮点数的问题。

由于上面显示 sht21 线程栈溢出,阐明线程栈给的不行,其实依照经历来说,是满足的,这儿不管,那我给他增加线程栈看看结果,如下图:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

好吧!仍是有问题,没救了,先把浮点数的问题处理了吧。

改了一个不打印浮点数的,结果看图吧:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

这么看来,或许应该是驱动修正的问题吧,我首要想到的便是 us延时函数,那个延时函数有问题,所以我用了裸机中的干等函数……:

(后边证明不是这个原因,us延时函数可用)

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

经历不管用,尽管在运用 FreeRTOS 的时分 192字节有余:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

可是在这儿运用的时分,256字节巨细都出错了,直到我持续增大:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

问题的解决

到头来,原来是这个驱动函数在 RT-Thread 线程中需求的线程栈巨细相对 FreeRTOS 来说大,由于有些堆栈溢出的问题导致报错也不相同,并且根据曾经的运用经历,所以开端并没有一味的想着增大线程栈空间。

后来考虑了一下,对于驱动操作来说,都是基于STM32L051芯片,这部分应该距离不大,还有一个最能的原因是打印函数,咱们曾经就说过打印函数很占用内存空间,rt_kprintf 是 RT-Thread 自己实现的,是不是由于这个打印函数占用空间大导致的呢? 这个目前只是猜想,后期有机会来研究一下!

回过头切换回 RT-Thread 中的 us 延时函数,也测验成功了。

2.4 RT-Thread nano打印浮点数

1、尽管软件包中心,有一个名为rt_vsnprintf_full的软件包,能够打印浮点数,可是咱们运用的 nano 版别并不能安装软件包……

RT-Thread_rt_kprintf()打印浮点数(解决方法2:增加rt_vsnprintf_full)

2、同样 nano 版别无法运用规范libc库……,所以无法运用vsnprintf替换rt_vsnprintf的方法:

RT-thread rt_kprintf()函数格式化输出浮点数

3、假如做一些其他修正,使其能够支撑规范C库调用,会额外占用 RAM 空间:

rt-thread printf打印信息(包括打印浮点型float)

综合来说看了一圈,好吧,认输了! 打印不出来,不玩了,本次测验不太顺利……

终究仍是用土方法,简略应付一下,由于后期并不需求打印,打印只是为了测验:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

三、时间关注占RAM巨细

本文就增加了一个 I2C驱动, 可是上面咱们通过屡次测验修正,温湿度测验线程也用到了384个字节,假如不打印出来,应该会小很多,咱们后边必定会来调整工程的。

那么仍是老样子,今日测验完结今后和曾经占用空间的对比图上一下:

RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

加了温湿度读取线程今后,程序运转时分需求占用 RAM的巨细: 7248 字节,咱们的芯片 RAM:8192字节。

结语

本文咱们了解了 RT-Thread Studio增加自定义的.c .h文件的方法,然后成功的把 I2C驱动移植过来。

尽管一个简略的移植,缺被一个基本的问题困扰了良久,再次着重一次,在线程中运用打印函数,是很占用RAM空间的行为,曾经在运用操作系统的时分就知道这个问题。

本次测验,我推断在运用RT-Thread自己的rt_kprintf函数会比 C库 printf 占用更多内存空间(有过错请指出),也算是一个小收获。

然后便是运用 RT-Thread nano打印浮点数,尽管我终究仍是样子上打印出了浮点数= =!我没有研究出比较满意的方法,也算是一个小惋惜,不过话说话来,打印大多数是为了测验,正常的项目跑起来,也不需求打印这些。

没想到本次测验这么折腾,有点累= =! 还望小伙伴多多支撑,多多指教!

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