This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28379D:代码从 RAM 工作、而不是从闪存工作

Guru**** 2582445 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1185714/tms320f28379d-code-works-from-ram-not-from-flash

器件型号:TMS320F28379D

我有一些代码在从 RAM 运行时工作良好、但在尝试从闪存构建时不工作。  我使用 CLA。  根据我在线阅读的内容、链接器命令文件看起来是正确的。  这两个 CLA 任务触发一次、然后再也不会触发。   

代码启动、大致如下:

EALLOW

device_init();

interrupt_initModule();

interrupt_initVectorTable();

setupADCs();

setupGPIO();

setupPWM();

setupCLA();

interrupt_register (INT_CLA1_1、&ISR_cla1_Task1);
interrupt_register (INT_CLA1_2、&ISR_cla1_task2);

ADC_setInterruptSource (ADCC_BASE、ADC_INT_NUMBER1、ADC_SOC_NUMBER1);
ADC_clearInterruptStatus (ADCC_BASE、ADC_INT_NUMBER1);
ADC_enableInterrupt (ADCC_BASE、ADC_INT_NUMBER1);

  calcOffsetsADC();

EDIS;

ADC_enableInterrupt (ADCC_BASE、ADC_INT_NUMBER1)

INTERRUPT_ENABLE (INT_CLA1_1);

ePWM_clearEventTriggerInterruptFlag (EPWM2_base);
INTERRUPT_ENABLE (INT_CLA1_2);
EINT;

while (1);

CLA 任务1由 ADCC 中断1触发

CLA 任务2由 EPWM2触发

CLA 中断 ISR 是

_interrupt void ISR_cla1_Task1 (void)

ADC_clearInterruptStatus (ADCC_BASE、ADC_INT_NUMBER1);

INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group11);
//
//检查是否发生了溢出
//
if (TRUE =ADC_getInterruptOverflowStatus (ADCC_BASE、ADC_INT_NUMBER1))

ADC_clearInterruptOverflowStatus (ADCC_BASE、ADC_INT_NUMBER1);
ADC_clearInterruptStatus (ADCC_BASE、ADC_INT_NUMBER1);

返回;

_interrupt void ISR_cla1_task2 (void)

ePWM_clearEventTriggerInterruptFlag (EPWM2_base);
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group11);
返回;

我看到两个 CLA 任务都运行一次。  我对接下来要了解的内容有点不了解。  有什么建议吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请共享链接器 cmd 文件。

    请注意、CLA 程序和 const 需要被载入到闪存并在运行时被复制到 LSRAM 中。

    此致、

    Veena

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我正在这样做:

    void setupCLA()
    {
    #ifdef _FLASH
        //
        // Copy CLA code from its load address (FLASH) to CLA program RAM
        //
        // Note: during debug the load and run addresses can be
        // the same as Code Composer Studio can load the CLA program
        // RAM directly.
        //
        // The ClafuncsLoadStart, ClafuncsLoadEnd, and ClafuncsRunStart
        // symbols are created by the linker.
        //
        memcpy((uint32_t *)&Cla1funcsRunStart, (uint32_t *)&Cla1funcsLoadStart,
                (uint32_t)&Cla1funcsLoadSize);
    
        memcpy((uint32_t *)&Cla1ConstRunStart, (uint32_t *)&Cla1ConstLoadStart,
                (uint32_t)&Cla1ConstLoadSize);
    #endif

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    已上传链接器文件:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    供参考...我最终手动验证/修改了段分配、而不是主要重复使用从 TI 示例项目复制的现有链接器 cmd 文件、看起来效果更好。  不确定哪个部件是实际问题并进行修复。