ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Matter(connectedhomeip)PSoC6 持久化存储示例:Key-Value Storage API 验证与开发实践

Matter(connectedhomeip)PSoC6 持久化存储示例:Key-Value Storage API 验证与开发实践 MatterconnectedhomeipPSoC6 持久化存储示例Key-Value Storage API 验证与开发实践【免费下载链接】connectedhomeipMatter (formerly Project CHIP) creates more connections between more objects, simplifying development for manufacturers and increasing compatibility for consumers, guided by the Connectivity Standards Alliance.项目地址: https://gitcode.com/GitHub_Trending/co/connectedhomeip本文聚焦 connectedhomeipMatter SDK中examples/persistent-storage/infineon/psoc6示例系统讲解其在 Infineon PSoC6 平台上的 KVSKey-Value Store键值存储API 验证方案从 KVS 接口的设计意图、PSoC6 平台实现的底层原理基于 ModusToolbox MTBKeyValueStore到完整的构建、烧录与运行流程以及 KVS 测试用例逐一剖析帮助你快速在 CY8CKIT-062S2-43012 开发板上跑通并理解 Matter 设备持久化存储的核心机制。引言这个示例要解决什么问题持久化存储是 Matter 设备的基础能力之一——设备的 Fabric 信息、配对凭据、ACL访问控制列表、属性持久化数据等都必须存放在非易失性存储中保证设备断电重启后状态不丢失。connectedhomeip 通过KeyValueStoreManager这一抽象接口来统一各平台的键值存储实现而examples/persistent-storage目录下的示例就是专门用来验证 KVS 在不同平台上的实现正确性的。根据原文档examples/persistent-storage/infineon/psoc6/README.md的说明这个示例有两个使命测试 KVS 的实现与 API作为 KVS 在新平台 bring-up 阶段的功能验证程序逐项检查Put/Get/Delete等核心操作的正确性示范 API 的用法作为开发者学习如何使用KeyValueStoreManager接口的参考实现。文档同时指出未来当所有平台都具备相应的单元测试环境时该示例有望迁移为正式的单元测试。从仓库结构看examples/persistent-storage下目前提供了多个平台的移植包括 esp32、linux、infineon/psoc6 和 qpg而本文聚焦的 PSoC6 版本是其中 KVS 实现完整度较高的一个。PSoC6 平台KVS 实现与初始化方式KVS 已完整实现Init 时通过文件配置原文档明确指出The Infineon PSoC6 platform KVS is fully implemented, the KVS is enabled and configured by providing a file during the init call.即 PSoC6 平台的 KVS 已完整实现并且在 Init 调用时通过提供一个文件kvstore 后端配置来完成使能与配置。在源码层面这一实现位于 src/platform/Infineon/PSOC6/KeyValueStoreManagerImpl.h核心内容如下类KeyValueStoreManagerImpl继承自通用接口类KeyValueStoreManager以单例sInstance形式对外提供其成员mtb_kvstore_t kvstore_obj表明底层直接使用ModusToolbox 的 MTBKeyValueStore 组件作为持久化后端通过ConvertCyResultToChip(cy_rslt_t err)将 ModusToolbox 的cy_rslt_t错误码转换为 CHIP 的CHIP_ERROR对外暴露的接口包括Init()、_Get()支持偏移读取、_Put()、_Delete()和Erase()。头文件还提供了两个访问入口// 平台无关的公共接口入口所有平台通用 inline KeyValueStoreManager KeyValueStoreMgr(void) { return KeyValueStoreManagerImpl::sInstance; } // PSoC6 平台特有的实现入口可访问平台特有能力 inline KeyValueStoreManagerImpl KeyValueStoreMgrImpl(void) { return KeyValueStoreManagerImpl::sInstance; }示例应用在启动时正是通过KeyValueStoreMgrImpl().Init()完成 KVS 的初始化详见下一节。应用启动流程从 main 到测试任务examples/persistent-storage/infineon/psoc6/main.cpp 展示了完整的启动链路int main(int argc, char * argv[]) { init_psoc6Platform(); // ... vTaskStartScheduler(); // 启动 FreeRTOS 调度器 } extern C void vApplicationDaemonTaskStartupHook() { // Init Chip memory management before the stack chip::Platform::MemoryInit(); // Run tests xTaskCreate(TestTask, Test, 2048, NULL, 1, sTestTaskHandle); } void TestTask(void * pvParameter) { CHIP_ERROR err chip::DeviceLayer::PersistedStorage::KeyValueStoreMgrImpl().Init(); if (err ! CHIP_NO_ERROR) { PSOC6_LOG(PersistedStorage::KeyValueStoreMgrImpl().Init() failed); return; } while (true) { PSOC6_LOG(Running Tests:); chip::RunKvsTest(); vTaskDelay(60000); // Run every minute } }流程要点main()先调用init_psoc6Platform()完成平台初始化然后启动 FreeRTOS 调度器FreeRTOS 启动完成后回调vApplicationDaemonTaskStartupHook()在此先调用chip::Platform::MemoryInit()初始化 CHIP 内存管理再创建名为Test的测试任务任务栈 2048 字优先级 1测试任务内首先调用KeyValueStoreMgrImpl().Init()完成 KVS 初始化——这正是文档所述init 调用时通过文件配置 KVS的体现mtb_kvstore_t的配置文件指向 flash 上的存储区域在 Init 内部生效初始化成功后进入死循环调用chip::RunKvsTest()执行整套 KVS 测试然后vTaskDelay(60000)每分钟重复运行一次便于在长时间运行中持续验证存储的稳定性包括掉电重启后的数据一致性场景。构建GN ModusToolbox 工具链前置条件构建 PSoC6 示例需要满足以下条件安装ModusToolbox 软件 v3.2Infineon 官方 IDE/工具链并设置环境变量CY_TOOLS_PATHS。这一点可以从构建脚本 scripts/examples/gn_psoc6_example.sh 开头的检查逻辑得到印证若未设置CY_TOOLS_PATHS脚本会打印提示要求安装 ModusToolbox目标开发板为CY8CKIT-062S2-43012PSoC6 开发套件脚本中默认PSOC6_BOARDCY8CKIT-062S2-43012需要 Linux/macOS 环境且具备arm-none-eabi交叉编译工具链脚本末尾会调用arm-none-eabi-size -A输出内存统计。构建命令按照原文档给出的步骤示例代码块中的前三步$ git submodule update --init $ source third_party/connectedhomeip/scripts/activate.sh $ ./scripts/examples/gn_psoc6_example.sh examples/persistent-storage/infineon/psoc6 out/persistent_storage_app_psoc6参数含义git submodule update --init拉取子模块如第三方 SDK、pigweed 等source third_party/connectedhomeip/scripts/activate.sh激活构建环境激活脚本实际位于仓库根目录 scripts/activate.sh该命令在把本示例作为独立 repo 使用时的子模块路径写法最后一个脚本的三个参数examples/persistent-storage/infineon/psoc6为目标工程目录out/persistent_storage_app_psoc6为输出目录。脚本内部见 scripts/examples/gn_psoc6_example.sh实际执行了gn gen --check --fail-on-unused-args $OUTPUT_DIR --root$EXAMPLE_DIR --argspsoc6_board\CY8CKIT-062S2-43012\ ... ninja -C $OUTPUT_DIR arm-none-eabi-size -A $OUTPUT_DIR/*.out即依次完成 GN 工程生成强制--check与--fail-on-unused-args校验、Ninja 编译和固件体积统计。构建产物的可执行文件名为chip-psoc6-persistent-storage-example.out由 BUILD.gn 中的output_name指定。构建配置要点BUILD.gn 解读examples/persistent-storage/infineon/psoc6/BUILD.gn 揭示了构建的关键配置assert(current_os freertos)PSoC6 平台使用 FreeRTOS 作为操作系统psoc6_sdk_sources(persistent_storage_app_sdk_sources)汇总 SDK 源文件包含路径有src/platform/Infineon/PSOC6、工程include目录和examples/platform/infineon/psoc6宏定义PSOC6_LOG_ENABLED1使能平台日志输出对应AppConfig.h中的PSOC6_LOG宏可执行目标persistent_storage_app链接了src/lib、src/platform/logging、src/setup_payload并编译了共享测试代码 examples/persistent-storage/KeyValueStorageTest.cpp可选参数chip_print_memory_usage false置为true时会在链接阶段输出内存使用明细-Wl,--print-memory-usage和-fstack-usage。此外examples/persistent-storage/infineon/psoc6/args.gni 引入了src/platform/Infineon/PSOC6/args.gni用于注入 PSoC6 平台自身的构建参数。烧录通过 KitProg3 刷写开发板原文档的烧录步骤分为硬件准备与命令行两步。第一步硬件准备切换 KitProg3 CMSIS-DAP 模式将CY8CKIT-062S2-43012开发板通过 USB 连接到主机按下板上的MODE SELECT按钮将板载调试器切换到KitProg3 CMSIS-DAP 模式确认KITPROG3 STATUSLED 亮起即表示开发板已处于正确模式可被主机识别为 CMSIS-DAP 调试设备。第二步命令行烧录$ cd ~/connectedhomeip $ python3 out/persistent_storage_app_psoc6/chip-psoc6-persistent-storage-example.flash.py构建系统在编译chip-psoc6-persistent-storage-example.out的同时生成了配套的chip-psoc6-persistent-storage-example.flash.py烧录脚本其中封装了通过 CMSIS-DAP 接口把固件写入开发板 flash 的完整流程包括目标文件与烧录工具参数的解析。运行该脚本后固件即被写入板载 flash复位后应用自动启动。KVS 测试用例剖析API 到底在测什么示例的核心是共享测试代码 examples/persistent-storage/KeyValueStorageTest.cpp在 BUILD.gn 中被编译进 PSoC6 固件以及其声明文件 examples/persistent-storage/KeyValueStorageTest.h。每个测试用例都遵循写入 → 读取 → 校验 → 删除的完整闭环通过RUN_TEST宏统一打印PASSED/FAILED日志失败时附带chip::ErrorStr格式化后的错误码。测试入口函数为void RunKvsTest(TestConfigurations test_config) // 默认 RUN_ALL_TESTS枚举TestConfigurations支持两种配置RUN_ALL_TESTS运行全部测试与SKIP_MULTI_READ_TEST跳过偏移读测试供不支持该特性的平台使用。各用例的验证要点如下测试函数验证内容关键操作TestEmptyString空字符串的存取Put(str_key, )→Get校验内容与read_size→DeleteTestKeyExistence键存在性检查Put后以nullptr缓冲区调用Get允许返回CHIP_NO_ERROR或CHIP_ERROR_BUFFER_TOO_SMALLTestString字符串往返一致性Put(str_key, test_value)→Get校验strcmp与读取长度TestUint32标量类型存取Put(key, uint32_t 值)→Get模板重载直接读回uint32_tTestArray数组原始内存块存取写入uint32_t[5]memcmp整体比对TestStruct自定义结构体存取写入含uint8_t/uint32_t的结构体逐字段比对TestUpdateValue值更新覆盖写循环 10 次Put(key, i)每次Get校验读到的是最新值TestMultiRead偏移量读取读取uint32_t[5]时以i * sizeof(uint32_t)为偏移逐元素读取前 4 次期望CHIP_ERROR_BUFFER_TOO_SMALL末次成功并校验read_size值得特别说明的两个深层设计Get的缓冲区语义KeyValueStoreMgr().Get(key, value, value_size, read_size, offset)当提供的缓冲区过小时返回CHIP_ERROR_BUFFER_TOO_SMALL。TestKeyExistence正是利用这一语义——传入空缓冲区仅用于探测键是否存在而TestMultiRead进一步验证了 PSoC6 实现对offset 偏移读的支持这与KeyValueStoreManagerImpl::_Get(..., size_t offset 0)的接口签名一一对应错误码链路PSoC6 实现通过ConvertCyResultToChip将底层 MTBKeyValueStore 的cy_rslt_t错误码翻译为 CHIP 层错误码上层测试通过统一的CHIP_ERROR与ErrorStr处理屏蔽了平台差异。从测试运行方式看TestTask每分钟循环执行整套测试vTaskDelay(60000)意味着在持续运行时可以反复覆盖同一批键从而验证 flash 写入的磨损均衡、掉电后数据持久性等嵌入式存储核心问题。工程配置速览工程目录 examples/persistent-storage/infineon/psoc6 的核心文件一览文件作用main.cpp应用入口初始化平台、启动测试任务、周期运行 KVS 测试BUILD.gnGN 构建脚本SDK 源文件汇总、可执行目标定义、内存统计开关args.gni构建参数引入 PSoC6 平台参数并传递目标工程 labelinclude/CHIPProjectConfig.h工程级 CHIP 配置测试配对 PIN 码、Ble、固件版本、事件日志缓冲等include/AppConfig.h平台日志宏PSOC6_LOG定义其中 include/CHIPProjectConfig.h 的典型配置项包括CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE 20202021与CHIP_DEVICE_CONFIG_USE_TEST_SETUP_DISCRIMINATOR 0xF00配对使用的测试 PIN 与鉴别器CHIP_CONFIG_SECURITY_TEST_MODE 0安全测试模式默认关闭文档强调生产构建严禁开启CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE 1使能 CHIP-over-BLECHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE (512)事件日志调试缓冲大小。小结与扩展阅读本文围绕 examples/persistent-storage/infineon/psoc6/README.md 完整梳理了 Matter PSoC6 持久化存储示例的构建、烧录、运行与测试逻辑KVS 在 PSoC6 上基于 ModusToolbox MTBKeyValueStore 完整实现通过KeyValueStoreMgrImpl().Init()一次性配置启用构建依赖 ModusToolbox v3.2 工具链与gn_psoc6_example.sh脚本烧录通过 KitProg3 CMSIS-DAP 模式配合自动生成的.flash.py脚本完成测试则覆盖了空字符串、键存在性、标量/数组/结构体、值更新与偏移读等 KVS 核心场景。如果想横向对比其他平台的实现可继续阅读Linux 平台版本examples/persistent-storage/linux/README.md构建方式略有差异gn gen out/debug ninja -C out/debug运行则直接sudo out/debug/persistent_storagePSoC6 KVS 实现源码src/platform/Infineon/PSOC6/KeyValueStoreManagerImpl.h 与同目录.cpp文件共享测试代码examples/persistent-storage/KeyValueStorageTest.cpp、examples/persistent-storage/KeyValueStorageTest.h。对于需要在自有平台上 bring-up Matter KVS 的开发者这套共享测试代码 平台 init 配置的结构本身就是可复用的模板移植新平台时只需实现KeyValueStoreManager接口并确保能通过RunKvsTest()的全部用例即可认为该平台的持久化存储满足 Matter 设备的基本要求。【免费下载链接】connectedhomeipMatter (formerly Project CHIP) creates more connections between more objects, simplifying development for manufacturers and increasing compatibility for consumers, guided by the Connectivity Standards Alliance.项目地址: https://gitcode.com/GitHub_Trending/co/connectedhomeip创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表