此代码用于在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);
}
}
}
答案 0 :(得分:0)
检查 configMAX_PRIORITIES 是否高于或等于8(您的最高优先级)。 Task Priorities
对于您的情况,Mutex似乎更合适Mutex
您还应该在信号量锁中包含LCD_Clear()。
你的问题可能与你创建一个最大值为1且起始值为1的计数信号量有关,所以它已经被“取走”了。
Semaphore1=xSemaphoreCreateCounting(1,1);
我的猜测,当你的任务1执行时,它无法获取信号量,因此等待50个滴答,其中任务2将执行,但也应该无法获取信号量,因为它永远不会“给定”因为它从开始就被锁定了。
尝试使用Semaphore1=xSemaphoreCreateCounting(1,0);
初始化,或者更好,使用互斥锁。