同步与互斥通信
有缺陷的同步
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。
互斥的缺陷

108这一步可能会导致互斥的失效
A进入了LCD但是gLCDCanUse没有清0,B进入还能用LCD


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