乐鑫技术交流
直播中

王涛

7年用户 1225经验值
私信 关注
[问答]

在1.3版本的RTOS-SDK下,关于vTaskDelay的问题求解

你们1个tick所需的时间是10ms, 如果我要在一个线程中sleep几个ms(少于10ms), 让其他优先级较低的线程运行,应该要这么做?
首先你们说“请勿修改 FreeRTOSConfig.h,改动并不会影响底层运行,无法生效。”
因此在FreeRTOSConfig.h中"#define   configTICK_RATE_HZ   ( ( portTickType ) 100 )"这个无法修改。那是要用vTaskDelayUntil的这个API,还是用其他的方法呢?(请不要提供不靠谱的方法 )

回帖(1)

尚文清

2024-7-22 16:17:41
在FreeRTOS中,`vTaskDelay`函数用于让当前任务延迟指定的tick数。由于你提到在1.3版本的RTOS-SDK中,一个tick的时间是10ms,如果你需要让任务延迟少于10ms的时间,使用`vTaskDelay`可能不是最佳选择,因为它的最小延迟时间是10ms。

你可以考虑以下几种方法来实现你的需求:

1. **使用`vTaskDelayUntil`**:
   `vTaskDelayUntil`函数允许你指定一个绝对时间,而不是相对时间。你可以使用这个函数来实现更精确的延迟。首先,你需要获取当前的时间,然后加上你希望延迟的时间(以tick为单位),最后调用`vTaskDelayUntil`。

   ```c
   TickType_t xLastWakeTime;
   const TickType_t xFrequency = 1; // 1 tick的频率,即10ms

   // 获取当前时间
   xLastWakeTime = xTaskGetTickCount();

   // 计算延迟时间
   TickType_t xDelayTime = (xFrequency * 10) / portTICK_PERIOD_MS; // 延迟10ms

   // 调用vTaskDelayUntil
   vTaskDelayUntil(&xLastWakeTime, xDelayTime);
   ```

2. **使用`xTaskNotifyWait`**:
   如果你希望在某个事件发生时唤醒任务,可以使用`xTaskNotifyWait`。这种方法允许你在事件发生时立即唤醒任务,而不是等待固定的时间。

   ```c
   BaseType_t xReturn;
   uint32_t ulNotificationValue;

   // 等待通知
   xReturn = xTaskNotifyWait(0, 0, &ulNotificationValue, 10 / portTICK_PERIOD_MS);

   if (xReturn == pdPASS)
   {
       // 处理通知
   }
   ```

3. **使用`vTaskSuspend`和`vTaskResume`**:
   如果你希望在特定条件下让任务暂停,可以使用`vTaskSuspend`和`vTaskResume`。这种方法允许你在满足条件时立即恢复任务的执行。

   ```c
   // 暂停任务
   vTaskSuspend(xTaskToSuspend);

   // ... 执行其他任务 ...

   // 恢复任务
   vTaskResume(xTaskToSuspend);
   ```

4. **使用定时器**:
   另一种方法是使用FreeRTOS的定时器功能。你可以创建一个定时器,当定时器到期时,它会调用一个回调函数来处理你的任务。这种方法允许你在定时器到期时立即唤醒任务。

   ```c
   TimerHandle_t xTimer;
   StaticTimer_t xTimerBuffer;
   void vTimerCallback(TimerHandle_t pxTimer)
   {
       // 处理定时器到期事件
   }

   // 创建定时器
   xTimer = xTimerCreateStatic("Timer", 10 / portTICK_PERIOD_MS, pdFALSE, NULL, vTimerCallback, &xTimerBuffer);

   // 启动定时器
   xTimerStart(xTimer, 0);
   ```

总之,你可以根据你的具体需求选择合适的方法来实现任务的延迟或唤醒。在这些方法中,`vTaskDelayUntil`和`xTaskNotifyWait`可能更适合你的需求,因为它们可以实现更精确的延迟和事件驱动的唤醒。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分