1. 程式人生 > 其它 >英飛凌TC264之雙核互斥

英飛凌TC264之雙核互斥

技術標籤:智慧車

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,這樣就是先搶鑰匙,搶到鑰匙在進行相應的程式,就不會存在資源競爭的問題。