Создание нового задания в FreeRTOS для приема USART - PullRequest
3 голосов
/ 24 мая 2011

Я использую плату разработки EVK1105 с AVR Studio 5 в качестве среды разработки для своего проекта AVR.Я использую FreeRTOS в нем.У меня есть 3 порта USART на этой плате.Один внешний модуль подключен к моей плате AVR32 через режим USART-RS232.Он посылает мне непрерывные последовательные данные на мою плату по USART0 с 19230 бод, 7 бит данных, нечетная четность, стоп-бит и режим нормального канала.Я создал новую задачу для этой цели.После каждых 9 байтов данных он отправляет «\ n» и «\ r».Поэтому в своей задаче я продолжаю собирать 9 данных в строковом буфере и затем передавать их по USART1.Я использую метод опроса для сбора данных от USAR0, который получает порт.Но я столкнулся с проблемой при получении данных.Я не знаю, если его проблема синхронизации или что-то или планировщик переключает задачу, в то время как собирает данные.Но я не получаю необходимые данные.

Ниже приведены вещи, которые я уже проверил как устранение неполадок 1. Подключил мой внешний модуль к гипертерминалу ПК, что дает мне идеальный результат.2. Реализовано то же самое, что и использование приема от USART0, и все полученное передается в USART1, как и без FreeRTOS.Работает нормально.

Пожалуйста, подскажите, что может быть не так.Я использую очередь для связи между задачами Tx и Rx, чтобы передать строковый буфер из USART0 в USART1.Это проблема в обработке очереди?Как устранить неполадки в очереди?

Я использую задержку в 50 мс в моем бесконечном цикле задач в Rx Task.Может ли это создать проблему?Если я не использую задержку, ОС вылетает.Пожалуйста, предложите несколько рекомендаций по созданию новой задачи во FreeRTOS, чтобы у меня не возникало проблем с синхронизацией.

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Вы все еще работаете над этим?Утверждение вашей проблемы расплывчато, но у меня есть несколько предложений / наводящих вопросов.1) Возможно, вы захотите, чтобы некоторые документы увидели, что такое регистры. Получите гигантские таблицы данных в формате PDF по адресу http://www.atmel.com/dyn/products/product_docs.asp?category_id=163&family_id=607&subfamily_id=2138&part_id=4117

2) В этом и более раннем посте вы заявляете, что в некоторых случаях вы могли принимать RX.данные.Вам нужно будет найти код инициализации USART HW из этих примеров проектов и включить их в пример проекта freeRTOS.В частности, звонки на

gpio_enable_module() with {AVR32_USART0_RXD_0_0_PIN, AVR32_USART0_RXD_0_0_FUNCTION}

Чтобы подключиться к USART к процессору, и я верю

InitRs232()

. Для того, чтобы сделать это, нужно потратить много кода - есть много зависимостей.

2) Какую функцию вы вызываете для получения данных из USART0?19 кбод - это примерно 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, это должен быть отправленный вами байт.

Если вы все еще работаете над этим, я могу рассмотреть это немного подробнее.

1 голос
/ 24 июня 2011

Для такого случая использования я бы не использовал метод опроса с задержкой 50 мс для извлечения данных из периферийного устройства UART.Вы можете легко потерять полученные данные в зависимости от загрузки системы и размера буфера приема UART.

По крайней мере используйте прерывание при получении данных UART, которое копирует каждый полученный байт в локальный буфер, который будет прочитан вашим потоком TX.

У вас может быть еще лучшее решение, использующее канал DMA для получения вашего фрейма данных и получения уведомлений о получении 9 байтов.Я не знаю, имеет ли ваше устройство AVR периферийное устройство DMA или нет.

...