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:STC 自检重启问题

Guru**** 2399305 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1324803/tms570lc4357-stc-self-test-restart-issue

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

您好!

我正在执行代码以基于 SafeTI 库运行 STC 模块自检(基于的意味着在技术上与此相同:)。

在遇到使 WFI 指令复位 MCU 的问题后、该其他 线程 通过在程序开始时清除 A 位来解决问题。

现在的问题是在 CPU 重新启动后,程序从入口点开始执行,该入口点的第一条指令会触发数据中止异常。

这里我主要关心两个方面:

  •  为什么指令在复位后触发数据中止(由 STC 自检引起)、而不是在第一次执行时触发它?
  • 我能够强制 PC (通过在调试会话中手动编辑它)执行下一条指令、然后程序正常执行。

入口点显示在下一个快照中、可以在具有断点的反汇编中看到相关指令(入指令)。

非常感谢任何帮助。

提前感谢。

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

    Guillermo、您好!

    您能否与您讨论的问题分享您的项目、或者至少分享一个简单的项目?

    这对我最后调试该问题很有帮助。

    您也可以对项目执行私人消息。

    --
    谢谢。此致、
    Jagadish。

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

    非常感谢 Jagadish。

    我请 PM 为您提供一个显示该问题的简化项目。

    此致。

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

    您好!

    我想知道这个问题是否有任何更新。

    此致、谢谢。

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

    您好!  

    再研究一下这个问题、我想我已经发现了原因。

    下一张图显示 正常上电期间的入口点和对应项汇编说明。

    下面显示了一些寄存器(用于观察堆栈指针)。

    在执行 STC 自检引起的复位后、堆栈指针显示:

    因此我猜是由于入栈指令无法在该 SP 地址中保存上下文而导致数据中止。 由于该地址不属于 RAM 存储器(根据 TRM、它属于保留区域)、因此合理。

    堆栈指针在该指令之后很快就会初始化、但代码显然永远不会到达它。

    我曾尝试将 inline 属性添加到核心 init 函数(void _coreInitStackPointer_(void)__attribute__(naked、always_inline));)以避免在执行上下文之前必须保存上下文。  

    但似乎存在某种冲突、因为编译器说( )虽然我无法在任何位置找到 noinline 属性(既不在项目属性中、也不在代码本身中)。

    任何想法或帮助都将非常感谢。

    此致。

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

    Guillermo、您好!

    很高兴听到您找到了根本原因。

    关于直插式、您可以尝试以下方式:

    --
    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    最初、在 Halcogen 生成的代码中、我的意思是这些函数具有属性"naked"、这似乎会在添加内联指令时导致编译器警告(如果尝试添加"always_inline"属性、则会出现相同的问题)。

    抑制"naked"属性会导致"已声明但未定义"警告。

    如果忽略此警告、程序行为仍然是相同的、并且开头的汇编代码仍然有 PUSH 指令 (在前一篇文章中显示)、这是一个引发数据中止的指令、也是我试图摆脱的指令。

    我还尝试在入口点添加 asm 指令、以"手动"修正 SP 的值。 但是、上述入栈指令仍然是编译器首先放置的、因此在 STC 导致复位后仍会导致数据中止。  

    注意:软件复位或任何其他复位工作正常。 问题似乎只来自于引起 SP 寄存器异常值的 STC 复位。

    任何解决这个问题的想法都很感谢:)。

    此致。

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

    Guillermo、您好!

    我在裸机上为 STC 创建了一个示例工程、您能否验证它是否有用?

    请参阅以下主题中的最新评论:

    (+) TMS570LC4357:WFI 指令未启动 LBIST 或互连自检-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    --
    谢谢。此致、
    Jagadish。