目前希望完成功能如下,C6678有8个核,希望能够通过核0来控制其他核加载指定的程序执行。核0通过网络接收上位机发送的参数数据以及程序镜像,然后对核1或者其他核设置局部复位,根据参数(即c_int00地址)写BOOT_MAGIC,发送ipc中断。问题如下:
当将程序bin放在LS2RAM时,可以正常启动,多次控制同一个核以及不同的核都可以成功。但是当将bin放在DDR3时,第一次发送了参数以及镜像bin后,无法启动,第二次发送相同的bin和参数又可以启动。每次新的镜像都会出现这个问题。
部分代码如下
memset(pBuf, 0, 13);
bytes = (int)recv(connfd, (void *)pBuf, 9, 0); //接收bin程序入口_c_int00地址
if(bytes != 8) {
uart_printf("File Head Error 1!bytes: %d!\n", bytes);
goto leave;
}
Entry_Address = strtohex(pBuf, 8);
memset(pBuf, 0, 13);
bytes = (int)recv(connfd, (void *)pBuf, 9, 0); //接收存放bin文件起始地址
if(bytes != 8) {
uart_printf("File Head Error 2!bytes: %d!\n", bytes);
goto leave;
}
WriteAddr = (unsigned int*)strtohex(pBuf, 8);
memset(pBuf, 0, 13);
bytes = (int)recv(connfd, (void *)pBuf, 2, 0); //ignore standard header
if(bytes != 1) {
uart_printf("File Head Error 3!bytes: %d! %s\n", bytes, pBuf);
goto leave;
}
corenum = pBuf[0] - 0x30; //接收需要替换代码的核号
uart_printf("%x %x %d\n", Entry_Address, (unsigned int)WriteAddr, corenum);
while (1) {//循环接收bin文件
memset(pBuf, 0, 13);
bytes = recv(connfd, pBuf, 4, 0);
if (bytes <= 0) {
break;
}
*WriteAddr = littleToBig(pBuf);
WriteAddr++;
}
Load_Core_app_Start(Entry_Address, corenum);
....
....
....
void Load_Core_app_Start(unsigned int EntryAddr, int corenum)
{
unsigned int MAGIC_ADDR = 0X1087FFFC + corenum * 0x1000000;
CSL_BootCfgUnlockKicker();
CSL_PSC_setModuleLocalReset(corenum + 15, PSC_MDLRST_ASSERTED);
CSL_PSC_setModuleLocalReset(corenum + 15, PSC_MDLRST_DEASSERTED);
cpu_delaycycles(100000);
*((volatile unsigned int *)MAGIC_ADDR) = EntryAddr;
cpu_delaycycles(100000);
CSL_IPC_genGEMInterrupt (corenum, 0);
CSL_BootCfgLockKicker();
}
|
@tyw :感谢您的回复,但是其中内容坑你不是我想要的,谢谢!
去油香收