登录/注册

xTaskGetTickCount

更多

xTaskGetTickCount() 是 FreeRTOS 实时操作系统中的一个 API 函数,用于获取系统启动后经过的 时钟滴答(tick)总数。以下是详细解释:


函数功能


典型用途

  1. 时间间隔测量
    记录起始和结束的 tick 值,计算差值得出时间(需考虑溢出):

    TickType_t start = xTaskGetTickCount();
    do_something();
    TickType_t duration = xTaskGetTickCount() - start; // 耗时(tick数)
  2. 超时控制
    在阻塞操作中指定等待的最大 tick 数:

    if (xSemaphoreTake(semaphore, pdMS_TO_TICKS(100)) != pdTRUE) {
     // 等待信号量超时(100ms)
    }
  3. 周期性任务调度
    通过 vTaskDelayUntil() 实现精确周期执行。


注意事项

  1. 溢出处理
    直接比较时间差时,需使用 pdTICKS_TO_MS() 或手动处理溢出:

    // 安全的时间差计算(即使溢出)
    TickType_t diff = (end >= start) ? (end - start) : (0xFFFFFFFF - start + end);
  2. 中断安全版本
    在中断服务程序(ISR)中调用其后缀为 FromISR 的版本:

    TickType_t xTaskGetTickCountFromISR(); // 中断安全
  3. 与时间单位的转换
    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

2025-06-16 22:28:02

ESP32S3 USB CDC TinyUsb TX卡死的原因?怎么解决?

){TickType_t t = xTaskGetTickCount();//单位10ms/* write back */for (size_t i = 0; i < size;) {size_t

2024-06-05 06:22:15

使用C++中的ESP32-S3-DevKitC-1 EVM,在类的受保护部分中定义的变量的问题如何解决?

courants : */ CurrentTickCount = xTaskGetTickCount(); /* On redémarre l\'advertising toutes les 5

2023-04-14 08:13:18

freertos中的任务执行时间问题求解

, end_time = 0,diff = 0;initial_time = xTaskGetTickCount();while(1){ HAL_GPIO_WritePin(GPIOD

2023-01-30 06:03:39

CPU利用率问题求解

){TickType_t timestamp;while(1){ //lpt_profiler; timestamp = xTaskGetTickCount() * portTICK_PERIOD_MS; while

2022-12-06 06:00:31

FreeRTOS获取时钟节拍数要么一样要么后来的比之前的只大1的原因?

我写了个程序想通过xTaskGetTickCount()函数来获得按键被按下去的时间长度,程序很简单: if(Key_Scan(KEY1_GPIO_PORT,KEY1_PIN)==KEY_ON

2020-07-27 22:46:24

taskDelayUntil使用任务一瞬间运行了10次的原因?

;TaskHandle_t TASK_HANDLE;void LED_TASK(void *para){TickType_t m;u8 f=0;int i=0;m=xTaskGetTickCount

2020-07-26 08:00:46

在任务重添加iwdg之后有些任务就不执行了怎么办?

;TickType_t xLastWakeTime;const TickType_t xFrequency = 5;//msxLastWakeTime = xTaskGetTickCount

2020-06-11 09:00:33

xTaskGetTickCount溢出时的处理办法?

进入函数时,取 TickType_txStart = xTaskGetTickCount();之后,利用 xTaskGetTickCount() 与 xStart 的差值,判断函数运行是否超时

2020-06-11 09:00:32

我的LWIP write发送大数据量就卡死该怎么办?

sem, u32_t timeout){portTickType StartTime, EndTime, Elapsed; StartTime = xTaskGetTickCount

2019-07-16 22:28:02
7天热门专题 换一换
相关标签