gpt4 book ai didi

operating-system - 任务在循环调度中表现不正确

转载 作者:行者123 更新时间:2023-12-04 12:01:41 25 4
gpt4 key购买 nike

我在 STM32F4DISCOVERY 板上运行 FreeRTOS,我有以下代码:

xTaskCreate( vTask1, "Task 1", 200, NULL, 1, NULL );
xTaskCreate( vTask2, "Task 2", 200, NULL, 1, NULL );
vTaskStartScheduler();

其中 vTask1 是这个函数:
void vTask1( void *pvParameters )
{
volatile unsigned long ul;

for( ;; )
{
LED_On(0);

for( ul = 0; ul < mainDELAY_LOOP_COUNT; ul++ )
{
}
LED_On(2);
LED_Off(0);
}
}

vTask2 有几乎相同的代码:
void vTask2( void *pvParameters )
{
const char *pcTaskName = "Task 2 is running\n";
volatile unsigned long ul;

for( ;; )
{
LED_On(3);
LED_Off(2);
for( ul = 0; ul < mainDELAY_LOOP_COUNT; ul++ )
{
}

LED_Off(3);
}
}

当我运行程序时,我看到 LED0 和 LED3 一直亮着(它们的切换对我的眼睛来说太快了,这很好),而“共享资源”LED2 闪烁得非常快。
问题是这样的:当我颠倒 xTaskCreate 的顺序时调用时,我遇到了相同的情况,LED2 的闪烁行为不同,但速度要慢得多。
为什么会发生这种情况,因为任务应该具有相同的优先级并因此遵循循环调度?他们不应该得到相同的时间吗?为什么他们的行为只是在以不同的顺序创建之后发生变化?

提前致谢。

最佳答案

rtos 不会尝试通过任务循环执行,您不应期望它们以任何特定顺序执行。正如 iama 在评论中指出的那样,您创建的任何任务都没有延迟。使用延迟函数,而不是通过在 for 循环中燃烧无操作来创建延迟。这将允许您的 while(1) 循环中的代码执行然后返回给 rtos,以便处理器可以运行其他任务,直到等待时间结束。如果您需要同步工作,您可能只想将其保留在单个任务中。如果您的一项任务依赖于另一项完成的任务,您可能需要使用信号量、队列或其他跨线程通信方法。
您的代码让我想起了我从在 main 中使用 while(1) 循环过渡到 rtos 的时候。如果您刚开始使用 rtos,那么 ST 的这份指南看起来是一个很好的介绍 https://www.st.com/resource/en/user_manual/dm00105262-developing-applications-on-stm32cube-with-rtos-stmicroelectronics.pdf
另外,不要依赖延迟功能进行细粒度计时;改用定时器驱动的中断。上面的链接应该让您更好地理解为什么我可以在这篇文章中进行管理。
ST 也应该在某处有示例项目,可以很好地引用或用作您自己项目的开始。

关于operating-system - 任务在循环调度中表现不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15975425/

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