别来国企因为也要996 2021-05-08 11:27 采纳率: 66.7%
浏览 46

为什么HAL_Delay(0)也会有延迟效果?

为什么HAL_Delay(0)也会有延迟效果?
  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 优质创作者: Java、后端开发技术领域 2024-07-06 14:33
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题:为什么HAL_Delay(0)也会有延迟效果? 回答: HAL_Delay(0)的延迟效果是由于操作系统调度策略和优先级导致的。在多任务操作系统中,当一个任务执行时,操作系统会维护一个任务调度表,根据任务的优先级和时间片轮转算法来决定任务的执行顺序。当一个任务执行HAL_Delay(0)时,操作系统会检查当前是否有更高优先级的任务等待执行,如果有,则立即进行任务切换,而HAL_Delay(0)函数会等待下一个时间片之前被切换回来执行。 示例代码:
    #include "stm32xxx_hal.h"
    void Task1(void* argument);
    void Task2(void* argument);
    int main(void)
    {
      // 初始化RTOS和硬件
      // ...
      // 创建任务1
      osThreadDef(Task1, Task1, osPriorityNormal, 0, 128);
      osThreadCreate(osThread(Task1), NULL);
      // 创建任务2
      osThreadDef(Task2, Task2, osPriorityHigh, 0, 128);
      osThreadCreate(osThread(Task2), NULL);
      // 启动RTOS调度器
      osKernelStart();
      while (1)
      {
        // 此处执行其他任务或代码
      }
    }
    // 任务1,低优先级任务
    void Task1(void* argument)
    {
      while (1)
      {
        // 执行任务1代码
        // 等待0毫秒
        HAL_Delay(0);
      }
    }
    // 任务2,高优先级任务
    void Task2(void* argument)
    {
      while (1)
      {
        // 执行任务2代码
        // 等待0毫秒
        HAL_Delay(0);
      }
    }
    

    在以上示例代码中,有两个任务:Task1和Task2。Task1是低优先级任务,Task2是高优先级任务。当Task1执行HAL_Delay(0)时,操作系统会检查是否有更高优先级的任务(Task2)等待执行,如果有,则立即切换到Task2执行。同样地,当Task2执行HAL_Delay(0)时,操作系统会检查是否有更高优先级的任务(Task1)等待执行,如果有,则立即切换到Task1执行。这样通过任务切换的过程,即使执行HAL_Delay(0),也可以实现一定的延迟效果,以保证任务之间的公平运行或按照优先级顺序执行。

    评论

报告相同问题?