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.
工具与软件:
您好!
我正在使用 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 的其他驱动程序会怎么样?
-为了进行实验,如果您模拟相同的消息大小和消息数量的示例,该怎么办? 我只想知道在什么情况下您的代码不会中止? 或者、无论发生什么情况、您的代码都将中止。