gpt4 book ai didi

c - vTaskDelay 和 _delay_ms 之间的行为差​​异是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 00:44:09 24 4
gpt4 key购买 nike

<强>1。简介

我似乎无法找到有关 FreeRTOS 任务中以下函数之间行为差异的信息或详细解释:

  • vTaskDelay
  • _delay_ms

<强>2。代码

假设您有以下代码:

IdleHook + 任务创建

Long value = 0;

void vApplicationIdleHook( void ) {
while(1)
{
// empty
}
}

int main(void)
{
xTaskCreate(TaskIncrement, (const portCHAR *)"up" , 256, NULL, 2, NULL );
xTaskCreate(TaskDecrement, (const portCHAR *)"down" , 256, NULL, 1, NULL );

vTaskStartScheduler();
}

带有 vTaskDelay 的任务

static void TaskDecrement(void *param)
{
while(1)
{
for(unsigned long i=0; i < 123; i++) {
//semaphore take
value--;
//semaphore give
}
vTaskDelay(100);
}
}

static void TaskIncrement(void *param)
{
while(1)
{
for(unsigned long i=0; i < 123; i++) {
//semaphore take
value++;
//semaphore give
}
vTaskDelay(100);
}
}

具有 _delay_ms 的任务

static void TaskDecrement(void *param)
{
while(1)
{
for(unsigned long i=0; i < 123; i++) {
//semaphore take
value--;
//semaphore give
}
_delay_ms(100);
}
}

static void TaskIncrement(void *param)
{
while(1)
{
for(unsigned long i=0; i < 123; i++) {
//semaphore take
value++;
//semaphore give
}
_delay_ms(100);
}
}

<强>3。问题

当为任务提供 vTaskDelay 与 _delay_ms 时,程序流程会发生什么情况?

注意:给定的两个示例任务具有不同的优先级。

最佳答案

来自 https://www.freertos.org/Documentation/FreeRTOS_Reference_Manual_V10.0.0.pdf :

Places the task that calls vTaskDelay() into the Blocked state for a fixed number of tick interrupts. Specifying a delay period of zero ticks will not result in the calling task being placed into the Blocked state, but will result in the calling task yielding to any Ready state tasks that share its priority. Calling vTaskDelay(0) is equivalent to calling taskYIELD().

我想您已经明白了,但是如果您创建了多个任务,那么 vTaskDelay() 会将正在运行的任务置于“阻塞”状态,持续指定的节拍中断次数(不是毫秒!)并允许具有下一个最高优先级的任务运行,直到它获得控制权(或被抢占,具体取决于您的 FreeRTOS 配置)。

我不认为 _delay_ms() 是 FreeRTOS 库的一部分。您确定这不是特定于平台的功能吗?我的猜测是,如果最高优先级的任务调用 _delay_ms(),那么它会导致忙等待。否则,具有更高优先级的任务可能会抢占正在延迟调用 _delay_ms() 的任务(也就是说,_delay_ms() 不会立即让出控制权)。

或许对上述内容有更好的总结:在多任务应用程序中,_delay_ms() 不是确定性的。

关于c - vTaskDelay 和 _delay_ms 之间的行为差​​异是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51144477/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com