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_Delay
和osDelay
的函数原型:
/**
* @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
函数的输入是ticks
。ticks
是一个计时单位,表示任务将被挂起的时间长度。每个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的区别 - 知乎文章来源:https://www.toymoban.com/news/detail-753776.html
2.中断中不能使用HAL_Delay(1000);由于sys的的中断优先级太低,所以,在其它中断里面无法获取时间文章来源地址https://www.toymoban.com/news/detail-753776.html
到了这里,关于FreeRTOS CubeMX卡在只运行第一个任务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!