各位高手: 使用stm32cubemx程序生成包括FreeRTOS系统的STM32F1XX模版进行开发,现在创建多个任务,但在使用延迟函数上有个疑问。 1、osDelay和HAL_Delay均可以实现延迟动作,但是这两种在有操作系统的项目中,效果是否一样? 2、在FreeRTOS中osDelay是否可以将当前任务挂起,使低优先级的就绪任务进行执行,而osDelay完成后,该任务回复执行? 3、HAL_Delay是不是会造成独占CPU资源,while等待HAL_GetTick()的参数大于设定参数? |
osDelay属于CMSIS-RTOS的阶层,ARM CMSIS已经定义好了,由各RTOS具体实现。
FreeRTOS内部其实使用vTaskDelay来实现osDelay,其作用是让任务阻塞(注意是阻塞不是挂起,挂起必须显示调用vTaskSuspend()和vTaskResume()才能够实现),任务阻塞后,RTOS系统调用其它处于就绪状态的优先级最高的任务来执行。
当然你也可以不用osDelay而直接使用vTaskDelay,但为了保持兼容性,建议还是用osDelay而不是vTaskDelay,其实其效果类似。
HAL_Delay一直不停的调用获取系统时间的函数,直到指定的时间流逝然后退出,故其占用了全部CPU时间。
照这么说,osDelay 会比 HAL_Delay 好用