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.

[参考译文] TMS320F28375D:如何创建定制数据部分?

Guru**** 2417960 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/984841/tms320f28375d-how-to-create-a-custom-data-section

器件型号:TMS320F28375D

您好!

我想创建一个自定义初始化数据段、因此我已将此行添加到命令文件中:

  .cmds         :load = FLASH、load_start (_cmdsStart)、load_end (_cmdsEnd)、page = 0

然后在 C 语言中、我的想法是在该段中声明结构、如下所示:

#define DEFINE_COMMAND(name, execfn, desc) command name __attribute__((section(".cmds"))) = {#name, func, desc}

DEFINE_COMMAND(help, helpCmd, "Help command");

因此、我可以从 cmdsStart 迭代到 cmdsEnd、就像 libc 使用初始化函数执行此操作一样。

但这似乎不起作用。 它创建.cmds 段并保留大小正确的存储器、但.cmds 段中的实际数据未初始化(所有 FS)。

您是否可能会发现这有问题?

谢谢你

Jiri

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

    您好、Jiri、

    您可以使用#pragma DATA_SECTION 定义定制段。 如果使用 EABI 编译器、则默认情况下所有未初始化的全局变量都将为零初始化。 如果是 COFF、它们将保持未初始化状态。

    您使用的是哪种编译器?

    此致、

    Veena

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

    您好、Veena、

    我正在使用 TI 的 C2000编译器(ti-cgt-C2000_20.2.LTS)。

    #pragma DATA_SECTION 的行为似乎与__attribute__(section)相同。

    是否有办法在编译时初始化数据? 还是只有.econst 可以具有初始化的数据?

    谢谢你

    Jiri

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

    您好、Jiri、

    我是说、您使用的是 EABI 编译器还是 COFF 编译器?

    未初始化的变量-> uint32_t a;

    初始化变量-> uint32_t b = 10;

    使用 COFF 编译 器时、a 将保持未初始化状态、b 将由启动例程初始化为10。 对于 EABI 编译器、a 将初始化为0、b 将初始化为10。

    您可以切换到 EABI 编译器或使用链接器初始化段。 请参阅 编译器指南中的"在 COFF ABI 模式下初始化静态和全局变量"一节

    此致、

    Veena

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

    嗯、很抱歉、我只知道我用作编译器的可执行文件是什么。

    您可能需要输出格式吗? 在这种情况下、.obj = COFF。

    是的、这就是我遇到的问题。

    uint16_t b = 10;在内存浏览器中为0xFFFF。

    它仅在我将该变量放入自定义.cmds 段时执行该操作。

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

    哦、好的、我看到您将段放置在闪存区域中。

    在这种情况下、您需要将变量设置为 const。 对于非 const 变量(通常在 RAM 区域中加载)、这些变量在 启动例程中进行初始化。 由于闪存存储器不可写、因此无法更新该值。 对于常量变量(通常加载在闪存中)、初始值作为程序加载的一部分进行加载。 使用闪存插件更新闪存存储器。

    请将变量定义为 const、以防变量被加载到闪存中。

    此致、

    Veena

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

    啊、我看到、是的、这就是问题所在。 非常感谢 Veena!