Operating system 循环调度中的任务行为不正确
我在STM32F4DISCOVERY板上运行FreeRTOS,我有以下代码:Operating system 循环调度中的任务行为不正确,operating-system,scheduling,round-robin,freertos,stm32f4discovery,Operating System,Scheduling,Round Robin,Freertos,Stm32f4discovery,我在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;
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);
}
}
void vTask1(void*pvParameters)
{
易失性无符号长ul;
对于(;;)
{
发光二极管(0);
用于(ul=0;ul
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);
}
}
void vTask2(void*pvParameters)
{
const char*pcTaskName=“任务2正在运行\n”;
易失性无符号长ul;
对于(;;)
{
发光二极管(3);
LED关闭(2);
用于(ul=0;ul
当我运行程序时,我看到LED0和LED3始终处于打开状态(它们的切换对我的眼睛来说太快了,这很好),LED2,即“共享资源”,闪烁得非常快。
问题是:当我颠倒xTaskCreate
调用的顺序时,我得到了相同的情况,LED2的闪烁行为不同,速度要慢得多。
为什么会发生这种情况,因为任务应该具有同等的优先级,因此遵循循环计划?他们不应该得到同样的时间吗?为什么他们的行为在仅仅按照不同的顺序创建之后会发生变化
提前谢谢。我认为逻辑显然是正确的。aoubt如何使用FreeRTOS提供的延迟方法而不是void循环?也许编译器已经做了一些优化背景。起初我也在想同样的事情,但是编译器不会根据调用任务创建函数的顺序来改变。它闪烁的速度真的慢了吗,或者只是有一个不同的“开”时间?即使任务具有相同的优先级,并且是按循环调度的,这并不意味着从
LED\u打开(2)
到LED\u关闭(2)
的时间与从LED\u关闭(2)
到LED\u打开(2)
的时间相同,我认为您的LED诊断不足以确定这一点。在示波器上看到LED的开关波形会发光;或者我为每个LED转换创建一个缓冲区并记录时间戳。在如何压缩日志方面,这可能也是一个很好的练习。