FreeRTOS系统的任务调度时间精度

本文介绍在FreeRTOS系统中实现高精度任务调度的方法。由于FreeRTOS的任务调度周期为毫秒级,仅使用xTaskGetTickCount无法获得微秒级的精确间隔时间。文章提出结合STM32的systemtick定时器来实现这一需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原链接: https://community.bwbot.org/topic/624
开发测试平台: 小强机器人

FreeRTOS系统进行任务调度的时间精度只能保证小于调度周期,调度周期一般是毫秒级。因此在FreeRTOS中执行定时调度任务时,如果要获取这个任务两次调度的精确间隔时间,是不能只由xTaskGetTickCount()系统函数返回值计算得到的(这是一个毫秒级的整数),需要结合stm32 的systemtick定时器得到微秒级精度间隔时间。

### 获取 FreeRTOS 中任务的运行时间 为了获取 FreeRTOS 中某个任务的运行时间,可以利用 `xTaskGetTickCount()` 函数来计算自调度器启动以来的时间差。`xTaskGetTickCount()` 返回的是从调用 `vTaskStartScheduler()` 后经过的 tick 数量[^1]。 对于更精确的任务运行时间统计,FreeRTOS 提供了一个名为 "task stats" 的特性。启用此功能后,可以通过配置宏定义 `configUSE_TRACE_FACILITY` 和 `configGENERATE_RUN_TIME_STATS` 来开启运行时统计数据收集的功能。当这些选项被激活时: - 每个任务结构体中会增加两个成员变量用于存储最小空闲时间和总运行时间。 - 可以通过调用 API 函数 `uxTaskGetSystemState()` 或者使用命令行工具读取特定任务的状态信息,其中包括该任务占用 CPU 的百分比等数据。 另外一种方法是手动记录每个任务进入和退出运行态的具体时刻,并据此计算其实际执行期间所消耗的时间片长度。这通常涉及到修改任务创建代码,在每次切换前后保存当前 ticks 值并做减法运算得出结果。 ```c // 示例:假设已经开启了 configGENERATE_RUN_TIME_STATS 配置项 void vApplicationIdleHook(void){ static portTickType lastWakeTime; // 记录本次唤醒前一刻的时间戳 uint32_t ulTotalRunTime, ulThisRunTime; /* Get the total run time counter value before we change it. */ ulTotalRunTime = uxTaskGetSysState()->ulTotalRunTimeCounts[tskIDLE_TASK_HANDLE]; // 更新 IDLE 任务的累计运行时间 vTaskSetTimeOutState(&lastWakeTime); } ``` 需要注意的是,上述方式适用于大多数应用场景;然而,如果系统中有多个不同频率的工作模式(比如低功耗状态下),则可能需要额外考虑如何处理因工作模式变化而引起的 tick 时间间隔改变的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值