Hi All:
I use TMDSEVM6678L, My CCS version is 5.2.1.00018.
I want to use UART to print different strings from each core to PC.
When in debug mode, The result as I expected like this:
but when i burn the image to SPI nor flash, It print like this:
I think I used the semaphore in a wrong way,please help,this is my source code:
#define UART_SEMAPHORE 1
extern void MulticoreBoot();
extern UART_Config gUARTCfg;
void main(void) {
char *corestr = NULL;
corestr = malloc(40*sizeof(char));
unsigned short int usCoreNum = DNUM;
int uartNum = 0;
int i = 100000000;
/*设备的通用初始化配置*/
KeyStone_common_CPU_init();
KeyStone_common_device_init();
KeyStone_main_PLL_init(10, 1);
/*初始化串口相关配置,配置波特率,数据位,停止位,校验位等*/
KeyStone_UART_calc();
KeyStone_UART_init(&gUARTCfg, uartNum);
UART_EDMA_init();
/*用来自启动,Core0给其他Core写启动地址*/
MulticoreBoot();
/*等待设备初始化完成,需要一个延时,否则串口输出不正确*/
while(i--)
{
asm(" NOP 5 ");
}
CSL_UartRegs * localUartRegs = (CSL_UartRegs *)((Uint32)UART_Regs + uartNum * 0x1000);
if(CORE0 == usCoreNum)
{
while(1)
{
if(CSL_semIsFree(UART_SEMAPHORE)) /*判断信号量是否处于空闲*/
{
CSL_semAcquireDirect(UART_SEMAPHORE); /*申请信号量,否则串口输出乱序*/
sprintf(corestr,"Hi,All,I am core %d,Nice to meet U!\n",CORE0);
Keystone_uartWrite_String(uartNum,corestr); /*串口输出启动信息*/
memset(corestr,0,strlen(corestr)); /*将字符串清空*/
while(((localUartRegs->LSR) & CSL_UART_LSR_TEMT_MASK)); //等待传输完成
CSL_semReleaseSemaphore(UART_SEMAPHORE); /*释放信号量*/
break;
}
else
{
//Keystone_uartWrite_String(uartNum,"!");
asm(" NOP 9 ");
}
}
}
else if(usCoreNum <= CORE7)
{
while(1)
{
if(CSL_semIsFree(UART_SEMAPHORE))
{
CSL_semAcquireDirect(UART_SEMAPHORE);
sprintf(corestr,"Hi,All,I am core %d,Nice to meet U!\n",usCoreNum);
Keystone_uartWrite_String(uartNum,corestr); /*write to PC through UART*/
while(((localUartRegs->LSR) & CSL_UART_LSR_TEMT_MASK)); //waiting for transmit complete
memset(corestr,0,strlen(corestr));
CSL_semReleaseSemaphore(UART_SEMAPHORE);
break;
}
else
{
asm(" NOP 9 ");
}
}
}
else
{
printf("Master is Error!\n");
}
free(corestr);
}
Thannk you
BR
Yewkui Wang

