FreeRTOS CubeMX卡在只运行第一个任务

文章讲述了在FreeRTOS中,使用osDelay而非HAL_Delay进行任务延时的原因,因为osDelay能确保任务切换。特别指出中断中不能使用HAL_Delay,因为中断优先级低。同时解释了osDelay的计时机制与configTICK_RATE_HZ配置的关系。
摘要由CSDN通过智能技术生成

1. 在用CubeMX创建的FreeRTOS,任务中如果使用HAL_Delay(1000);这样会导致无法切换任务,所以只能使用    osDelay(500);来延时

HAL_Delay(1000);




osDelay(500);

解决办法

osDelay是FreeRTOS(Real-Time Operating System)中的一个函数,用于实现任务的延时。FreeRTOS是一个开源的实时操作系统,专门用于嵌入式系统。osDelay函数允许任务挂起一段时间,然后由操作系统调度器在指定的时间后重新运行该任务。在等待期间,任务会被放入挂起状态,让其他任务有机会运行。

也就是说,当调用osDelay时,线程A进入阻塞态,此时任务控制器选择进入就绪态的线程B执行,循环往复,线程A、B同时被执行。我们可以将任务A和B进行如下改动,即可看到既打印A又打印B。

void A(void *argument)
{
  while (1)
  {
    printf("A\r\n");
    osDelay(1000);
  }
}

void B(void *argument)
{
  while (1)
  {
    printf("B\r\n");
    osDelay(1000);
  }
}

使用osDelay可能带来的问题

观察一下HAL_DelayosDelay的函数原型:

/**
  * @brief This function provides minimum delay (in milliseconds) based
  */
__weak void HAL_Delay(uint32_t Delay);

/*
  Wait for Timeout (Time Delay).
*/
osStatus_t osDelay (uint32_t ticks);

可以看到HAL_Delay函数的目的是提供毫秒级别的延时,意味着当你输入HAL_Delay(500),硬件会尽量延时精确到500ms的时间。

与之不同的是,osDelay函数的输入是ticksticks是一个计时单位,表示任务将被挂起的时间长度。每个tick的时间取决于FreeRTOS配置的时钟节拍(tick)周期。例如,如果tick周期为1毫秒,那么传递参数ticks为10就会使任务挂起10毫秒。由此可见,osDelay函数延时的时间和一个ticks记时时间长度有很大关系。

那么如何确定一个ticks具体代表多长时间呢?首先我们应该找到用于配置的头文件,通常这个头文件名字叫做FreeRTOSConfig.h。其中,configTICK_RATE_HZ配置选项的值表示每秒钟系统时钟节拍(tick)的数量。configTICK_RATE_HZ的值一般默认被设置为1000,表示系统时钟每秒产生1000个tick,即每个tick的时间间隔为1毫秒,此时osDelay对单个任务延时的时间长度和HAL_Delay近似。

                引用自:FreeRTOS中osDelay和HAL_Delay的区别 - 知乎

 2.中断中不能使用HAL_Delay(1000);由于sys的的中断优先级太低,所以,在其它中断里面无法获取时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值