同步与互斥通信

16 阅读1分钟

同步与互斥通信

有缺陷的同步

static struct TaskPrintInfo g_Task1Info = {0, 0, "Task1"};
static struct TaskPrintInfo g_Task2Info = {0, 3, "Time"};
static struct TaskPrintInfo g_Task3Info = {0, 6, "Task3"};
static int g_LCDCanUse = 1;
static uint32_t g_sum=0;
static volatile uint32_t g_calcend=0;
static uint32_t g_time=0;

void calcTask(void *params)
{
	uint32_t i=0;
	g_time=system_get_ns();
	for(i=0;i<=10000000;i++)
	{
		g_sum+=i;
	}
	g_calcend=1;
	g_time=system_get_ns()-g_time;
	vTaskDelete(NULL);
}

void LcdPrintTask(void *params)
{
	struct TaskPrintInfo *pInfo = params;
	uint32_t cnt = 0;
	int len;

	while(g_calcend==0);
	while (1)
	{
		/* ´òÓ¡ÐÅÏ¢ */
		if (g_LCDCanUse)
		{
			g_LCDCanUse = 0;
			len = LCD_PrintString(pInfo->x, pInfo->y, pInfo->name);
			len += LCD_PrintString(len, pInfo->y, ":");
			LCD_PrintSignedVal(len, pInfo->y, g_time);
			g_LCDCanUse = 1;
		}
		vTaskDelay(500);
	}
}

static volatile uint32_t g_calcend=0;用一个volatile的全局变量控制第一个好了再跑第二个任务

1.不用volatileCPU一直读寄存器不读内存,程序跑不了。

2.第2个程序会死等。

优化方法:第二个程序while之前加一个vTaskDelay(2000);,让资源先给task1。

互斥的缺陷

image

108这一步可能会导致互斥的失效

A进入了LCD但是gLCDCanUse没有清0,B进入还能用LCD

image

image

通过关中断来防止互斥的失效,但是和同步缺陷一样浪费CPU