英飞凌TC264之双核互斥

TC264是双核单片机,在用两个和运行同一资源时会出现竞争的问题,例如CPU0,CPU1在同时调用一个串口时会出现竞争,导致从串口输出值出现乱码,我们可以通过软件来解决这一问题,这就类似于互斥锁。
双方在在开同一扇的同时,谁先拿到钥匙谁就开门,开完门后放回钥匙,等待下一次开门,这样双方就不会出现资源竞争了。
TC264底层也给出了解决方案:
英飞凌TC264之双核互斥_第1张图片

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,这样就是先抢钥匙,抢到钥匙在进行相应的程序,就不会存在资源竞争的问题。

你可能感兴趣的:(智能车)