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.

[参考译文] CC1352R:获取 IMPRECISERR 异常、但并非总是如此

Guru**** 2555630 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/910908/cc1352r-getting-impreciserr-exception-but-not-always

器件型号:CC1352R
Thread 中讨论的其他器件:鳄鱼

您好!

我有一个包含一组全局对象的 C++程序。 因此即使在 main 开始之前也会调用它们的构造函数(这是可以的)。 但现在我进入了第一个构造函数,它已经是一个 IMPRECISERR 异常。 当我尝试找到根本原因并逐步启动时、错误不会出现。

我通过在 project.cfg 文件中指定 m3Hwi.exhandlerFunc ="&myExceptionHandler"来使用自己的异常处理程序函数。 在这里、我通过检查 CFSR 寄存器(位)看到发生了一个不精确的错误。

我通过查找更多信息找到的内容、该错误会告诉您"其他问题出错"之类的信息。 我不知道为什么我会得到这个例外! 这样做的原因可能是什么? 当我在第一个构造函数中设置断点、然后单步执行程序时、一切工作都很奇怪。

一般情况下,这看起来像是时序问题,但我只使用处理器内部组件(即使每个软件设计人员都这样说:-)。 这是我们第一次使用 TI ARM 处理器。 因此、我甚至可能会做一些"不应该这样做"。 我不得不说、对于 Code Composer 和 TI 处理器、我看到的是在现代/实际开发环境中我无法预料的项目。 我在 Problems 选项卡中看到(编译器)错误、即使显示编译输出的控制台也不会显示任何问题。 但可以在 Problems 选项卡中删除此错误(否则、在尝试开始调试时会出现警告)。 这不是主要问题、因为这种"错误的编译器错误"也经常出现。 更重要的是、我的程序可以正常工作。

此致
Erwin

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

    一些其他信息:当我启动调试器并让它运行时、我得到了例外(BTW:我不使用 C++异常、只是为了将其清除)非常简单(当我通过 HWREG (xyz)= abc 配置计时器时、其中 xyz 和 abc 都是从编译器包含文件定义的。

    如果我在调试器窗口中执行重新启动操作、则一切都正常。

    更奇怪的是:当我关闭和打开 myhardware 时、什么也不起作用。 我没有在异常处理程序中得到 LED 指示灯、也没有 LED 指示灯指示程序已启动。 断开调试器与硬件的连接、然后执行下电上电也不会显示任何内容。 那么、当我使用调试器运行时和没有调试器运行时有何区别?

    处理器很奇怪、开发环境很奇怪。

    Erwin

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

    Erwin、您好!

    我指派了一名专家发表意见。

    是否可能是系统堆栈溢出(CSTACK)?

    http://software-dl.ti.com/simplelink/esd/simplelink_cc13x2_26x2_sdk/3.30.00.03/exports/docs/dmm/dmm_user_guide/html/tirtos/dmm-memory_management.html#system-stack 

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

    您好、Erik、

    我找到并解决了这个问题。 正如所写的那样,我在第一个构造函数中执行这些操作。 在通过 PRCM 设置执行基本硬件初始化之后、我必须等待一段时间。 我插入了

      for (uint32_t i = 0;i < 0xFF;i++)
           asm (" nop");

    然后再继续。 然后它就可以工作了。

    没有这一点、我就会遇到更奇怪的事情。 我无法再连接调试器、更精确的是、我猜用于调试的 JTAG 连接在 PRCM 初始化后不再工作。 单步执行代码也会导致 Code composer 告诉我无法找到 main()的情况。 在汇编器调试过程中、我看到代码被执行、但编辑器查找了一个名称奇怪的文件、其中包括 main、但也包括其他数字。

    根据堆栈:如果我使用在链接器文件(stack_size)中分配的更多堆栈内存、只要我不覆盖用于其他变量的地址、我就没有问题、对吧? 由于我的功能是第一个构造函数、因此可以在程序的其余部分使用更多的堆栈内存。 完成构造函数后,栈指针再次位于正常/高地址。 或者是否存在问题、请检查我忽略的某个位置(已实现)?

    如果我将问题标记为已解决、我也会很高兴获得堆栈问题的答案。

    Erwin

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

    您好、Erwin、

    您能否共享最初似乎会触发您的问题的 HWREG 代码(如果可能、从对象构建开始到故障的所有代码)。 我怀疑它可能与电源域等有关 您是否已完成所有这些工作?  

    此外、请注意、如果您根据 HWREG 电平自行选择"驱动程序"、然后启动 TI-RTOS、则电源驱动程序将启动、您最终可能会遇到这样的情况:它会打开您个人期望打开的域。 为了减轻这种情况、您需要通知电源驱动程序 POST 初始化您依赖哪些外设以及这些外设是否允许待机(例如、计时器不支持)。

    此外、您是否也可以共享异常转储?

    https://interrupt.memfault.com/blog/cortex-m-fault-debug#how-to-debug-a-hardfault-on-an-arm-cortex-m-mcu

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

    至于堆栈器件、我想如果简单一点的话、您可以这么认为。 只要栈上没有任何内容以从未超出范围的变量的形式存在、就应该如此。  

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

    感谢 TI-RTOS 提示。 我们会考虑它。

    如上所述、由于延迟、代码现在可以工作。 但当我从构造函数中步出时、我会看到

    在 X:/Alligator\CPP\BlueAccess-Beschlag\Release\BlueAccess-Beschlag.out:{3}0x34cc{4}"上没有适用于"__STI__8_MAIN_CPP_ea6eb735 ()的源

    为什么调试器找不到正确的源代码、或者这是什么奇怪的名称?

    如果我在主函数中设置了一个额外的断点、调试器会在那里停止。 但不能在 main 上方的构造函数中设置断点。

    以说明我的 main.cpp 外观的原理

    #include "a.h"
    #include "b.h"

    实例; //这调用的构造函数
    b 实例; //这调用 b 的构造函数

    MAIN ()

      a. doSmomeStuff()

    我可以处理这种情况,只是想了解为什么不可能这样做。 可能是因为构造函数都是从 C++环境的 table_init 函数调用的、因此不是从 main.cpp 调用的?

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

    老实说、我可能不熟悉 TI ARM C++行为、因为我主要关注 C 语言。 我仍然希望您能够设置断点、只要在构造函数中确实存在 PC 命中即可。

    我建议您在另一个线程中使用 C++特定部件,并为 TI C/C++编译器标记它,希望该团队中的某个人能更好地解释该行为:)

    对于 PRCM 器件、您好像在 C 库中缺少了 PRCMLoadGet()的等效项吗?  

    dev.ti.com/.../group__prcm__api.html

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

    否、我执行 HWREG (PRCM_BASE + PRCM_O_CLKLOADCTL)= PRCM_CLKLOADCTL_LOAD;

    但之后需要延迟(我的255 nops)。 没有它、我就有了这种奇怪的行为。 我的一位代表告诉了我(这也是在另一个项目中完成的)、并说明这是必需的、即使没有如此清楚的记录。 我在数据表中也找不到任何提示。

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

    只需对 TI-RTOS 提出一个问题(而不是阅读大量页面)。

    正如您提到的、TI-RTOS 也会对处理器进行初始化。 但在启动时的哪个时间点完成此操作? 我需要在调用静态类构造函数之前完成此操作。 或使用 c 程序、在 main 开始之前、甚至在全局变量初始化之前。

    此致
    Erwin

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

    您好、Erwin、

    了解 PRCM 访问的内容很有意思、除了"PRCMLoadSet()"和"while (!PRCMLoadGet ())"、PRCM 器件不需要执行任何其他操作即可实现稳定。 您可以共享有问题的代码部分吗?

    您的"255 nops"或多或少是~2个 RTC 特性、因此需要执行依赖于 AON 的操作、并且需要等待 AON 同步、或者有其他正在进行的操作。  

    至于 TI-RTOS,只有在调用 BIOS_start()时才真正完成"TI-RTOS"初始化。 这包括内部对象和中断、也就是关于它的中断。

    至于在"main"之前发生的任何事情、这取决于工具链、因此确切的"方式"会根据您使用的 TI ARM 编译器或 GCC 而变化。 通常、您可以在 SDK 中找到"startup.c"文件(source/ti/devices/) /startup)、显示 ResetISR 的外观。 对于 TI ARM、它通常是__cinit11的一部分、或类似从该 ISR 调用的内容。 这是针对"C"情况的、但我假设 C++与其他"_cinit11****"函数类似(可能是您之前曾混淆过的"奇怪符号名称")。 这些"_cinit***"函数的末尾会将您跳回到 main 中。  

    您应该能够通过在 XDC/Compiler 目录中进行深入探索来找到这种方法的实际实现(我现在需要跳过论坛、因此没有时间为您跟踪后面的文件、但它是工具链中引入的库的一部分)。