在FreeRTOS中为USART接收创建新任务

时间:2011-05-24 04:34:25

标签: avr uart freertos

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

以下是我已经检查过的故障排除方法 1.将我的外部模块连接到我的PC超级终端,这给了我完美的结果。 2.实现了使用USART0接收的相同功能,接收的任何内容都是在没有FreeRTOS的情况下发送到USART1的。它的工作正常。

请提出一些可能出错的建议。我正在使用队列在Tx和Rx任务之间进行通信,以将字符串缓冲区从USART0传递到USART1。处理队列有问题吗?我该如何排除队列故障?

我在Rx Task的无限任务循环中使用了50ms的延迟。它会造成问题吗?如果我不使用任何延迟,操作系统崩溃。请建议一些在FreeRTOS中创建新任务的良好实践,以便我不会遇到任何时间问题。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

2)在本文和之前的帖子中,您声明在某些情况下您已经能够接收数据。您需要从这些示例项目中找到USART HW初始化代码,并将它们放入freeRTOS示例项目中。特别是要求

gpio_enable_module() with {AVR32_USART0_RXD_0_0_PIN, AVR32_USART0_RXD_0_0_FUNCTION}

连接USART到CPU 我相信

InitRs232()

这样做需要在很多代码中进行搜索 - 有很多依赖项。

2)您要求从USART0检索数据的功能是什么? 19kbaud约为2000bytes / sec或1字节/0.5ms,因此50ms轮询不够。我建议您的RX任务连续轮询(从不显式睡眠),但优先级低于TX任务。

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

USART0 cr寄存器AVR32_USART_CR_RXEN_MASK应设置为启用RX
USART0 csr寄存器AVR32_USART_CSR_RXRDY_MASK将指示是否有新数据 您还可以检查溢出标记以查看是否遗漏了一些数据。 当读取USART0 rhr时,它应该是您发送的字节。

如果你还在研究这个问题,我可以再研究一下。