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

| 我将带有AVR Studio 5的EVK1105开发板用作我的AVR项目的开发IDE。 我在其中使用FreeRTOS。我在该板上有3个USART端口。一个外部模块通过USART-RS232模式连接到我的AVR32板上。它以19230波特率,7个数据位,奇数奇偶校验,stopbit-1和正常通道模式向USART0上的板发送连续的串行数据。为此,我创建了一个新任务。在每9个数据字节之后,它将发送\'\\ n \'和\'\\ r \'。因此,在我的任务中,我继续在字符串缓冲区中收集9个数据字节,然后在USART1上传输它。我正在使用轮询方法从正在接收端口的USAR0收集数据。但是我在接收数据时面临问题。我不知道它的计时问题或什么原因,或者调度程序在收集数据时是否切换了任务。但是我没有得到所需的数据。 以下是我已检查为故障排除的内容 1.将我的外部模块连接到我的PC超级终端,这给了我完美的结果。 2.实现了与使用USART0的接收相同的功能,并且所接收的任何内容都将与不带FreeRTOS的内容一起传输到USART1。它的作品很好。 请提出一些想法,可能有什么问题。我正在使用队列在Tx和Rx任务之间进行通信,以将字符串缓冲区从USART0传递到USART1。处理队列有问题吗?如何对队列进行故障排除? 我在Rx Task中的无限任务循环中使用了50ms的延迟。会造成问题吗?如果我不使用任何延迟,则操作系统崩溃。请提出一些好的实践,以便在FreeRTOS中创建新任务,这样我就不会遇到任何计时问题。     
已邀请:
对于这种用例,我不会使用具有50ms延迟的轮询方法从UART外设检索数据。根据系统负载和UART接收缓冲区大小,您很容易丢失接收到的数据。 至少在UART数据接收时使用一个中断,该中断会将每个接收到的字节复制到本地缓冲区,该缓冲区将由TX线程读取。 您可以使用DMA通道来接收数据帧,并在收到9个字​​节时收到通知,这是一个更好的解决方案。我不知道您的AVR设备是否具有DMA外设。     
您还在为此工作吗?您的问题陈述含糊不清,但是我有几个建议/主要问题。 1)您可能希望某些文件查看寄存器是什么 在以下位置获取巨型数据表pdfs 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约为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时,它应该是您发送的字节。 如果您仍在进行此工作,我可以做更多研究。     

要回复问题请先登录注册