外观
读固件信息示例
2026-07-29
概述
本文演示了如何通过 RT-Thread 设备驱动框架读取固件版本信息,帮助开发者掌握获取内核版本、应用版本、构建时间、大小和校验信息的方法。
固件版本信息的作用
固件版本信息包含了内核和应用的关键元数据,包括版本号、构建时间、大小和 CRC 校验值。这些信息可用于:
- 版本追踪:识别当前运行的固件版本
- 故障诊断:快速定位问题固件版本
- 安全校验:验证固件完整性和正确性
- 升级管理:判断是否需要进行固件升级
运行固件版本读取示例
本示例通过 RT-Thread 设备驱动框架操作 fwinfo 设备,获取固件版本信息结构体并打印输出,包括内核版本、构建时间以及应用版本相关信息。
创建工程点击展开
依次点击 “文件” -> “新建” -> "RT-Thread RuiChing App 项目"。

在弹出新建向导中选择 开发版 、BSP: 、示例 、 调试器/下载器。选择好之后点击 “完成”。

点击 “完成” 后,等待工程创建完成。

创建完成。

构建工程点击展开
单击工程使工程进入 Active-Debug 模式。

点击工具栏上的构建按钮进行工程编译。

构建成功后,会显示构建成功的信息。

固件下载点击展开
固化设备树

固化 APP

核心示例代码
固件版本信息结构体
smodule_version_info 结构体包含以下字段:
| 字段 | 类型 | 说明 |
|---|---|---|
kernel_ver_major | rt_uint16_t | 内核主版本号 |
kernel_ver_minor | rt_uint16_t | 内核次版本号 |
kernel_ver_patch | rt_uint16_t | 内核补丁版本号 |
kernel_build_date | char[12] | 内核构建日期 |
kernel_build_time | char[9] | 内核构建时间 |
kernel_crc16 | rt_uint16_t | 内核 CRC16 校验值 |
app_version_ident | rt_uint32_t | 应用版本标识 |
app_size | rt_uint32_t | 应用大小(字节) |
app_crc | rt_uint32_t | 应用 CRC 校验值 |
app_build | char[24] | 应用构建信息 |
applications/fw_version_read_example.c
#define SMODULE_MAGIC 0x00707061
struct smodule_version_info
{
rt_uint16_t kernel_ver_major;
rt_uint16_t kernel_ver_minor;
rt_uint16_t kernel_ver_patch;
char kernel_build_date[12];
char kernel_build_time[9];
rt_uint16_t kernel_crc16;
rt_uint16_t reserved;
rt_uint32_t app_version_ident;
rt_uint32_t app_size;
rt_uint32_t app_crc;
rt_uint32_t app_magic;
char app_build[24];
};固件版本读取相关 API
rt_device_find:查找指定名称的设备,返回设备句柄;rt_device_open:打开设备,获取设备操作权限;rt_device_read:从设备读取数据,用于获取固件版本信息;
applications/fw_version_read_example.c
static rt_err_t fw_version_example(void)
{
rt_device_t dev;
struct smodule_version_info info = {0};
rt_ssize_t len;
dev = rt_device_find("fwinfo");
if (dev == RT_NULL)
{
LOG_E("fwinfo device not found");
return -RT_ERROR;
}
if (rt_device_open(dev, RT_DEVICE_OFLAG_RDONLY) != RT_EOK)
{
LOG_E("Failed to open fwinfo device");
return -RT_ERROR;
}
len = rt_device_read(dev, 0, &info, sizeof(info));
if (len != sizeof(info))
{
LOG_E("Failed to read firmware version info");
return -RT_ERROR;
}
LOG_I("firmware version read success!");
rt_kprintf("=== kernel ===\n");
rt_kprintf("version : %d.%d.%d\n",info.kernel_ver_major, info.kernel_ver_minor, info.kernel_ver_patch);
rt_kprintf("build : %s %s\n",info.kernel_build_date, info.kernel_build_time);
rt_kprintf("=== app ===\n");
rt_kprintf("build : %s\n", info.app_build);
rt_kprintf("size : %u\n", info.app_size);
rt_kprintf("crc : 0x%08X\n", info.app_crc);
return RT_EOK;
}
MSH_CMD_EXPORT(fw_version_example, fw version read example);运行示例
操作步骤
- 将程序下载到开发板
- 打开串口终端连接开发板
- 输入
fw_version_example命令
预期结果
成功读取固件版本信息并分别输出内核版本和应用版本相关信息。
rtt 终端
msh />fw_version_example
[I/example.fwversion] firmware version read success!
=== kernel ===
version : 1.0.0
build : Jul 29 2026 18:30:00
=== app ===
build : Jul 29 2026 18:30:00
size : 102400
crc : 0x12345678输出说明
| 输出项 | 说明 |
|---|---|
version | 内核版本号,格式为 主版本.次版本.补丁版本 |
build | 内核/应用的构建日期和时间 |
size | 应用固件的大小(字节) |
crc | 应用固件的 CRC 校验值,用于验证固件完整性 |
