TMS320C6678: TMS320C6678 local reset

Part Number: TMS320C6678

Hi:

    我们在TMS320C6678上面开发异常保护功能时,有这样一个需要:core0作为主核,实时监控Core1-Core7是否异常,当Core1-Core7某一个核异常时,Core0对该核执行local reset;

    我们在编写local reset功能代码时,参考了PCIE local reset 处理流程,但是Core0执行Core1的local reset 后,Core1无法跳转到main函数运行,请问local reset 功能配置还有什么需要特别注意的吗?

    期待各位专家的解答,感谢!

  • 您好

    在 TMS320C6678 DSP 上实现多核之间的异常监控和本地复位(local reset)功能时,确实有一些关键的步骤和注意事项需要遵循。以下是你在实现这个功能时可能需要考虑的一些关键点:

    1. 确保正确的复位序列:本地复位(local reset)通常涉及一系列寄存器操作,以正确地将核心复位到已知状态。你需要确保按照硬件手册中指定的顺序和条件执行这些操作。错误的复位序列可能导致核心无法正确恢复到运行状态。

    2. 检查中断和异常向量表:确保 Core1 的中断和异常向量表(interrupt and exception vector table)配置正确。本地复位后,核心通常会从特定的复位向量地址开始执行。如果这个地址没有指向有效的代码,或者向量表配置不正确,那么 Core1 可能无法跳转到 main 函数。

    3. 初始化代码和状态:本地复位后,Core1 的所有寄存器和内存都可能被清除或重置。你需要确保 Core0 在复位 Core1 之后,发送适当的初始化命令或数据,以恢复 Core1 的必要状态和配置。

    4. 检查启动代码:启动代码(如 _c_int00)在核心启动时被调用,负责初始化核心的运行环境。确保 Core1 的启动代码能够正确处理本地复位后的环境,并正确设置跳转到 main 函数的路径。

    5. 同步和通信机制:在 Core0 和 Core1 之间实现一种同步和通信机制,以确保 Core0 在适当的时机执行本地复位,并且 Core1 在复位后能够接收到必要的初始化信息。

    6. 监控和调试:使用调试工具(如 Code Composer Studio 的调试器)来监控 Core0 和 Core1 的状态。这可以帮助你识别复位过程中的任何问题,并查看复位后 Core1 的行为。

    7. 参考硬件和软件开发指南:仔细阅读 TMS320C6678 的硬件参考手册和软件开发指南。这些文档通常会提供关于多核操作、本地复位以及异常处理的详细信息和示例代码。

    最后,请注意,本地复位是一种强制性的操作,可能会打断正在执行的任务并导致数据丢失。因此,在设计系统时,应谨慎使用本地复位,并确保在必要时有适当的备份和恢复机制。

  • 你好:

            感谢您的解答,目前我们的local reset功能还是有问题,通过观察PSC->MDSTAT寄存器状态发现core1-core7能正确in local reset 和out local reset,但是无法正确跳转到主函数入口;

          1. 关于local reset复位序列的问题,我们是参考pci local reset例程,操作相关寄存器来实现local reset功能,代码如下:

    void coreLocalReset(uint32_t state)
    {
    uint32_t temp, counter = 0;

    temp = DEVICE_REG32_R(MDCTL17);
    if(state == 0)
    {
    uart_printGeneric("Reset assert");
    temp = ((temp & ~0x1F) | PSC_ENABLE) & (~0x100);
    }
    else
    {
    uart_printGeneric("Reset de-assert");
    temp = (temp & ~0x1F) | PSC_ENABLE | (1 << 8);
    }
    DEVICE_REG32_W(MDCTL17,temp);

    counter = 0;
    while (1)
    {
    temp = DEVICE_REG32_R(PTSTAT);
    if ((temp & (1 << 10)) == 0)//pid
    break;

    Wait_Soft(10000);
    counter ++;
    if (counter > 10)
    {
    uart_printGeneric("coreLocalReset: Previous transition in progress");
    break;
    }
    }

    DEVICE_REG32_W(PTCMD,(1 << 10));

    /* Current transition finished */
    counter = 0;
    while (1)
    {
    temp = DEVICE_REG32_R(PTSTAT);
    if ((temp & (1 << 10)) == 0)//pid
    break;

    Wait_Soft(10000);
    counter ++;
    if (counter > 10)
    {
    uart_printGeneric("coreLocalReset: Previous transition in progress");
    break;
    }
    }

    /* Verifying state change */
    counter = 0;
    while (1)
    {
    temp = DEVICE_REG32_R(MDCTL17);
    if ((temp & 0x1F) == 3)
    break;

    Wait_Soft(10000);
    counter ++;
    if (counter > 10)
    {
    uart_printGenericValueHex("MDCTL17=", temp);
    break;
    }
    }

    }

    2. 关于core0 local reset某一个核的 整体代码执行逻辑:

    step1: 以核2为例,调用coreLocalReset(0)将核2配置为in local reset状态;

    coreLocalReset(0);

    step2: 以核2为例,写MAGIC_ADDR

    DEVICE_REG32_W(MAGIC_ADDR, BOOT_MAGIC_NUMBER);

    step3: 以核2为例,核心启动入口函数映射;

    DEVICE_REG32_W(BOOT_MAGIC_ADDR(2), (uint32_t)&_c_int00);

    step4: 以核2为例,调用coreLocalReset(1)将核2配置为out local reset状态;

    coreLocalReset(1);

    以上是我们整个local reset功能处理逻辑,请问这样处理有什么遗漏吗?当前还是无法正确跳转到main函数入口地址;

    3. 关于TMS320C6678 local reset 功能, 在实现该功能时都需要参考哪些资料文档,能帮忙列一下吗?以及是否有文档详细讲解整个local reset 功能实现流程的?