gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:25:39 27 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

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

关于avr - 在 FreeRTOS 中为 USART 接收创建新任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6105721/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com