英飞凌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,这样就是先抢钥匙,抢到钥匙在进行相应的程序,就不会存在资源竞争的问题。
更多推荐
英飞凌TC264之双核互斥
发布评论