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/F28M36P63C2:可以单步执行程序直到 BIOS_start(),然后立即转到异常处理程序和 abort()

Guru**** 2542170 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/579811/rtos-f28m36p63c2-can-single-step-through-program-until-bios_start-then-immediately-goes-to-exception-handler-and-abort

器件型号:F28M36P63C2

工具/软件:TI-RTOS

我可以一直单步执行我的程序直到 BIOS_start()。  然后、它退出并出现异常。  有趣的是、如果我在任何地方(甚至在 BIOS_start()之前)放置一个断点、它会经过相同的异常路径。

栈跟踪从以下内容开始:

0xfffffffff8 (未为0xfffffff8定义符号)

控制台提示:

[Cortex_M3_0] FSR = 0x0000
HFSR = 0x00000000
DFSR = 0x00000001
MMAR = 0xe000ed34
BFAR = 0xe000ed38
AFSR = 0x00000000
正在终止执行...

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

    我需要更多信息来帮助您。 您正在使用哪些工具(CCS 版本、SYS/BIOS 版本等)? 这是示例应用还是自定义应用? 提供的任何示例应用程序的行为是否正确?

    Alan

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

    感谢您的回答!

    CCS 版本 7.0.0.00043  

    TI-RTOS 版本2.16.01.14

    SYS/BIOS 版本6.45.02.31

    XDC 工具版本3.32.00.06

    TI 驱动程序版本2.16.01.13

    NDK 2.25.00.09

    更多背景信息。  这是一个在 TI-RTOS 2.01 (?)上工作的程序。  几年前。  我必须进行一些更改才能使其编译并与2.16链接。  它基于2.01中的 tcpEcho 示例、但已从该示例中进行了大量修改、以便与 PC 进行完全通信。  此外、它还与 C2000内核通信以进行命令和遥测。

    新的 tcpEcho 示例似乎工作正常、因此我将其从2.01转换为2.16时确实是这样做的...

    再次感谢、

    -Phil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当您说新的 tcpEcho 示例似乎正常工作时、您是否还说单步执行和断点按预期运行?

    通常情况下,如果某个程序在 BIOS_start()和任何任务函数的开头之间终止(即发生异常),这是由于中断关闭而无法得到正确处理。 如果你浏览 Hwi 模块的异常 ROV 视图、一个导致异常的调用堆栈可能会提供一个很好的提示。 否则、您可以使用解码异常和寄存器上下文作为有用的提示。

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

    是的、tcpEcho 按预期运行单步执行和断点。

    对 ROV 视图的进一步检查表明、程序在我对 IntEnable (INT_CTOMPIC1)的调用中正在失效

    -Phil

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

    浏览 Hwi 模块的异常选项卡可以为您提供足够的信息来确定异常的原因。

    根据您所说的内容、我怀疑'INT_CTOMPIC1'中断没有正确地在 SYS/BIOS 中注册(使用 Hwi_create ())、并且在它被启用时已经挂起。 如果向量表未插入该中断的相应处理程序函数、则会引发异常。 中断也有可能已经被正确地注册到 SYS/BIOS 中、但是在 ISR 内执行一些会导致异常的操作。

    Hwi 创建的一个常见问题是 Hwi 优先级设置不当。 除非你知道你在做什么、否则最好将 Hwi_Params.priority 字段保持为 Hwi_Params_init ()提供的默认值。 您应该避免将优先级设置为零、因为这是为"零延迟中断"保留的、如果 ISR 调用任何 SYS/BIOS API、将会导致各种问题。

    Alan

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

    谢谢你。

    我最后通过删除 IntEnable()调用并在配置文件中的 Hwi.Params 中将 enableInt 更改为 true 来解决问题。

    -Phil

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

    太棒了... 问题并没有完全消失。  代码不再崩溃、但也不起作用。  CtoM Int 似乎没有触发。  这是否仍然是配置文件的有效初始化?:

    var hwi0Params = new halHwi.Params();

    hwi0Params.instance.name ="CtoMInt1";

    hwi0Params.priority = 8;

    hwi0Params.enableInt = true;

    program.global.CtoMInt1 = halHwi.create (50、"&CtoMIP1IntHandler"、hwi0Params);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有效的中断优先级为:0x00、0x20、0x40、0x60、0x80、 0xA0、0xc0、0xe0。

    优先级8的选择映射到0x00、默认情况下、该优先级为零延迟中断优先级。

    零延迟中断永远不会被 BIOS 禁用、因此禁止调用 ISR 函数内的任何 BIOS API、因为不尊重关键段保护并将导致数据损坏。

    如果 ISR 调用任何 BIOS API、则应尝试使用优先级0x20到0xe0。

    阅读以下链接、了解有关零延迟中断和中断优先级的更多详细信息:

    software-dl.ti.com/.../Hwi.html

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

    Alan、

    感谢您的快速响应。  我将优先级更改为0x20、中断似乎仍然没有触发。  我查看了调试器的 Hwi 部分、它显示它存在并启用。  我使用以下命令在 C2000端触发它:

    CtoMIPCRegs.CTOMIPSET.ALL!= 1;

    这在一年前我使用过这种设置。  C2000方面唯一改变的是编译器。  C2000端不使用 TI-RTOS、而是以5kHz 运行的单个计时器中断。  看起来一切都设置正确、但我的中断处理程序从未在 M3侧运行。  你有其他智慧的想法吗?

    谢谢、
    -Phil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哎呀、抱歉。 该行应是:
    CtoMIPCRegs.CTOMIPSET.ALL |= 1;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否确定中断编号(50)? BIOS Hwi 模块使用矢量数、而不是 ARM 的"用户"中断数。

    当条件出现时、您能否使用 Hwi"详细"ROV 视图确认中断50已启用并处于挂起状态?

    此外、您能否使用 CCS 寄存器视图确认"CTRL_FAULT_BASE_PRI"的值为0x02000000、表示启用了全局中断?


    Alan

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

    我不知道中断编号、但这是 TI-RTOS 2.01中的有效内容。  此后是否会发生变化以需要不同的数字?

    我很确定"Detailed (详细)" ROV 显示为 Enabled (已启用)和已派单(已派单)。  今天下午回到系统时、我必须检查一下。  我也将检查全局中断。

    谢谢!

    -Phil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果中断确实已触发、但 ISR 尚未执行、则详细视图应显示"已启用"和"待处理"。

    如果它没有显示"待处理"、并且您确定 ISR 尚未执行、那么我很确定中断没有被触发。

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

    因此 CTRL_FAULT_BASE_PRI 为0x02002000。  第二个"2"是否意味着什么重要?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的。 中断被禁用。 有人调用了 Hwi_disable(),而没有调用 Hwi_restore()。
    Hwi 详细 ROV 视图是否将中断50显示为挂起?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我从未见过 CtoM1中断(50)挂起。 它始终显示为 Enabled (已启用)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    然后会发生两件糟糕的事情:

    1) 1) Hwi_disable()在没有匹配 Hwi_restore()的情况下被调用
    2) 2)未触发中断50

    当您停下来四处看看时、PC 在哪里?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我认为 Hwi_disable()被一个匹配的 Hwi_restore 调用、因为有时当我停止它时、寄存器为0x02000000。

    我通过将中断50更改为中断96来使其工作。  CtoMIP1中断编号显然在 TI-RTOS 2.00和2.16之间发生了变化。

    -Phil