Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Operating system 循环调度中的任务行为不正确_Operating System_Scheduling_Round Robin_Freertos_Stm32f4discovery - Fatal编程技术网

Operating system 循环调度中的任务行为不正确

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;

我在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);
    }
}
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转换创建一个缓冲区并记录时间戳。在如何压缩日志方面,这可能也是一个很好的练习。