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.