uC/OS任務(ISR)之間的行爲同步

1.行爲同步的概念

一個任務的運行過程中需要其他任務的配合,才能得到預定的效果,任務之間的這種動作稱爲“行爲同步”。

2.具體情況

2.1 任務之間的單向同步

可以通過信號量實現,
在這裏插入圖片描述
示意代碼如下:

OS_EVENT *Sem1,*Sem2;  //創建信號量
INT8U err;      //定義返回信息的變量

void  task1(void * pdata)
{
INT8U err;
pdata=pdata;
while(1)
	{
	OSSemPend(Sem2,0,&err);//等待信號量2
	........
	OStimeDly(10);
	}
}

void  task2(void * pdata)
{
INT8U err;
pdata=pdata;
while(1)
	{
	OSSemPend(Sem1,0,&err);//等待信號量1
	........
	OStimeDly(10);
	}
}


void  task3(void * pdata)
{
INT8U err;
pdata=pdata;
while(1)
	{
	OSSemPost(Sem1,0,&err);//發送信號量1
	OSSemPost(Sem2,0,&err);//發送信號量2

	........
	
	}
}

2.2任務與任務之間的雙向同步

在這裏插入圖片描述
示例代碼:

OS_EVENT *SeMbox;//定義發送消息郵箱指針
OS_EVENT *AckMbox;//定義應答消息郵箱指針

void  task1(void * pdata)//task1 爲按鍵任務,用戶觸發
{
INT8U err;
pdata=pdata;
while(1)
	{
	........//任務代碼
	OSMboxPost(SeMbox,(void *)1);//發送消息
	........//任務代碼
	OSMboxPend(AckMbox,0&err);//等待消息
	
	OStimeDly(10);
	}
}

void  task2(void * pdata)
{
INT8U err;
pdata=pdata;
while(1)
	{
	OSMboxPend(SeMbox,0&err);//等待消息
	........//任務代碼
	OSMboxPost(AckMbox,(void *)1);//發送消息
	
	........//任務代碼
	OStimeDly(10);
	}
}

2.3多個任務相互同步

在這裏插入圖片描述
這種情況使用事件標誌組結合用於計數的全局變量實現,防止中斷造成行爲同步的失效:
示意代碼如下:

INT8U cnt;

void  taskA(void * pdata)//task1 爲按鍵任務,用戶觸發
{
INT8U err;
pdata=pdata;
while(1)
	{
	OSFlagPost(FLAGW,//發送簽到任務
				0x01,//bit0 置位
				OS_FLAG_SET,//1有效
				&err);
	OSFlagPend(FLAGW,
				0x07,//等待最低三位
				OS_FLAG_WAIT_SET_ALL,//全爲1
				0&err
			)
	........//同步點之後的任務代碼
	OStimeDly(10);
	}
}

void  taskB(void * pdata)//task1 爲按鍵任務,用戶觸發
{
INT8U err;
pdata=pdata;
while(1)
	{
	OSFlagPost(FLAGW,//發送簽到任務
				0x02,//bit1 置位
				OS_FLAG_SET,//1有效
				&err);
	OSFlagPend(FLAGW,
				0x07,//等待最低三位
				OS_FLAG_WAIT_SET_ALL,//全爲1
				0&err
			)
	........//同步點之後的任務代碼
	OStimeDly(10);
	}
}

void  taskA(void * pdata)//task1 爲按鍵任務,用戶觸發
{
INT8U err;
pdata=pdata;
while(1)
	{
	OSFlagPost(FLAGW,//發送簽到任務
				0x04,//bit2 置位
				OS_FLAG_SET,//1有效
				&err);
	OSFlagPend(FLAGW,
				0x07,//等待最低三位
				OS_FLAG_WAIT_SET_ALL,//全爲1
				0&err
			)
	........//同步點之後的任務代碼
	OStimeDly(10);
	}
}

參考文獻
[1] 周慈航. 《基於嵌入式實時操作系統的程序設計技術》[M].北京航空航天大學出版社,2011.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章