尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

FreeRTOS测试框架:3种验证工具怎么选,把内核风险拦在上线前

FreeRTOS测试框架:3种验证工具怎么选,把内核风险拦在上线前 FreeRTOS测试框架3种验证工具怎么选把内核风险拦在上线前【免费下载链接】FreeRTOSClassic FreeRTOS distribution. Started as Git clone of FreeRTOS SourceForge SVN repo. Submodules the kernel.项目地址: https://gitcode.com/GitHub_Trending/fr/FreeRTOS嵌入式产品交付前最常被质问的一句话是你怎么确定内核的队列、任务管理这些核心 API 真的没问题 FreeRTOS 官方的测试框架就是为回答这个问题准备的它把 CMock 单元测试、CBMC 有界模型检查、VeriFast 形式化验证三条路线放在同一个仓库里你按项目的风险等级取用即可不必全部上阵。下面按先选型、再上手、最后避坑的顺序讲。三条验证路线各自解决什么问题很多人把这三个模块混为一谈其实它们回答的是三个不同的问题维度CMock 单元测试CBMC 模型检查VeriFast 形式化验证验证方式编译成可执行文件真实调用 API静态有界模型检查不执行代码带注解的演绎推理证明无界性质覆盖范围队列、任务、定时器、事件组、消息缓冲等全量 API单个入口函数的内存安全有界队列与链表整体内存安全 线程安全 功能正确无界产出物用例通过/失败 lcov 覆盖率报告每个证明目录下的 HTML/JSON 报告0 errors found (N statements verified)上手成本低gcc、make、ruby中CBMC 工具链 python3 补丁流程高需要能读分离逻辑注解源码位置FreeRTOS/Test/CMock/FreeRTOS/Test/CBMC/FreeRTOS/Test/VeriFast/我的判断大多数场景 CMock 就够用CBMC 的价值在于不跑代码也能找出越界写、空指针这类内存安全问题且官方 CI 会对每个 PR 全量跑一遍VeriFast 属于证明级别它的结论不依赖队列长度和任务数量但注解负担也大官方统计 queue 证明约 0.3~2 倍注解量list 最高达 7 倍。按场景对号入座怎么选改过内核代码想确认没改坏现有 API→ 直接跑 CMock最快拿到反馈。安全关键项目交付需要书面证据→ CBMC。每个入口函数的证明都会产出独立的 HTML 报告可以直接附在交付文档里。要声称任意长度队列、任意数量任务和 ISR 下行为都正确→ 只有 VeriFast 的无界证明站得住脚单元测试做不到这一点。需要验证真实硬件上的集成行为→ 仓库里还有 FreeRTOS/Test/Target/里面是跑在目标板如 Raspberry Pi Pico上的 SMP 集成测试别和单元测试混为一谈。跑通 CMock最常用的入口 拿到仓库后先补全子模块再进 CMock 目录make unit里的 unit 就是模块名git clone https://gitcode.com/GitHub_Trending/fr/FreeRTOS cd FreeRTOS/Test/CMock make queue # 只构建队列单元测试可执行文件落在 build/bin make run # 构建并顺序执行全部模块的测试 make coverage # 额外生成 HTML 覆盖率报告build/coverage几个实用细节给测试新增用例时建议加ENABLE_SANITIZER1再 make让 GCC 的 Address Sanitizer 顺便盯内存。单个模块可以独立跑例如make -C listmake -C list lcov能出过滤后的覆盖率。依赖比 CBMC 轻gcc、make、ruby、lcov 齐活即可。跑通第一个 CBMC 证明CBMC 的目录组织值得先看懂proofs/下每个叶子目录就是一个证明对应 FreeRTOS 的一个入口点比如proofs/Queue/QueueGenericSend/、proofs/Task/TaskCreate/。patches/里的补丁会在证明前自动剥离源码的static和volatile限定。流程固定为两步官方只支持 python 构建Linux/macOS 或 WSL要求 Python ≥ 3.764 位机器需装 32 位 gcc 库cd FreeRTOS/Test/CBMC/proofs python3 prepare.py # 为每个证明目录生成 Makefile make # 在某个证明目录内执行耗时视证明而定跑完后检查该目录下的html/html/index.htmlErrors 一栏显示 None 即为通过JSON 报告在html/json。注意它是有界检查探索深度受配置约束通过证明 ≠ 穷尽所有行为但对拦内存安全错误已经足够而且官方 CI 对每个 PR 都会复跑全部证明你本地跑的主要目的是提前发现失败。VeriFast把队列像队列一样工作证明出来FreeRTOS/Test/VeriFast/ 下的queue/和list/目录里每个.c文件是某个 API 函数的带注解证明源码注解用/* ... */特殊注释书写公共谓词和引理放在include/proof/。它的结论比 CBMC 更强queue 证明覆盖内存安全、线程安全与功能正确且不随队列长度、任务/ISR 数量变化而失效。单条证明用命令行验证成功后会输出类似0 errors found (335 statements verified)/path/to/verifast -I include -c queue/xQueueGenericSend.c全量回归则用VERIFAST/path/to/verifast make注解变更后需补覆盖率时加NO_COVERAGE1。CI 固定用 VeriFast 19.12 版本本地建议装 nightly。几个证明需要关闭算术溢出检查如queue/create.c、queue/xQueueGenericSendFromISR.cREADME 里有明确清单。上图是 queue 证明的调用关系图绿色函数是已证明的蓝色函数被锁不变式建模假设底层提供相应的原子性保证灰色是假设桩。读 VeriFast 证明前先看懂这张图能省不少力气。避坑清单别一上来就啃 VeriFast。注解成本高它适合核心数据结构需要对外承诺正确性的场景日常开发碰 CMock 就够了。子模块不拉全一切白搭。CBMC 和 VeriFast 依赖的子模块必须执行git submodule update --init --recursive --checkout否则会缺源码。CBMC 的通过是有界结论对外引用时不要夸大成穷尽验证但 CMock CBMC 的 CI 双保险本身就是很强的工程背书。CMock 的覆盖率有意外覆盖别的用例顺带跑到的行不算数官方用coverage标签 lcov 过滤机制处理自己加测试时照着格式标注。把 Test/Target 当集成测试用它依赖真实板卡不是桌面环境能跑的。三条路线里选一条走通、再按风险加码比什么都浅尝辄止有效。【免费下载链接】FreeRTOSClassic FreeRTOS distribution. Started as Git clone of FreeRTOS SourceForge SVN repo. Submodules the kernel.项目地址: https://gitcode.com/GitHub_Trending/fr/FreeRTOS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表