Rtos(当使用信号量或互斥量与lcd时,它首先以低优先级运行任务?)

时间:2017-07-09 06:29:40

标签: embedded rtos lcd

此代码用于在LCD上显示保持信号量,它应该从具有高优先级的任务开始,但它以低优先级的任务开始 如果我删除信号量,它将以高优先级开始。

#include <avr/io.h>
#include <avr/interrupt.h>
#include "lcd.h"
#include "macros.h"
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"

#define F_CPU 16000000
#include <util/delay.h>

/*task function prototype */
void TASK1(void * pvParameters );
void TASK2(void * pvParameters );
//void TASK3(void * pvParameters );



/*create a semaphore handle*/
//xSemaphoreHandle task_sync_sem ;
xSemaphoreHandle Semaphore1;

int main(void)
{
    DDRD=0xff;
    DDRB=0xff;
    /*init LCD*/
    LCD_init();


    //task_sync_sem = xSemaphoreCreateCounting(1,0);
    Semaphore1=xSemaphoreCreateCounting(1,1);
    /*create task */
    xTaskCreate(TASK1,"task1",400,NULL,8,NULL);
    xTaskCreate(TASK2,"task2",400,NULL,6,NULL);
    //xTaskCreate(TASK3,"task3",400,NULL,3,NULL);


    /*Start OS "Scheduler " */

    vTaskStartScheduler();


}

void TASK1(void * pvParameters )
{

    for (;;)
    {
      LCD_Clear();
    u8 vale=xSemaphoreTake(Semaphore1,50);
    if(vale==1)
    {
        LCD_WriteData('A');
        LCD_WriteData('B');
        LCD_WriteData('C');
        xSemaphoreGive(Semaphore1);

    }
            _delay_ms(1000);
            vTaskDelay(2000);

    }

}
void TASK2(void * pvParameters )
{

    for (;;)
    {
          LCD_Clear();


        u8 vale=xSemaphoreTake(Semaphore1,50);

            if(vale==1)
            {
                LCD_WriteData('X');
                LCD_WriteData('Y');
                LCD_WriteData('Z');
                xSemaphoreGive(Semaphore1);
                vTaskDelay(2000);
            }

    }

}

1 个答案:

答案 0 :(得分:0)

  • 检查 configMAX_PRIORITIES 是否高于或等于8(您的最高优先级)。 Task Priorities

  • 对于您的情况,Mutex似乎更合适Mutex

  • 您还应该在信号量锁中包含LCD_Clear()。

行为:

你的问题可能与你创建一个最大值为1且起始值为1的计数信号量有关,所以它已经被“取走”了。

Semaphore1=xSemaphoreCreateCounting(1,1);

我的猜测,当你的任务1执行时,它无法获取信号量,因此等待50个滴答,其中任务2将执行,但也应该无法获取信号量,因为它永远不会“给定”因为它从开始就被锁定了。

尝试使用Semaphore1=xSemaphoreCreateCounting(1,0);初始化,或者更好,使用互斥锁。