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.

[参考译文] CCS/TMS570LC4357:从复位矢量分支到_c_int00不起作用

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/962007/ccs-tms570lc4357-branch-to-_c_int00-from-reset-vector-is-not-working

器件型号:TMS570LC4357

工具/软件:Code Composer Studio

我在复位矢量0x0000000中观察到了分支指令"B _c_int00"预设的奇怪情况。  这个指令成功执行和到_c_int00函数的控制传输似乎取决于闪存中_c_int00函数的位置。   在下面的“不起作用”情况下,不执行指令“B _c_int00”,PC 正在递增到下一条指令,即复位矢量中的“B 未定义条目”。   CPSR.Mode = 1011、监控器、在"不工作"情况下。 无法得出为什么在闪存中的_c_int00函数位置是根据下面的“不起作用”情况执行“B _c_int00”指令。   

闪存中的_c_int00地址

 复位矢量0x00000000处的"b_c_int00"指令

0x0026F4DC

工作

0x0026F504

工作

0x0026F57C

工作

0x0026F66C

工作

0x0026F76C

工作

0x0026F7fC

工作

0x0026F800

工作

0x0026F808

不工作

0x0026F80C

不工作

0x0026F810

不工作

0x0026F824

不工作

0x0026F86C

不工作

0x0026F9E8

不工作

0x0026FAE8

不工作

0x0026FBE8

不工作

0x0026FC00

不工作

0x0026FC08

工作

0x0026FCE8

工作

0x0026FDE8

工作

0x0026FEE8.

工作

我想知道这里的问题是什么? 这是 CCS 问题吗? 或器件问题? 或者我是否遗漏了任何内容?

CCS 版本: 9.3.0.00012

编译器版本:TI v18.12.4.LTS

此致、

Vishwas HC

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

    您好、Vishwas、

    对于 Hercules 微控制器、异常矢量表地址的位置为0x00000000。 c_int00的起始地址需要进行64位对齐。 您是否检查存储器以确保_c_int00被编程到异常矢量表中定义的地址?

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

    您好、Wang、

    是的、我确实确保了闪存中_c_int00的地址与原始帖子中的表一致。

    我在映射文件中进行了验证、并在"B _c_int00"处设置了断点并对分支指令操作码进行了解码。 我已验证内存浏览器中内存位置的内容、以确保闪存中的_c_int00位置符合上表。 正如我在最初的 POST 分支中解释的那样、从复位矢量到_c_int00的情况在"不起作用"情况下不会发生。 闪存地址正确、并且与任何其他段没有重叠。

    此致、

    Vishwas HC

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

    我会尝试一下、然后回来

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

    您好、Vishwas、

    您能告诉我如何将_c_int00()编程到您的帖子中指定的位置吗? 它是否与32字节边界对齐?

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

    您好、Wang、

    我在链接器 cmd 文件中为我的应用程序分配 ROM 起始地址为0x00201504。 我定义了全局常量变量以将_c_int00()放入闪存中的特定位置。

    最初、当我定义一些全局常量时、我观察到上述帖子中针对"不起作用"案例所述的行为。 然后、我删除了一些全局常量并添加了更多全局常量、以便根据 "工作"情况在闪存中获取_c_int00 ()位置。

    此致、

    Vishwas HC   

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

    您好,Vishwas,

    很抱歉我没有得到你的意见。 我测试了一个您的不工作位置(0x26F808)、但它可以正常工作。

    我在链接器 CMD 文件中使用"CINT00:{hl_sys_startup.obj (.text)}> 0x0026F808"将 c_int00放置在0x26F808中(请参阅下面屏幕截图中的我的 cmd 文件):

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

    其他不工作的位置也是如此:0x0026F9E8

    代码运行到_c_int00()中的断点而不会出现任何问题。  

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

    您好、Wang、

    谢谢。 我将检查此内容并返回给您。

    此致、

    Vishwas HC

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

    您好,Vishwas,

    好的、让我知道您的测试结果。

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

    您好、Wang、

    在我的链接器 cmd 文件中、缺少闪存地址的 align (32)。 我认为,这就是我所观察到的问题的原因。 感谢您的回答。 为闪存添加 align (32)后、问题消失。  

    根据文档、ALIGN (32)指令在32字节边界对齐段程序计数器(SPC)。 但是 、0x0026F504、 0x0026F57C、0x0026F808等函数的起始地址不是32字节对齐的。 在链接器 cmd 文件中使用 align (32)时、我确实会在映射文件中看到许多函数的起始地址、这些函数不是32字节对齐的。

    我不明白为什么在链接器 cmd 文件中添加 align (32)可以解决这个问题。 在链接器 cmd 文件中使用 align (32)时、链接器是否会在闪存中分配32字节对齐的函数? 在链接器 cmd 文件中 align (32)的用途是什么?  

    此致、

    Vishwas HC