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.

[参考译文] TM4C129ENCPDT:使用邮箱管理与 UART 之间的命令行接口时、TI RTOS 会中止

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1389887/tm4c129encpdt-ti-rtos-goes-to-abort-when-using-mailboxes-to-manage-command-line-interface-to-from-uart

器件型号:TM4C129ENCPDT
主题中讨论的其他器件:SysConfig

工具与软件:

您好!

我正在使用 TI RTOS、我有两个需要交换数据的任务:clipTask 和 uartTask。 每个方向都有专用邮箱:CLI 到 UART 和 UART 到 CLI、分别对 UART TX 和 UART Rx 功能进行寻址。

在测试中、CLI 让用户输入数字"1"(我正在使用 TeraTerm)。 如果输入正确、CLI 将显示"You are cool!"、如果输入为其它任何内容、CLI 将报告无法识别输入。

当我有意输入错误的输入时、会出现问题。 我看到 UART Rx 回调中出现了错误的字符、我看到它发布到了正确的邮箱、然后我看到 CLI 确定这是不正确的输入。 当 CLI 将故障消息发布到 UART 时、RTOS 会触发中止功能。

在控制台中、我看到以下内容:

FSR = 0x0000
HFSR = 0x40000000
DFSR = 0x0000000b
MMAR = 0xe000ed34
BFAR = 0xe000ed38
AFSR = 0x00000000
正在终止执行...

如何解决此问题? 我将使用断点以及在执行之后;但是、似乎这些代码中有一些有用的信息以及/或者其他工具可以用来缩小此范围。

谢谢!

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

    您好!

     我不确定是什么原因导致了这个问题。 请注意、 邮箱对象被严格定义为一个静态大小和长度。 邮箱是基于内容复制的-线程 A 和 B 必须分配内存来保存消息的内容。 我不知道您是如何传递消息的。 您传递的是指针还是大于分配邮箱大小的数组? 您是否尝试过增大邮箱大小以了解它是否起作用? 在任何情况下、请参阅以下链接诊断问题。  

    调试

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

    Charles

    感谢您的答复。 我已经确认两个邮箱的字节大小等于所传递消息的字节大小:44字节、其中包含一个包含32个 uint8_t 和结构中一些"标头"变量的数组。

    在解决这个问题之后、我已经在 Mailbox.c 库中找到了发生这种情况的函数调用。 它位于"Mailbox_pend"函数内的第238行。 我将包含一个局部变量的屏幕截图。 有趣的是、其中一个结构中的"堆"变量显示为零。

    导致此错误的事件顺序如下:

    1) 1) CLI 任务将字符串发布到 UART_Tx 任务、然后 CLI 任务挂起来自 UART_Rx 任务的数据。

    2) 2) UART_Tx 任务输出这些字符串、然后挂起来自 CLI 的更多消息。

    3) 3)这允许运行 UART_Rx 任务。 当它接收到来自用户的消息时、它将发布到 CLI 任务。

    4) 4) CLI 任务中断数据、然后发布对 UART_Tx 任务的响应。 由于 CLI 任务和 UART_Tx 任务具有相同的优先级、因此 UART_Tx 任务不会立即恢复。

    5) 5) CLI 任务挂起来自 UART_Rx 任务的更多数据。 这应该允许 UART_Tx 任务写入来自 CLI 的响应;但是、会调用 abort 函数。

    对于上述情况、CLI 任务的优先级为6、UART_Tx 的优先级为5、UART_Rx 的优先级为4。

    刚刚经过测试、更改任务优先级。 对于此新测试: CLI 任务的优先级为5、UART_Tx 的优先级为6、UART_Rx 的优先级为4。

    在这种情况下、仍然调用 abort 函数、但用于 CLI 任务和 UART_Tx 任务之间的转换(与 UART_Rx 任务相反)。 因此、当任务发生更改时、就会出现问题。 还不知道驾驶问题是什么,但我感觉接近。

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

    你好、Noah、

     您能不能看一下这个邮箱示例? 此示例在某种程度上类似于您当前正在实现的。 本示例还使用两项任务通过邮箱进行通信。 尽管此示例适用于 MSP432E、但 MSP432E 实际上与 TM4C129器件是相同的。 我希望这是导致您出现问题的某种配置。 目前我没有理由认为 Mailbox _pend 函数中有错误。  

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

    Charles

    谢谢! 这是我在实现邮箱功能时使用的示例。 有一点我不理解的是如何正确使用多个邮箱。 在我的应用程序中、我实现了5个邮箱的2个实例(5个用于 CLI 到 UART、5个用于 UART 到 CLI)。 我不明白的是、对于所有交易、我必须一直遍历全部5个邮箱? 并不是所有5个邮箱都用于每个事务。

    一些事务只需要其中的1或2个。 我假设这些邮箱像是 FIFO 位置、在这里我有"多达5"个邮箱、但这行建议不同的:T 循环 NUMMSGS 迭代;在邮箱中放置一条消息。 放置在邮箱中的值也会打印到控制台。

    我会尝试每次遍历所有邮箱。

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

    你好、Noah、

    我不明白的是我必须为所有交易遍历所有5个邮箱? 并非所有5个邮箱都用于每个事务。

    正确。 如果一个给定的事务将占用多个邮箱、那么您将遇到问题。  

      关于邮箱使用情况、您能在第4.4节中参考 SYS/BIOS 用户指南吗? 您还可以参阅此链接上的在线用户指南。  https://dev.ti.com/tirex/content/tirtos_tivac_2_16_00_08/products/bios_6_45_01_29/docs/cdoc/ti/sysbios/knl/Mailbox.html#per-instance_creation

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

    你好、Noah、

     一些简短的问题。

     -如果您按原样运行示例,结果是什么?

     -您是否从新的 SysConfig 创建了您的应用程序? 如果您扩展示例 SysConfig 以包括 UART 的其他驱动程序会怎么样?

     -为了进行实验,如果您模拟相同的消息大小和消息数量的示例,该怎么办? 我只想知道在什么情况下您的代码不会中止? 或者、无论发生什么情况、您的代码都将中止。