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/TM4C1294NCPDT:SWI 已发布、但未运行

Guru**** 2482225 points
Other Parts Discussed in Thread: EK-TM4C1294XL, SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/721619/rtos-tm4c1294ncpdt-swi-posted-but-not-running

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:EK-TM4C1294XLSYSBIOS

工具/软件:TI-RTOS

尊敬的所有人:

我有一个简单的配置、在所有三个 SPI ADC (连接到三个不同的 SSI)都准备好数据时、就会发生一个 GPIO 中断。 GPIO 中断由 Hwi 处理、Hwi 从 ADC 读取数据、然后布置 Swi。 还有一个每50ms 调用一次的小时钟函数(3us)。 该项目基于 TI-RTOS 示例>> EK-TM4C1294XL 评估套件>>驱动程序示例>> TI 驱动程序示例>>空示例>>空项目。

Swi 每次被正确布置和执行几秒钟、然后它停止执行、而 ROV 一直显示它被布置(在故障后从不显示空闲)。 这是一种情况。 另一个是、它运行几秒钟、然后崩溃:

TI.SYSBIOS.family.ARM.m3/Hwi:第1095行:E_hardFault:Forced
TI.SYSBIOS.family.ARM.m3/Hwi:第1207行:E_usageFault:INVPC:无效 PC
在 PC = 0x00000000的后台线程中发生异常。
内核0:ThreadType_Task 中发生异常。
任务名称:{unknown-instance-name}、句柄:0x20002bf4。
任务堆栈基地址:0x20003000。
任务堆栈大小:0x800。

如果我不使用时钟函数、则第一种情况永远不会发生、只有第二种情况(换句话说、每次都崩溃)。

系统堆栈为1024、因此我认为没有溢出。

空闲堆栈为2048、远高于峰值堆栈使用量(我在 ROV 的 Hwi 部分中检查)。

LoggerStopMode 报告没有地址(地址 N/A)。 也许这告诉我一些事情...

一个有趣的事情是、当我从时钟函数布置 Swi 时(这是一个半错误的)、一切都正常。 Swi 仅在从 Hwi 中发布时才被阻止、但 Hwi 继续照常运行。

如果有任何帮助、我将不胜感激。

提前感谢、

米兰

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

    您好!

     我有一些问题和意见。

    • 您的时钟节拍率是多少? 是3us 还是50mS? 我不清楚您对3US 的含义。  
    • 您说过" GPIO 中断是通过 Hwi 处理的、Hwi 从 ADC 读取数据、然后布置 Swi"。您是否尝试处理 GPIO Hwi 中的 ADC 数据? 或者在 GPIO Hwi 中、您将布置 Swi 以处理 ADC 数据。 建议的方法是从 Hwi 中布置 Swi、并让 Swi 处理 ADC 数据。 请注意、Hwi 的优先级将高于 Swi、如果你在 Hwi 中花费太多的时间、那么 Swi 将没有机会被处理、尤其是在 GPIO 中断速度非常快的情况下。  
    • GPIO 中断的速度有多快?
    • 您的语句似乎建议您处理 Hwi 中的 ADC 数据、然后布置 Swi。 这个 Swi 的作用是什么?
    • 时钟函数也是一个 Swi 事件。 根据你设置的优先级、它可能优先于你在 GPIO Hwi 中调用的 Swi。 因此、请检查 Swi 优先级。  

     我觉得你遇到的问题与 Swi 的优先级以及你在 Hwi 内执行的时间和操作有关。  

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

    -厚速率为1ms,每50ms 调用一次持续3us 的时钟函数(初始延迟为50ms)。 优先权14.
    如果我处理 Hwi 中的所有内容,它就可以工作,但我认为这不是问题所在。 我从 Eric 的在线研讨会中了解到、正如您所建议的、我只需阅读 Hwi 中的所有样本(大约需要20us、优先级为15)、然后在 Swi 中处理(优先级为15)(大约需要60us)。 我的采样率为5kHz (我也尝试使用较低的值)、因此有足够的时间处理所有数据。 我尝试了不同(较低)的 Hwi 和 Swi 优先级、但没有效果。
    所以、我可以把所有东西都放在 Hwi 中、然后离开 Hwi、但这是非常重要的(从 Hwi 中布置一个 swi)。。。
    我不确定它是否有用、但启用了以下模块(无实例):默认值、诊断、错误、空闲、日志、 LoggingSetup、Main、Memory、Program、SysMin、 系统、任务、文本。 实例:时钟、Hwi、Swi。

    此致、
    米兰
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我还尝试了不同的编译器。 我获得相同的结果(BIOS 退出或 Swi 被发布但未执行)、但我在所有编译器中都没有收到这些警告:
    "警告"112-D:语句无法访问"(ti_rtos_pem4f.c 文件)。 我通过编译器 v17.9.0.STS 收到此消息、但不通过 v15.9.0.STS、v5.2.6或 v5.2.5收到此消息。
    我用于 TivaC 的 TI-RTOS 版本为2.16.1.14、XDC 版本为3.32.0.06_CORE。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、米兰、

    请观看此演示 :training.ti.com/debugging-common-application-issues-ti-rtos 希望它能为您提供一些有关正在发生的情况的线索。

    查看 ROV->Hwi->基本和模块、确认您没有意外产生零延迟中断。 零延迟中断不能调用内核 API (例如 Swi_post)。

    对于 Swi 被布置但不运行的情况...正在运行什么?

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

    就是这样! 我的 Hwi 类型为零延迟、因此无论如何都不应允许优先级值14 (我设置了该值)。 但是... 我不明白为什么将-1以外的任何优先级数视为零延迟。 在 Eric 的实验课程(21:20)中、他说他使用优先级组7 (对于 Tiva M4)、这与将优先级值设置为-1相同。 这似乎并不正确、因为当我将优先级设置为7时、它仍然是零延迟、只有-1将 Hwi 设置为派单类型。 这也意味着 BIOS 不支持 Hwi 嵌套(如果每个分派的 Hwi 具有相同的优先级)、这当然不应该是真的... 此外、还提供了如何设置非 BIOS 中断的指南(TI_RTOS_Kernel_Workshop_Student_Guide_rev4.00、第5-15页)、其中指出(对于 Tiva 用户)我必须将关键字中断和中断优先级置为零、以便从配置 GUI 中获取此信息。 那么、我想我错过了其他一些设置吗? 我希望对这一议题作进一步澄清。

    感谢您的支持!
    此致、
    米兰
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、现在一切都很清楚。 我仔细看了讲座、我意识到我不应该在中断优先级字段(Hwi instace 配置)中写入数字7、而应该是7<5 (或0xE0或224)。 现在再次派送。

    此致、
    米兰
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、优先级需要与8位字段左对齐。 0x0-0x1F 被视为零延迟。