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.

[参考译文] MSP432P401R:在 C 语言中读取 MSP432内核寄存器

Guru**** 2589275 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/627951/msp432p401r-reading-msp432-core-registers-in-c

器件型号:MSP432P401R
Thread 中讨论的其他器件:SYSBIOS

大家好、

是否有任何方法可以在 C 语言中读取内核 LR 寄存器?

(如果是、请勿打扰阅读!  如果没有、下面提供了更多详细信息、以说明我为什么需要读取 LR 寄存器。  也许如果无法直接读取、那么也许我可以重新调整我的方法、这样我就不需要读取 LR 寄存器)

我正在使用 TIRTOS/SYSBIOS 异常处理程序。  

我决定使用标准异常处理程序、因为它们提供了一些有用的异常状态预处理、并向控制台提供输出、帮助我确定我的自定义异常处理是否正常工作。

我的配置如下

  • m3Hwi.exhandlerFunc 未定义、因此将使用其中一个默认处理程序、
  • m3Hwi.enableException = true 如果在开发过程中开发以获得完整的异常解码,则一旦事情解决,将切换到 false
  • m3Hwi.exeHookFunc ="&myExceptionHook"为我提供了一个可执行一些自定义异常处理的函数。  

我的自定义执行处理程序(myExceptionHook)将异常上下文(加上一些额外的系统状态)转储到外部闪存(bitbashed)、以便稍后可以读出该异常来尝试和诊断异常。

这里的问题是 myExceptionHook 传递一个异常上下文、该异常上下文包含异常之前 LR 寄存器的状态、但不包含异常之后 LR 寄存器的状态。  异常之后的值提供了一些有关发生异常的上下文的信息、并由标准异常处理程序对其进行解码。  当我从闪存读取异常上下文时、我希望能够执行同样的操作。  

一个潜在的替代方法是停止使用内置的异常处理程序并具有一个完整的自定义处理程序(即 define m3Hwi.exhandlerFunc ="&myExceptionHandler")。  myExceptionHandler 传递了两个参数- 异常堆栈(可以处理为 ExceptionContext 结构)和我假设的是 LR 的当前状态。    我已经尝试过这种方法,但我遇到了尝试复制 Hwi_excillContext()函数的问题。  HWI 模块可以访问我没有访问的数据结构等。  

谢谢

Julian

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

    Julian

     您应该能够使用内联汇编将 LR 寄存器传输到变量。  这不是我们通常建议的、因为如果您执行编译器不期望的操作、这可能会产生意外的后果。 (即单步执行/修改编译器正在使用的寄存器)。   我将向您提供一个示例、以展示如何实现这一目标、 但您可以首先查看此 ARM 软件开发工具链接 、该链接介绍如何将汇编内联与 C 代码一起使用。

    此致、

     Bob

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

    G'Day Bob、

    感谢您的反馈。 您发送的链接中有一条有趣的注释

    '没有为sp(r13)、lr(r14)和pc(r15)寄存器声明变量、并且不能在内联汇编代码中读取或直接修改这些变量。'

    因此、听起来我可能会运气差。  我还搜索了一些内联汇编示例、 并被该线程中的答案所否定。 

    "...今天、TI 没有或计划为 MSP432提供汇编代码。。 "

    无论如何、我已经解决了创建完全自定义异常处理程序时遇到的问题、这就免除了我直接读取 LR 寄存器的需要。

    解决方案是将适当的#include 从 Hwi.c 复制到我的源文件中。  这使我能够访问部分 RTOS、我需要将异常堆栈完全转换为异常上下文。  异常处理程序将传递 LR 寄存器的异常后值、因此我现在可以获得所需的一切。

    谢谢

    Julian

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Julian、
    我很高兴您能找到合适的解决方法。 至于有关 TI 不为 MSP432提供汇编语言的评论、这意味着我们不会以这种形式提供示例。 在绝大多数用户用例中、无需汇编级代码即可实现项目目标(无论是性能目标还是功耗相关目标)。 为了成为最便携和最高效的产品、最好是在 Driverlib 或(首选) TI 驱动程序级别编写代码。

    此致、
    Bob L.