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.

[参考译文] TMS570LC4357:_memInit_销毁了变量寄存器内容

Guru**** 2609285 points
Other Parts Discussed in Thread: HALCOGEN, TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/756588/tms570lc4357-_meminit_-destroys-variable-register-content

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

您好!

 我在 HalCoGen 生成的 hL_sys_startup.c 中的启动代码有问题。

程序运行在 esmGroup3Notification 内的 while (1)循环中、尽管实际上没有组3错误。

 

该问题可按如下方式重现:

-         为不带 FreeRTOS 的 TMS570LC4357创建一个新的 HalCoGen 项目并生成代码

-         使用 HalCoGen 源代码创建一个新的 CSS 项目

-         将优化从“关闭”设置为“0”(寄存器优化)

-         在用户代码(22)中添加对 ESM 组3状态寄存器的额外访问(请见附件)

-         将此项目加载到 HDK 中,然后程序运行到 esmGroup3Notification 中

 

在调试时、我发现当代码进入开关情况时、ESM 组3寄存器(esmREG->SR1[2])的寄存器地址被加载到 R4。

汇编器函数_memInit_使用此寄存器而不恢复其内容。 然而、当代码随后测试 ESM 组3寄存器的内容时、R4指向一个不同的内存位置并且假定一个错误、尽管没有组3错误。

根据 ARM 过程调用标准,“子例程必须保留寄存器 R4-R8、R10、r11和 SP 的内容”。 这对于_memInit_函数不是正确的。

作为一种权变措施、我更改了_memInit_、使其使用不需要保留的参数寄存器 R1-R3。

 

是否有计划使_memInit_符合过程调用标准?

 

此致、

Katharina Gilles

 

e2e.ti.com/.../3276.HL_5F00_sys_5F00_startup.c

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

    meminit 函数在复位后首先执行。 这是防止内存访问中出现 ECC 错误所必需的。 随后是所有 CPU 寄存器的初始化。 这是防止内核比较误差所必需的。 这些函数不遵循 EABI 标准、因为根据 ARM CPU 规范、CPU 寄存器在加电后处于"未定义"状态。

    另请注意、不能优化 startup.c 文件中的函数。 有几个函数的执行可能会受到任何级别的优化的影响。

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

    您好、Sunil、

     

    TMS570LC4357的最新 HalCoGen 版本04.07.00在启动后不会立即生成_memInit_、但首先执行寄存器初始化并获取复位源、然后根据实际的复位源调用_memInit_(请参阅我的第一个帖子中附加的文件)。 此时、CPU 寄存器不再未定义。

    我将从优化中排除 HL_sys_startup.c。

    在哪里可以找到不能优化此文件的文档?

    是否有任何其他文件必须从优化中排除?

     

    此致、Katharina

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

    我有一个早期版本的启动文件。 在检查复位源之前、HALCoGen 的更新版本确实会生成用于寄存器初始化的代码。 我同意、通过使它们符合被调用方函数的 ARM EABI 标准、可以改进汇编语言编码的所有例程。 我将把它添加到我们的积压工作中、以实现 HALCoGen 增强功能。

    在安全初始化序列期间有几个例程使用"虚拟"变量来读取状态标志。 如果要优化这些代码、代码执行将不会达到预期。 在我看来,在进入 main()应用程序之前执行的所有代码都不能被优化。 我将检查是否有任何涉及此内容的文档。

    此致、
    Sunil