xTaskGetTickCount
xTaskGetTickCount() 是 FreeRTOS 实时操作系统中的一个 API 函数,用于获取系统启动后经过的 时钟滴答(tick)总数。以下是详细解释:
函数功能
-
返回当前 Tick 计数:
系统启动时,一个硬件定时器会以固定频率(由configTICK_RATE_HZ配置,如 1000 Hz = 1ms/tick)触发中断,每次中断称为一个 “tick”。
此函数返回从系统启动到当前时刻累积的 tick 数量。 -
数据类型:
返回TickType_t类型(通常为uint32_t),表示无符号 32 位整数。
注意:计数值会溢出! 当计数达到0xFFFFFFFF后会归零(取决于TickType_t的位宽)。
典型用途
-
时间间隔测量:
记录起始和结束的 tick 值,计算差值得出时间(需考虑溢出):TickType_t start = xTaskGetTickCount(); do_something(); TickType_t duration = xTaskGetTickCount() - start; // 耗时(tick数) -
超时控制:
在阻塞操作中指定等待的最大 tick 数:if (xSemaphoreTake(semaphore, pdMS_TO_TICKS(100)) != pdTRUE) { // 等待信号量超时(100ms) } -
周期性任务调度:
通过vTaskDelayUntil()实现精确周期执行。
注意事项
-
溢出处理:
直接比较时间差时,需使用pdTICKS_TO_MS()或手动处理溢出:// 安全的时间差计算(即使溢出) TickType_t diff = (end >= start) ? (end - start) : (0xFFFFFFFF - start + end); -
中断安全版本:
在中断服务程序(ISR)中调用其后缀为FromISR的版本:TickType_t xTaskGetTickCountFromISR(); // 中断安全 -
与时间单位的转换:
FreeRTOS 提供宏进行 tick 与毫秒的转换:#define pdMS_TO_TICKS(ms) ((TickType_t)((ms) / portTICK_PERIOD_MS)) // ms → tick #define pdTICKS_TO_MS(ticks) ((ticks) * portTICK_PERIOD_MS) // tick → ms
函数原型
#include "task.h"
TickType_t xTaskGetTickCount(void); // 任务中调用
TickType_t xTaskGetTickCountFromISR(void); // 中断中调用
示例代码
void vTaskPeriodic(void *pvParameters) {
TickType_t xLastWakeTime = xTaskGetTickCount(); // 记录起始时间
const TickType_t xPeriod = pdMS_TO_TICKS(100); // 周期 = 100ms
for (;;) {
vTaskDelayUntil(&xLastWakeTime, xPeriod); // 精确周期延迟
perform_task(); // 周期执行的任务
}
}
总结
xTaskGetTickCount() 是 FreeRTOS 中用于 获取系统运行时间基准的核心函数,适用于时间测量、超时控制和周期性调度。使用时需注意 tick 溢出 和 中断安全 问题,合理利用 API 可构建可靠的实时程序。
【RA4L1-SENSOR】04 用FreeRTOS重构工程
= 0; } // 长按 TS0 快速减10 if (e0 == TOUCH_LONG_PRESS && xTaskGetTickCount
ESP32S3 USB CDC TinyUsb TX卡死的原因?怎么解决?
){TickType_t t = xTaskGetTickCount();//单位10ms/* write back */for (size_t i = 0; i < size;) {size_t
使用C++中的ESP32-S3-DevKitC-1 EVM,在类的受保护部分中定义的变量的问题如何解决?
courants : */ CurrentTickCount = xTaskGetTickCount(); /* On redémarre l\'advertising toutes les 5
freertos中的任务执行时间问题求解
, end_time = 0,diff = 0;initial_time = xTaskGetTickCount();while(1){ HAL_GPIO_WritePin(GPIOD
CPU利用率问题求解
){TickType_t timestamp;while(1){ //lpt_profiler; timestamp = xTaskGetTickCount() * portTICK_PERIOD_MS; while
FreeRTOS获取时钟节拍数要么一样要么后来的比之前的只大1的原因?
我写了个程序想通过xTaskGetTickCount()函数来获得按键被按下去的时间长度,程序很简单: if(Key_Scan(KEY1_GPIO_PORT,KEY1_PIN)==KEY_ON
taskDelayUntil使用任务一瞬间运行了10次的原因?
;TaskHandle_t TASK_HANDLE;void LED_TASK(void *para){TickType_t m;u8 f=0;int i=0;m=xTaskGetTickCount
在任务重添加iwdg之后有些任务就不执行了怎么办?
;TickType_t xLastWakeTime;const TickType_t xFrequency = 5;//msxLastWakeTime = xTaskGetTickCount
xTaskGetTickCount溢出时的处理办法?
进入函数时,取 TickType_txStart = xTaskGetTickCount();之后,利用 xTaskGetTickCount() 与 xStart 的差值,判断函数运行是否超时
我的LWIP write发送大数据量就卡死该怎么办?
sem, u32_t timeout){portTickType StartTime, EndTime, Elapsed; StartTime = xTaskGetTickCount
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机