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.

[参考译文] TMS320F2800132:链接器 cmd 文件中的 HAL_clearDataRAM 或 LOAD_START 问题

Guru**** 2484615 points
Other Parts Discussed in Thread: LAUNCHXL-F2800137

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1440318/tms320f2800132-issue-with-hal_cleardataram-or-load_start-in-linker-cmd-file

器件型号:TMS320F2800132
Thread 中讨论的其他器件:LAUNCHXL-F2800137

工具与软件:

您好!

我的代码有问题。

基于 universal_motor_control_lab 的代码。

在代码开头的 main 中、一些数据 RAM 被清除、例如:

    HAL_clearDataRAM((void *)loadStart_est_data, (uint16_t)loadSize_est_data);

loadStart_est_data 和 loadSize_est_data 由链接器通过 cmd 文件定义:

    est_data             : >  RAMLS0F,
                              LOAD_START(loadStart_est_data),
                              LOAD_END(loadEnd_est_data),
                              LOAD_SIZE(loadSize_est_data)

在 hal.h 中、声明如下:

extern uint32_t loadStart_est_data;
extern uint32_t loadEnd_est_data;
extern uint32_t loadSize_est_data;

我尝试将其复制到另一个 RAM 位置、但它不起作用、下面清除了一个不是预期数据段(它从地址0x00000000中清除、因此它清除了引导 ROM 代码写入的一些有用信息)。

问题来自:

HAL_clearDataRAM((void *)loadStart_sta_data, (uint16_t)loadSize_sta_data);

loadStart_sta_data 和 loadSize_sta_data 在 hal.h 中声明相同

在命令文件中,它有点不同:

	.sectionRAM_DATA_safety : {sta_tests.obj(.data),
						stl_sp.obj(.data),
						ref_crc.obj(.data),
						sta_tests.obj(.bss),
						sta_user.obj(.bss),
						//sta_util.obj(.data,.bss),
						sta_motor_application.obj(.data,.bss)} > BASE_RAMLS0D_SAFETY_DATA,
                      LOAD_START(loadStart_sta_data),
                      LOAD_END(loadEnd_sta_data),
                      LOAD_SIZE(loadSize_sta_data)

通过使用调试器、我可以看到  loadStart_sta_data 和 loadSize_sta_data 的值是正确的(使用断点、当光标位于数据名称上方时) 、但一旦代码在 HAL_clearDataRAM 中执行((void *) loadStart_sta_data、(uint16_t) loadSize_sta_data);  

void HAL_clearDataRAM(void *pMemory, uint16_t lengthMemory)
{
    uint16_t *pMemoryStart;
    uint16_t loopCount, loopLength;

    pMemoryStart = pMemory;
    loopLength = lengthMemory;

    for(loopCount = 0; loopCount < loopLength; loopCount++)
    {
        *(pMemoryStart + loopCount) = 0x0000;
    }
}   //end of HAL_clearDataRAM() function

启动地址切换为零、这会导致问题。

我找不到该问题、我可以寻求帮助吗?

此致。

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

    大家好、我已经对现有的 HAL_clearDataRAM 函数调用进行了一些测试、对于我来说、这是同样的问题、无法按预期工作。

    我还回到最初的  universal_motor_control_lab 和 LAUNCHXL-F2800137、 看起来是相同的。

    我可以使用以下命令使其正常运行:

        uint32_t Start;
        uint16_t Size;
        Start=_symval(&loadStart_sta_data);
        Size = _symval(&loadSize_sta_data);
    
        HAL_clearDataRAM((void *)Start, (uint16_t)Size);

    您能否确认 universal_motor_control_lab 中存在问题、解决这个问题的最佳方法是什么?

    此致。

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

    同样取得了一些进展、

    我最后将对 HAL_clearDataRAM 的所有调用更改为如下:

    //HAL_clearDataRAM((void *)loadStart_est_data, (uint16_t)loadSize_est_data);    //original code
    HAL_clearDataRAM((void *)&loadStart_est_data, _symval(&loadSize_est_data));     //modified

    我阅读了以下内容:

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1060635/tms320f28379d-what-is-the-data-type-of-the-load_start-parameter

    说实话、我对自己的改进不是很自信、也正因为如此、我希望获得 TI 专家的批准。

    此致。

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

    尊敬的 Manu:

    您是否可以尝试删除卷括号中定义的内容并 保留 下面的定义?

    .section RAM_DATA_SAFETY:>BASE_RAMLS0D_SAFETY_DATA
    load_start (loadStart_sta_data)、
    load_end (loadEnd_sta_data)、
    load_size (loadSize_sta_data)

    谢谢!

    嘉兴市

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

    尊敬的嘉兴:

    感谢您的回答。

    正如我尝试在第二篇文章中解释的那样、问题与我添加的代码无关。 对于示例、原始代码也存在同样的问题:

    HAL_clearDataRAM((void *)loadStart_est_data, (uint16_t)loadSize_est_data); 

        est_data             : >  RAMLS0F,
                                  LOAD_START(loadStart_est_data),
                                  LOAD_END(loadEnd_est_data),
                                  LOAD_SIZE(loadSize_est_data)

    这与您的建议类似、也失败了。

    从 universal_motor_control_lab 中的其他函数以及链接器/编译器的一些文档中、"&"似乎是必需的、例如请参阅:

        memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);

    另请参阅:

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1060635/tms320f28379d-what-is-the-data-type-of-the-load_start-parameter

    此致。