问答

汇集网友智慧,解决技术难题

21ic问答首页 - C6678局部复位,对指定核替换bin并执行的问题

DSP 嵌入式 技术交流 TE AD ar

C6678局部复位,对指定核替换bin并执行的问题

hanyidadada2022-03-18
目前希望完成功能如下,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();
}

回答 +关注 6
794人浏览 0人回答问题 分享 举报
0 个回答

您需要登录后才可以回复 登录 | 注册