Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
2024-RSOC
【2024-RSOC】D5学习小结(软件包和文件系统)
发布于 2024-07-30 18:41:44 浏览:86
订阅该版
[tocm] # 一,摘要 ![这是我最后的波纹了,JOJO!](https://oss-club.rt-thread.org/uploads/20240730/8ff7971d695088b2b72050cba6be2160.png.webp) # 二,基础拾遗 *软件包* RT-Thread软件包是运行于RT-Thread物联网操作系统平台上的通用软件组件,由描述信息、源代码或库文件组成。这些软件包面向不同应用领域,为开发者提供了众多可重用的选择,极大地促进了RT-Thread生态的繁荣。RT-Thread提供了开放的软件包平台,存放了官方及开发者提供的软件包。这些软件包具有很强的可重用性和模块化程度,方便应用开发者在最短时间内打造出所需的软件。 [软件包地址](https://packages.rt-thread.org/index.html "软件包地址") *组件* RT-Thread组件是构成RT-Thread操作系统的基础单元,它们提供了各种系统服务和功能。这些组件包括但不限于文件系统、网络协议栈、图形库等中间件组件,以及实时内核本身。RT-Thread组件的设计考虑了模块化、可裁剪和可扩展性,以适应不同应用场景和资源受限的嵌入式设备。 # 三,实操记录 ## 1,温湿度传感器操作实例 要想驱动一个I2C设备,我们需要: *1.找到传感器命令 2.找到I2C设备 3.利用API编写驱动,包括写命令`write_reg()`、读命令`read()`、获取参数命令…* 打开板载的AHT外设驱动: *1.打开板上外设AHT32开关 2.因为Kconfig里面关联了,所以不用再次打开软件包 3.查看确认一下 4.搜索rt_vsprintf_full软件包(支持浮点输出)* 接下来就是下载软件包和编写代码。 ## 2.MQTT协议(搭配阿里云平台) MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议,适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎,能够实现传感器、执行器和其它设备之间的高效通信。 **特点:** - **轻量级:**物联网设备通常在处理能力、内存和能耗方面受到限制。MQTT 开销低、报文小的特点使其非常适合这些设备,因为它消耗更少的资源,即使在有限的能力下也能实现高效的通信。 - **可靠:**物联网网络常常面临高延迟或连接不稳定的情况。MQTT 支持多种 QoS 等级、会话感知和持久连接,即使在困难的条件下也能保证消息的可靠传递,使其非常适合物联网应用。 *三种Qos等级:最多一次(QoS0)、至少一次(QoS1)、仅一次(QoS2) * - **便于拓展:**如果有设备需要获取某个传感器的消息,只需要订阅这个主题就好了。 ### 运行框架: **Client:**客户端,即我们使用的设备。 使用MQTT的程序或设备。客户端总是通过网络连接到服务端。它可以 - 发布应用消息给其它相关的客户端。 - 订阅以请求接受相关的应用消息。 - 取消订阅以移除接受应用消息的请求。 - 从服务端断开连接。 **Server:**服务端 作为发送消息的客户端和请求订阅的客户端之间的中介。服务端 - 接受来自客户端的网络连接。 - 接受客户端发布的应用消息。 - 处理客户端的订阅和取消订阅请求。 - 转发应用消息给符合条件的已订阅客户端。 **Topic Name:**主题名 附加在应用消息上的一个标签,服务端已知且与订阅匹配。服务端发送应用消息的一个副本给每一个匹配的客户端订阅。 **Subscription:** 订阅 订阅相应的主题名来获取对应的信息。 **Publish:**发布 在对应主题上发布新的消息。 ### 阿里云网站: 平台:[平台](https://www.aliyun.com/product/iot/iot_instc_public_cn](https://www.aliyun.com/product/iot/iot_instc_public_cn "平台") ### POSIX接口层 POSIX 表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写 POSIX),POSIX 标准定义了操作系统应该为应用程序提供的接口标准,是 IEEE 为要在各种 UNIX 操作系统上运行的软件而定义的一系列 API 标准的总称。 > 文件描述符:`file descriptor`(fd),每一个文件描述符会与一个打开文件相对应,同时,不同的文件描述符也可能指向同一个文件。可以简单理解为它可以帮助我们找到我们需要的文件。 > ![image-20240724224727730](C:\Users\Zero\AppData\Roaming\Typora\typora-user-images\image-20240724224727730.png) 在文件系统中它提供了四个重要的接口: ![fs-mg.png](https://oss-club.rt-thread.org/uploads/20240730/a6b5d417004ae774f878d736c1f1211d.png) 还有一些其他常用的API: ```c int rename(const char *old, const char *new);//文件重命名 int stat(const char *file, struct stat *buf);//获取文件状态 int `unlink`(const char *pathname);//删除文件 ``` ## 3.文件系统结合FAL配置W25Q64 首先会在`rt_hw_spi_flash()`(在INIT_COMPONENT_EXPORT)中会把一个`spi20`的spi设备挂载在`spi2`总线上,然后通过`rt_sfud_flash_probe`将这个`spi20`设备跟一个`SPI_FLASH`设备(命名为`W25Q64`)进行绑定。然后在FAL中对这个`SPI_FLASH(W25Q64)`设备进行分区,然后对相应的区创建`BLK设备`。 接着我们对这个`BLK设备`进行格式化(即挑选一种文件系统去管理这个BLK设备),然后将这个格式化好的文件系统进行挂载(分配到对应路径上)这样我们就可以使用组件的`API`对`W25Q64`进行读写了。这里使用了POSIX协议接口,我们只需要使用`open()`、`close()`、`read()`、`write()`就可以完成对文件的读写。也可以用`mkdir()`、`opendir()`、`readdir()`、`closedir()`来对目录进行管理。 *代码示例:* ```c //记得在menuconfig中开启支持旧版本功能(Support legacy version) #include
#include
#include
#include
//需要添加软件包进这里 //定义要写入的内容 char String[] = "Hello, RT-Thread.Welcom to RSOC!"; //定义接受文件内容的缓冲区 char buffer[100] = {}; void FileSystem_Test(void *parameter) { //文件描述符 int fd; //用只写方式打开文件,如果没有该文件,则创建一个文件 fd = open("/fal/FileTest.txt", O_WRONLY | O_CREAT); //如果打开成功 if (fd >= 0) { //写入文件 write(fd, String, sizeof(String)); rt_kprintf("Write done.\n"); //关闭文件 close(fd); } else { rt_kprintf("File Open Fail.\n"); } //用只读方式打开文件 fd = open("/fal/FileTest.txt", O_RDONLY); if (fd>= 0) { //读取文件内容 rt_uint32_t size = read(fd, buffer, sizeof(buffer)); if (size < 0) { rt_kprintf("Read File Fail.\n"); return ; } //输出文件内容 rt_kprintf("Read from file test.txt : %s \n", buffer); //关闭文件 close(fd); } else { rt_kprintf("File Open Fail.\n"); } } //导出命令 MSH_CMD_EXPORT(FileSystem_Test, FileSystem_Test); static void readdir_sample(void) { DIR *dirp; struct dirent *d; /* 打开 / dir_test 目录 */ dirp = opendir("/fal"); if (dirp == RT_NULL) { rt_kprintf("open directory error!\n"); } else { /* 读取目录 */ while ((d = readdir(dirp)) != RT_NULL) { rt_kprintf("found %s\n", d->d_name); } /* 关闭目录 */ closedir(dirp); } } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(readdir_sample, readdir sample); /* #define WIFI_CS GET_PIN(F, 10) void WIFI_CS_PULL_DOWM(void) { rt_pin_mode(WIFI_CS, PIN_MODE_OUTPUT); rt_pin_write(WIFI_CS, PIN_LOW); } INIT_BOARD_EXPORT(WIFI_CS GET_PIN); */ ```
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
LE_hor
这家伙很懒,什么也没写!
文章
6
回答
0
被采纳
0
关注TA
发私信
相关文章
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部