3

我正在使用带有 AVR Studio 5 的 EVK1105 开发板作为我的 AVR 项目的开发 IDE。我在其中使用 FreeRTOS。我在这块板上有 3 个 USART 端口。一个外部模块通过 USART-RS232 模式连接到我的 AVR32 板。它以 19230 波特率、7 数据位、奇校验、停止位 1 和正常通道模式将连续串行数据发送到我的 USART0 板上。为此,我创建了一个新任务。在每 9 个数据字节之后,它发送 '\n' 和 '\r'。所以在我的任务中,我继续在字符串缓冲区中收集 9 个数据字节,然后在 USART1 上传输它。我正在使用轮询方法从正在接收端口的 USAR0 收集数据。但是我在接收数据时遇到了问题。我不知道是时间问题还是调度程序在收集数据时切换了任务。但我没有得到所需的数据。

以下是我已经检查过的故障排除 1. 将我的外部模块连接到我的 PC 超级终端,这给了我完美的结果。2. 实现了使用从 USART0 接收的相同操作,并且无论接收到什么都将传输到 USART1,就像没有 FreeRTOS 一样。它工作正常。

请提出一些想法可能出了什么问题。我正在使用队列在 Tx 和 Rx 任务之间进行通信,以将字符串缓冲区从 USART0 传递到 USART1。处理队列有问题吗?如何解决队列问题?

我在 Rx Task 的无限任务循环中使用了 50 毫秒的延迟。它会产生问题吗?如果我不使用任何延迟,操作系统就会崩溃。请提出一些好的做法来在 FreeRTOS 中创建新任务,这样我就不会遇到任何时间问题。

4

2 回答 2

1

你还在做这个吗?您的问题陈述含糊不清,但我有几个建议/引导性问题。1) 您可能需要一些文件来查看寄存器是什么 在 http://www.atmel.com/dyn/products/product_docs.asp?category_id=163&family_id=607&subfamily_id=2138&part_id=4117处获取巨型数据表 pdf

2) 在这篇文章和之前的一篇文章中,您声明您在某些情况下能够接收数据。您需要从这些示例项目中找到 USART 硬件初始化代码,并将它们放入 freeRTOS 示例项目中。特别呼吁

gpio_enable_module() with {AVR32_USART0_RXD_0_0_PIN, AVR32_USART0_RXD_0_0_FUNCTION}

将 USART 连接到 CPU,我相信

InitRs232()

仅仅这样做就需要大量的代码——有很多依赖项。

2) 你调用什么函数来从 USART0 检索数据?19kbaud 大约是 2000 字节/秒或 1 字节/0.5 毫秒,因此 50 毫秒轮询是远远不够的。我建议您的 RX 任务不断轮询(从不显式睡眠),但优先级低于 TX 任务。

3)专注于在调用时调试RX任务以检索数据。使用调试器查看 usart 的硬件寄存器。尤其是

USART0 cr 寄存器 AVR32_USART_CR_RXEN_MASK 应设置为启用 RX
USART0 csr 寄存器 AVR32_USART_CSR_RXRDY_MASK 将指示那里是否有新数据您也可以检查过低标志以查看是否丢失了一些数据。当 USART0 rhr 发生读取时,它应该是您发送的一个字节。

如果您仍在为此工作,我可以进一步研究一下。

于 2011-08-09T17:18:22.643 回答
1

对于这样的用例,我不会使用延迟 50 毫秒的轮询方法从 UART 外设检索数据。根据系统负载和 UART 接收缓冲区大小,您很容易丢失接收到的数据。

至少在 UART 数据接收上使用中断,将每个接收到的字节复制到本地缓冲区中,然后由 TX 线程读取。

您可以使用 DMA 通道来接收数据帧并在收到 9 个字节时收到通知,从而获得更好的解决方案。我不知道您的 AVR 设备是否有 DMA 外设。

于 2011-06-24T12:16:50.120 回答