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.

[参考译文] RTOS/CC2650:如何调试以下 BIOS 扫描问题?

Guru**** 2587365 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/593974/rtos-cc2650-how-can-i-debug-the-following-bios-scan-issue

器件型号:CC2650

工具/软件:TI-RTOS

我在运行 TI-RTOS -> BIOS ->扫描错误时收到以下错误报告...

在 View init 代码:"c:/ti/xdctools_3_32_00_06_core/packages/xdc/rov/StructureDecoder.xs "行518:java.lang.exception:target memory read failed at address:0x20003d28、length:8中捕获异常
根据应用的段映射、该读取位于无效地址。 应用程序可能未初始化或已损坏。

当我查看地图时、该位置位于堆栈区域中。

这只是堆栈溢出吗?

我是否需要在堆栈中分配额外的区域?

谢谢、

John

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以查看这些任务、看看其中一个任务是否已完成堆栈。 如果你正在访问一些你不应该访问的东西、那么 Hwi 中还应该记录一个异常、这个异常可能会有更详细的信息。 Hwi 上的"module"选项卡显示了 hwiStackPeak 和 hwiStackSize。 对于任务、请使用"Detailed"(详细)选项卡查看 stackPeak 和 STACKSIZE。

    在我们的案例中、一旦遇到类似问题、Hwi 堆栈就需要扩展。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 David、

    任务堆栈是否像系统堆栈那样向下编译(从高地址开始并填充到低地址)?

    我使用的是 IAR。  IAR 将堆栈初始化为0xBE。

    那么、假设堆栈向下编译、如果我已经完成了其中一个任务堆栈、我将在堆栈底部(最低地址)看到非0xBE 数据...对吗?

    在2个任务堆栈中、我看到用0x00填充的最低4个字节、然后在增加地址位置中填充的0xBE 超过200个字节。 这是堆栈的底部、对吧?

    我不知道为什么堆栈底部会调零、但这可能会使底部很容易看到?

    我可能要完成其中一项任务、甚至是系统堆栈、但在调试器中查看故障时遇到困难:

    出现故障时、弹出一个窗口、显示以下消息:

    'XDS 报告了错误:未知 CPU 状态'

    '重置目标重试?'

    (按下 CANCEL 可中止调试会话)

    '是、否或取消'

    取消对我没有好处。 它会将我从调试会话中退出。

    否几乎会立即返回、并显示相同的错误框。

    是最初看起来不错、但经过一段时间后、它显示"Warning:can not set SW breakpoints"、no more HW breakpoints"

    我单击"OK"、它卡在报告 相同断点消息的循环中。

    我尝试清除所有断点(我只设置了3个断点)、并返回相同的断点消息。

    在调试器失去主意之前、在找到一个好的断点位置后、我是否需要查看任务堆栈和 Hwi 模块选项卡?

     

    感谢你的帮助。

    John

       

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    调试器可能会失去主意、因为器件已停止。 我只是使用 RTOV 来查看堆栈、而不是尝试深入了解存储器、老实说、我不知道它们的发展方向。 如果您可以在 IAR 设置中找到 RTOV、那么每次您在调试器中遇到断点或暂停时、它都会填充各种选项卡、其中包含有关任务和系统遇到的任何错误的信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    再次感谢 David、

    正如您所说的、您可以在 RTOV 的 TI-RTOS -> Hwi -> Module 选项卡中看到 hwiStackPeak 和 hwiStackSize。

    堆栈都从顶部向下构建。

    我之前说过、IAR 会将堆栈初始化为0xBE。 这是错的。 这是用0xBE 填充堆栈的初始化代码。

    我得出的结论是、RTOV hwiStackPeak 报告和堆栈窗口图形显示之间存在冲突。 这些工具相互对抗。 这种冲突的根本原因是每个工具使用的堆栈初始化值不同。 RTOV 工具使用值0xBE、而堆栈窗口图形显示使用值0xcd。
    初始化值的这种差异使得不可能同时使用两种工具。
    您可以使用其中一个工具、但不能同时使用这两个工具。
    TI 示例当前使用0xBE (在运行至 main 之后)保留栈初始化、从而允许 RTOV 正常运行。 如果您继续使用 RTOV、它将起作用。

    此外、您可以通过单击 View -> Stack 在堆栈窗口中查看堆栈。 每当调试器暂停时、堆栈窗口只显示堆栈中包含的有效数据。 它还向您显示数据是什么(例如、它可以是堆栈框的一部分、也可以是局部变量等)。
    只要调试器被暂停、堆栈窗口中的整个数据表都是有效的。
    但是、除非使用模式0xcd 初始化堆栈、否则堆栈窗口右上角的图形显示将无法正常工作。 此显示栏中显示的所有信息都是有效的、包括堆栈溢出指示(通过变为红色)、在正确设置时有效。
    注-通过将堆栈初始化值从0xbe 更改为0xcd、您可以启用堆栈显示栏、但也会导致 RTOV hwiStackPeak 信息无效。

    要从使用 RTOV hwiStackPeak 更改为使用堆栈窗口图形显示、请执行以下操作:
    -在 Project -> Options -> Debugger -> Setup 选项卡中、选中"Run To (运行至)"框并指定 main
    -启动 C-Spy 调试器。 调用 main 函数后、它将停止...堆栈将为空。
    -现在使用值0xcd 初始化整个堆栈。
    -继续调试;图形显示将一直有效、直到您再次点击调试器复位。
    -如果要在复位后继续使用堆栈图形显示窗口,则需要再次使用值0xcd 填充堆栈。

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

    堆栈都从顶部向下构建。

    使用 RTOV Hwi 模块来查看堆栈峰值是明智的选择。

    在 View -> Stack 窗口中、您可以看到:
    堆栈的当前深度、
    当前堆栈中的有效数据、
    以及堆栈是否溢出。
    尽管在运行到 main 后需要使用0xcd 来初始化栈、以使其中的某些功能正常工作。
    这样做会使 RTOV 丧失提供堆栈峰值的能力(因为 RTOV 使用初始值0xbe 来工作)
    但是、View -> Stack 窗口中不提供栈峰值。

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

    校正后、仅以图形形式在 View -> Stack 窗口中提供堆栈峰值。
    峰值显示为从深灰色到浅灰色的过渡。
    只要显示屏最右侧的部分不是红色、则表示堆栈没有溢出。
    如上所述、当正确设置视图-堆栈图形显示时、RTOV hwiStackPeak 无效。

    John

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我在 C 语言中找到了调试器爆炸的代码行。
    它位于传感器控制器 framework.c 文件的741行中,此行如下所示:
    //将 REQ 事件设置为将请求移交给传感器控制器
    HWREG (AUX_EVCTL_BASE + AUX_EVCTL_O_VECCFG0)|= AUX_EVCTL_VECCFG0_VEC0_POL_M;

    在执行该指令之前、我会在 ROV 中看到以下结果
    BIOS -> Scan for errors:"所有 ROV 视图均已运行、未遇到错误。 包括检查系统堆栈使用情况和任务堆栈。

    我执行这行 C 代码后、调试器会返回:
    'XDS reported an error:Inknown CPU status'(XDS 报告错误:未知 CPU 状态)
    '重置目标重试?'
    '(按下 CANCEL 可中止调试会话)'

    我知道传感器控制器代码被执行、因为我在被传感器控制器代码切换的信号上有一个示波器。

    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果我没有运行调试器、而是点击了电路板复位、则 M3代码和传感器控制器会反复运行、而不会出现错误。
    也就是说、我看到传感器控制器反复执行。
    由于某种原因、传感器控制器执行后调试器无法继续、但代码似乎正在正确执行。

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

    我找到了几种解决调试器崩溃问题的方法:

    1) 1)插入某些断点并运行到这些位置将导致调试器崩溃。

    删除这些断点可防止调试器崩溃。 这使得调试变得很困难、但是、这并不是不可能的。

    2)使用"无"优化进行编译可防止调试器崩溃。

    John