英飛凌TC264之雙核互斥
阿新 • • 發佈:2021-02-19
技術標籤:智慧車
TC264是雙核微控制器,在用兩個和運行同一資源時會出現競爭的問題,例如CPU0,CPU1在同時呼叫一個串列埠時會出現競爭,導致從串列埠輸出值出現亂碼,我們可以通過軟體來解決這一問題,這就類似於互斥鎖。
雙方在在開同一扇的同時,誰先拿到鑰匙誰就開門,開完門後放回鑰匙,等待下一次開門,這樣雙方就不會出現資源競爭了。
TC264底層也給出瞭解決方案:
IFX_EXTERN boolean IfxCpu_acquireMutex(IfxCpu_mutexLock *lock);
boolean IfxCpu_acquireMutex(IfxCpu_mutexLock *lock)
{
boolean retVal;
volatile uint32 spinLockVal;
retVal = FALSE;
spinLockVal = 1UL;
spinLockVal =
(uint32)__cmpAndSwap(((unsigned int *)lock), spinLockVal, 0);
/* Check if the SpinLock WAS set before the attempt to acquire spinlock */
if (spinLockVal == 0)
{
retVal = TRUE;
}
return retVal;
}
例程:
CPU0:
extern IfxCpu_mutexLock g_MutexUart;
main()
{
if(IfxCpu_acquireMutex(&g_MutexUart)) //判斷互斥量是否使用
{
UART_PutStr(UART0, "這裡是CPU0 \r\n");
IfxCpu_releaseMutex(&g_MutexUart); //互斥量釋放
}
delayms(5); //這個時間可以讓CPU1來使用互斥量
}
CPU1:
IfxCpu_mutexLock g_MutexUart; //設定互斥訊號
main()
{
if(IfxCpu_acquireMutex(&g_MutexUart)) //判斷互斥量是否使用
{
UART_PutStr(UART0, "這裡是CPU1 \r\n");
IfxCpu_releaseMutex(&g_MutexUart); //互斥量釋放
}
delayms(5); //這個時間可以讓CPU1來使用互斥量
}
按照這個思路我們也可以設定一個全域性變數來充當這個互斥量,令這個全域性變數為1(鑰匙),其中一核拿到1(鑰匙),讓這個全域性變數為0,此時另一核判斷全域性變數為0(沒拿到鑰匙),拿到鑰匙的核中執行完相應的程式後,再令設定的全域性變數為1,這樣就是先搶鑰匙,搶到鑰匙在進行相應的程式,就不會存在資源競爭的問題。