新闻详情

新闻详情

首页 / 资讯中心 / 详情

FreeRTOS 第三方平台测试项目模板详解:基于 Template 目录为你的板卡跑通全部内核测试

发布时间:2026/9/16 14:21:43来源:尧图网络
FreeRTOS 第三方平台测试项目模板详解:基于 Template 目录为你的板卡跑通全部内核测试
FreeRTOS 第三方平台测试项目模板详解:基于 Template 目录为你的板卡跑通全部内核测试【免费下载链接】FreeRTOSClassic FreeRTOS distribution. Started as Git clone of FreeRTOS SourceForge SVN repo. Submodules the kernel.项目地址: https://gitcode.com/GitHub_Trending/fr/FreeRTOS本文围绕 FreeRTOS 仓库中FreeRTOS/Demo/ThirdParty/Template/目录下的官方模板说明展开,该模板是合作伙伴/社区为新硬件工具链组合贡献 FreeRTOS 移植验证工程的标准起点。读完本文后,你将掌握:如何搭建一个第三方平台测试工程、FreeRTOSConfig.h中各测试开关宏的确切含义与配套内核 API、寄存器测试与中断嵌套测试的实现原理,以及如何分组运行、验证全部内核 API 测试并输出 No errors 结果。一、模板的定位:为 Partner/Community 测试仓库提供统一入口FreeRTOS 主仓库通过FreeRTOS/Demo/下的各板卡目录维护官方演示工程,而第三方硬件的测试工程则被要求放入独立的FreeRTOS Partner Supported Demos或FreeRTOS Community Supported Demos仓库中(本仓库保留了FreeRTOS/Demo/ThirdParty/Partner-Supported-Demos/与FreeRTOS/Demo/ThirdParty/Community-Supported-Demos/占位目录)。官方为这类第三方工程准备了统一模板目录 FreeRTOS/Demo/ThirdParty/Template/,其中包含 6 个需要原样拷入用户工程的核心文件:文件作用TestRunner.c / TestRunner.h测试总入口,vStartTests()负责按宏开关创建全部测试任务并启动调度器,同时提供周期性 Check 巡检任务与 tick hook 实现IntQueueTimer.c / IntQueueTimer.h中断嵌套测试(IntQueue)所需的硬件定时器初始化桩与 ISR 处理桩,需要用户按自己平台填充RegTests.c / RegTests.h寄存器上下文保存/恢复正确性测试,prvRegisterTest1Task~prvRegisterTest4Task四个任务体需用户按架构填充目录命名建议为hardware_name_compiler_name(如STM32F407_IAR),项目在该目录下建立后即可开始配置。二、工程配置:编译 Common/Minimal 测试套件2.1 需要编译的公共测试源码在用户工程中,除了模板 6 个文件外,还需编译 FreeRTOS/Demo/Common/Minimal/ 目录下的除下列 7 个文件以外的全部文件:comtest_strings.c、comtest.c—— 串口输出测试框架,本模板改用configPRINTF直接输出;crhook.c、crflash.c、flash.c、flash_timer.c—— 协程相关测试(模板默认不使用协程);sp_flop.c—— 旧版数学测试替代实现,模板使用flop.c。这些文件构成了测试任务的业务层:阻塞队列测试(BlockQ.c)、信号量测试(semtest.c)、队列集测试(QueueSet.c)、软件定时器演示(TimerDemo.c)、流/消息缓冲(StreamBufferDemo.c、MessageBufferDemo.c)、中断队列压力测试(IntQueue.c)、自删除任务测试(death.c)等,共 30 余个.c文件,覆盖了任务通知、队列、互斥、事件组、定时器、流缓冲等全部主流内核 API。2.2 头文件搜索路径将FreeRTOS/Demo/Common/include加入 include 搜索路径。TestRunner.c中vStartTests()会依次调用各套件头文件声明的vStart*创建函数(如vStartBlockingQueueTasks()、vStartQueueSetTasks()),而IntQueue.c等文件则通过IntQueue.h暴露xFirstTimerHandler()/xSecondTimerHandler()供 TestRunner 的 tick hook 调用。2.3 在 main 中调用 vStartTests()硬件初始化完成后,在main中调用vStartTests()。从 TestRunner.c 源码看,该函数先创建名为Check的巡检任务(优先级为configMAX_PRIORITIES - 2),随后根据 24 个configSTART_*宏编译期决定是否创建对应测试任务,最后执行vTaskStartScheduler()—— 因此它启动调度器后永不返回:#include TestRunner.h void main( void ) { /* Startup and Hardware initialization. */ /* Start tests. */ vStartTests(); /* Should never reach here. */ for( ; ; ); }TestRunner.h 中对该函数的注释也明确说明:Start all the tests. Note that this function starts the scheduler and therefore, never returns.三、FreeRTOSConfig.h 配置:四项必配 24 个测试开关3.1 四个必备配置1) 使能 tick hook—— TestRunner 的vApplicationTickHook()依赖它来驱动多个需要周期性 ISR 侧动作的测试(任务通知、队列集、事件组等):#define configUSE_TICK_HOOK 12) 任务通知数组大小设为 3——TaskNotifyArray.c测试使用 3 个通知槽位:#define configTASK_NOTIFICATION_ARRAY_ENTRIES 33) 映射 configPRINTF—— 巡检任务最终通过configPRINTF输出状态。注意该宏调用被双括号包裹以兼容 C89,因此映射到线程安全printf时应写成:#define configPRINTF( X ) printf X4) 24 个测试开关宏—— 初始全部置 0(可按需开启),完整列表如下:#define configSTART_TASK_NOTIFY_TESTS 0 #define configSTART_TASK_NOTIFY_ARRAY_TESTS 0 #define configSTART_BLOCKING_QUEUE_TESTS 0 #define configSTART_SEMAPHORE_TESTS 0 #define configSTART_POLLED_QUEUE_TESTS 0 #define configSTART_INTEGER_MATH_TESTS 0 #define configSTART_GENERIC_QUEUE_TESTS 0 #define configSTART_PEEK_QUEUE_TESTS 0 #define configSTART_MATH_TESTS 0 #define configSTART_RECURSIVE_MUTEX_TESTS 0 #define configSTART_COUNTING_SEMAPHORE_TESTS 0 #define configSTART_QUEUE_SET_TESTS 0 #define configSTART_QUEUE_OVERWRITE_TESTS 0 #define configSTART_EVENT_GROUP_TESTS 0 #define configSTART_INTERRUPT_SEMAPHORE_TESTS 0 #define configSTART_QUEUE_SET_POLLING_TESTS 0 #define configSTART_BLOCK_TIME_TESTS 0 #define configSTART_ABORT_DELAY_TESTS 0 #define configSTART_MESSAGE_BUFFER_TESTS 0 #define configSTART_STREAM_BUFFER_TESTS 0 #define configSTART_STREAM_BUFFER_INTERRUPT_TESTS 0 #define configSTART_TIMER_TESTS 0 #define configSTART_INTERRUPT_QUEUE_TESTS 0 #define configSTART_REGISTER_TESTS 0 #define configSTART_DELETE_SELF_TESTS 0从源码结构看,这些宏的生效点有两处:vStartTests()中按宏调用各套件的vStart*创建函数;vApplicationTickHook()中按宏调用各套件的周期性 ISR 侧函数(如xNotifyTaskFromISR()、vInterruptSemaphorePeriodicTest()等,见 TestRunner.c)。因此某个宏为 1 时,其对应的创建与 tick hook 两段代码会同时编译进工程。另有两处隐含约束值得注意:configSTART_TIMER_TESTS还额外要求configUSE_PREEMPTION ! 0,否则定时器演示任务不会被创建(源码注释:Dont expect these tasks to pass when preemption is not used);若开启configSTART_INTERRUPT_QUEUE_TESTS,由于 IntQueue.c 中有#if ( INCLUDE_eTaskGetState ! 1 ) #error检查,必须同时在FreeRTOSConfig.h中定义INCLUDE_eTaskGetState 1。仓库内已有真实工程按此模板配置,可参照 NUCLEO_L010RB 的 FreeRTOSConfig.h:其中configTASK_NOTIFICATION_ARRAY_ENTRIES 3、#define configPRINTF( X ) printf X以及全部置 0 的configSTART_*序列与模板说明完全一致。3.2 巡检任务与 No errors 输出机制vStartTests()创建的prvCheckTask每 5 秒(pdMS_TO_TICKS( 5000UL ))醒来一次(见 TestRunner.c):对每个已开启的测试调用其xAre*StillRunning()检查函数,任一返回异常即将pcStatusMessage锁存为对应错误字符串(如Error: Notification、Error: IntQueue、Error: RegTests),否则保持初始值No errors,最后经configPRINTF( ( %s \r\n, pcStatusMessage ) )输出。这就是各测试预期输出连续 4 行No errors的来源:巡检任务每 5 秒打印一次,4 行即观察了约 15~20 秒的窗口。四、寄存器测试(Register Tests):验证上下文保存/恢复寄存器测试直接检验 FreeRTOS 端口(移植层)在任务切换时对寄存器上下文的保存与恢复是否正确,是移植正确性的金标准之一。4.1 填充四个测试任务打开拷贝来的 RegTests.c,按源码中保留的四步注释算法,为prvRegisterTest1Task~prvRegisterTest4Task编写任务体:for( ; ; ) { /* 1. Fill the registers stored as part of task context with known values. * 2. Force a context switch. * 3. Verify that all the registers contain expected values. * 4. If all the register contain expected values, increment ulRegisterTest1Counter. */ }即:把上下文保存的寄存器填成已知值 → 强制一次上下文切换 → 醒来后校验寄存器仍为预期值 → 全部通过则递增对应计数器(ulRegisterTest1Counter~ulRegisterTest4Counter)。任一校验失败会将xErrorDetected锁存为pdTRUE。4.2 使能与运行将开关置 1 后构建运行:#define configSTART_REGISTER_TESTS 1vStartRegisterTasks( uxPriority )会以传入优先级(模板中为tskIDLE_PRIORITY)、configMINIMAL_STACK_SIZE栈创建 4 个任务并逐一对xTaskCreate结果做configASSERT;巡检任务通过 xAreRegisterTasksStillRunning() 比对四个计数器的历史值,计数器不再增长即判定任务卡死并置错。预期输出:No errors No errors No errors No errors五、中断嵌套测试(Interrupt Queue Tests):两个定时器 六个任务的压力测试5.1 测试原理IntQueue.c 是模板中最复杂的套件:它用一个 tick 定时器 一个用户硬件定时器产生两个互相嵌套的 ISR,同时让高优先级任务 ×2、低优先级任务 ×2、中断 ×2并发读写两条队列(一条通常为空、一条通常已满),验证在伪并发的多读多写下无重复/无丢失、且低优先级任务不会在高优先级任务正忙时成功访问队列。测试对每个已收到的值记录访问者标识,每 200 个值(外加 50 个 overrun)做一次完整性校验。两个 ISR 侧处理函数分别是:xFirstTimerHandler()—— 由 tick hook 调用,见 TestRunner.c:#if( configSTART_INTERRUPT_QUEUE_TESTS 1 ) { portYIELD_FROM_ISR( xFirstTimerHandler() ); } #endifxSecondTimerHandler()—— 由用户硬件定时器 ISR 调用,模板 IntQueueTimer.c 已写好封装,用户只需把硬件定时器中断接到它:void IntQueueTestTimerHandler( void ) { portYIELD_FROM_ISR( xSecondTimerHandler() ); }5.2 硬件平台三步配置硬件不支持中断嵌套则跳过本节(嵌套发生的前提是高优先级 ISR 能打断低优先级 ISR)。填充vInitialiseTimerForIntQueueTest():初始化并启动一个硬件定时器,且其中断的逻辑优先级必须 ≤configMAX_SYSCALL_INTERRUPT_PRIORITY(该宏定义了可调用 FreeRTOS 从 ISR API 的最高优先级)。模板给出的 ARM MPS2 TIM0 示例:void vInitialiseTimerForIntQueueTest( void ) { /* Clear interrupt. */ CMSDK_TIMER0-INTCLEAR ( 1ul 0 ); /* Reload value is slightly offset from the other timer. */ CMSDK_TIMER0-RELOAD ( configCPU_CLOCK_HZ / tmrTIMER_0_FREQUENCY ) 1UL; CMSDK_TIMER0-CTRL ( ( 1ul 3 ) | ( 1ul 0 ) ); NVIC_SetPriority( TIMER0_IRQn, configMAX_SYSCALL_INTERRUPT_PRIORITY ); NVIC_EnableIRQ( TIMER0_IRQn ); }注意 RELOAD 相对 tick 定时器偏移 1 个计数,保证两个定时器节拍不完全对齐,从而制造真实的嵌套/交叠访问。 3.安装中断处理函数:将IntQueueTestTimerHandler()直接装为定时器 ISR,或从你的定时器 ISR 中调用它。MPS2 的 TIM0 处理函数示例:void TIMER0_Handler( void ) { /* Clear interrupt. */ CMSDK_TIMER0-INTCLEAR ( 1ul 0 ); IntQueueTestTimerHandler(); }从源码结构看,vInitialiseTimerForIntQueueTest()的调用时机由测试自身保证:vStartInterruptQueueTasks()创建的第一个高优先级任务(标识为intqHIGH_PRIORITY_TASK1)在启动时才调用它,注释明确要求定时器必须在调度器启动之后才开始。使能并运行:#define configSTART_INTERRUPT_QUEUE_TESTS 1预期输出同样是 4 行No errors(巡检任务发现异常时会输出Error: IntQueue)。六、运行全部测试与分组策略将FreeRTOSConfig.h中所有configSTART_Test_Name_TESTS宏置 1,构建并运行,预期输出 4 行No errors。如果 Flash/RAM 空间不足以把全部测试装进同一个二进制,可以逐个或分组运行:把不打算本轮运行的测试宏置 0、要运行的置 1,分次构建验证。得益于vStartTests()与vApplicationTickHook()中成对的#if( configSTART_* 1 )编译分支,任意宏组合都能得到可编译、行为自洽的子集测试(创建函数与 tick hook 侧代码同步裁剪)。注意保持前文提到的隐含依赖:开了configSTART_INTERRUPT_QUEUE_TESTS必须INCLUDE_eTaskGetState 1;开了configSTART_TIMER_TESTS必须configUSE_PREEMPTION 1。七、收尾:为工程补齐 README工程目录中需新增一个README.md,至少包含四项信息:硬件页面链接;工具链安装/搭建方法;工程的构建与运行方法;其他相关信息(如板卡接线、烧录方式、已知限制等)。这与FreeRTOS/Demo/下既有第三方板卡目录(如CORTEX_M0_NUCLEO_L010RB_GCC_IAR/)的工程组织方式保持一致。八、小结:模板文件的职责速查环节模板提供用户需完成测试总入口TestRunner.c(Check 任务 tick hook 24 路开关)main中调用vStartTests()寄存器测试RegTests.c(任务创建、卡死检测框架)填充prvRegisterTest1~4Task的寄存器校验体中断嵌套测试IntQueueTimer.c(IntQueueTestTimerHandler封装)填充vInitialiseTimerForIntQueueTest()并挂接 ISR测试任务集FreeRTOS/Demo/Common/Minimal/中除 7 个文件外的全部源码编译进工程、加入Common/include搜索路径配置无FreeRTOSConfig.h中 4 项必配 24 个开关宏按以上步骤走完,Check 巡检任务每 5 秒一行No errors的稳定输出,即代表所选硬件工具链组合上的 FreeRTOS 移植(任务切换、上下文保存、ISR 从 ISR API、优先级嵌套行为)已通过官方全量测试套件的验证。【免费下载链接】FreeRTOSClassic FreeRTOS distribution. Started as Git clone of FreeRTOS SourceForge SVN repo. Submodules the kernel.项目地址: https://gitcode.com/GitHub_Trending/fr/FreeRTOS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

ASP经典技术实战:GM推广系统v6.0部署与归因开发解析 2026/9/16 15:09:52

ASP经典技术实战:GM推广系统v6.0部署与归因开发解析

简介:这是一套基于ASP技术构建的游戏推广系统源码,面向游戏管理员提供用户管理、推广链接追踪、数据分析、广告投放与奖励发放等一体化后台功能,适合熟悉服务器端脚本开发的运营人员或学习者参考和二次开发。压缩包共四百九十个文件&#xff…

阅读更多 →
Omi Windows 桌面端「What‘s New」更新日志体系解析:从 changelog Fragment 到丙烯酸 Toast 的完整链路 2026/9/16 15:09:52

Omi Windows 桌面端「What‘s New」更新日志体系解析:从 changelog Fragment 到丙烯酸 Toast 的完整链路

Omi Windows 桌面端「Whats New」更新日志体系解析:从 changelog Fragment 到丙烯酸 Toast 的完整链路 【免费下载链接】Friend AI that sees your screen, listens to your conversations and tells you what to do 项目地址: https://gitcode.com/GitHub_Trendi…

阅读更多 →
Litestar 状态码参考:`litestar.status_codes` 模块全量解析与实战用法 2026/9/16 15:09:52

Litestar 状态码参考:`litestar.status_codes` 模块全量解析与实战用法

Litestar 状态码参考:litestar.status_codes 模块全量解析与实战用法 【免费下载链接】litestar Light, flexible and extensible ASGI framework | Built to scale 项目地址: https://gitcode.com/GitHub_Trending/li/litestar 本文是 Litestar 框架内置状态…

阅读更多 →
图片风格迁移系统:VGG19特征提取与Gram矩阵双损失原理详解 2026/9/16 15:09:52

图片风格迁移系统:VGG19特征提取与Gram矩阵双损失原理详解

简介:这是一份基于PyTorch实现的图片风格迁移完整项目,面向深度学习初学者与计算机视觉爱好者,可帮助理解如何利用卷积神经网络(CNN)将内容图像与风格图像融合,生成艺术化作品。资源共28个文件,…

阅读更多 →
STM32裸机实现RNDIS+LwIP USB网络设备 2026/9/16 15:09:52

STM32裸机实现RNDIS+LwIP USB网络设备

简介:本资源是面向嵌入式开发工程师与STM32进阶学习者的RNDIS网络通信实战工程,聚焦于在STM32F429DISCO开发板上基于LwIP协议栈实现USB RNDIS虚拟网卡功能,并采用静态IP配置(不依赖DHCP),适用于USB转以太网…

阅读更多 →
Claude 提示工程交互教程:9 章练习写出高质量提示词的完整指南 2026/9/16 15:06:51

Claude 提示工程交互教程:9 章练习写出高质量提示词的完整指南

Claude 提示工程交互教程:9 章练习写出高质量提示词的完整指南 【免费下载链接】prompt-eng-interactive-tutorial Anthropics Interactive Prompt Engineering Tutorial 项目地址: https://gitcode.com/GitHub_Trending/pr/prompt-eng-interactive-tutorial …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞