|
Исходники UART with PDC для Atmel ARM, Состряпал от нифиг делать :) |
|
|
|
Aug 10 2005, 13:56
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 15-03-05
Пользователь №: 3 361

|
Кому нужны готовые, либо как примеры работы с UART через PDC (т.е. ПДП) смело в юз. Помучился с ними пару дней. Работает уже пару недель. Без ошибок. Приемник работает посимвольно, и приемник и передатчик работают через прерывания, у каждого свой кольцевой буфер. Функции передачи не ждут, если данные помещаются в кольцевой буфер. Если надо ждать конца передачи - есть фунция. Поддерживается работа в многопоточной среде. Можно легко интегрировать в операционную систему (если переписать функции работы с сигналами). Кристалл у меня AT91SAM7S64 и AT91RM9200, но, думаю, любой Atmel подойдет. В общем, кому интересно, смело смотрим. Public domain. О как! Тока запостил, сразу ошибку нашел! Исправил. Как расценить сей шаг всевышнего даже не знаю, но что не случается, все к лучшему
|
|
|
|
|
 |
Ответов
|
Dec 20 2007, 07:24
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 15-03-05
Пользователь №: 3 361

|
Глянул на исходники PDC от Linux (древние, правда). Там функция вывода, перед тем как поместить новые данные в буфер и настроить указатели, выключает(!) передатчик. Т.е. если в этот момент произойдет более высокоуровневое прерывание - передатчик будет выключен и данные передаваться не будут. Если же запрещаются все прерывания, значит в течение всего времени копирования выходных данных в буфер нет возможности прерваться на более привелигированную операцию (не помню, запрещаются ли прерывания, но у обоих вариантов есть минусы). К тому же какова цена выключения и включения передатчика? Это просто кажущаяся простота смены значения одного бита, за которой, на самом деле идет много всяких переключений, а это лишняя трата энергии, что иногда немаловажно.
В моем драйвере применяется более сложный алгоритм, который позволяет передатчику продолжать работать в момент копирования буфера, прерывания при этом разрешены. Единственное, что на момент копирования маскируется прерывание самого передатчика.
|
|
|
|
|
Dec 20 2007, 18:23
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 15-03-05
Пользователь №: 3 361

|
Цитата(aaarrr @ Dec 20 2007, 17:57)   А какова цена побайтного копирования данных из приемника в прерывании? Я уж не говорю о том, что это потенциальная причина потери данных при даже не очень длительном (174uS @ 115200) запрещении прерываний. ??? Не понял. В каком месте там теряются данные? В приемнике? Да, приемник работает не через PDC. Но я не вижу там проблем. Не помню детально работу с UART у SAM. Но по идее потеря произойдет только если не уcпеть считать предыдущей принятый байт. Байты приходят через каждые 2864 такта. Прерывания от UART маскируются для копирования порции данных в выходрой буфер. Если в этот момент поступит байт, обработан он не будет. Сразу же. А только после того, как memcpy скопирует данные, прерывание демаскируются и тут же срабатывает. Размер буфера передатчика всего 128 байт, так что байт не потеряется. Хотя, конечно надо бы и приемник сделать через PDC. И у вас есть пример. З.Ы. А то что UART вообще выключается, пока копируется буфер, это как повлияет на возможность потери? Что за 174uS?
|
|
|
|
|
Dec 20 2007, 18:35
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Andrey Sudnov @ Dec 20 2007, 21:23)  Хотя, конечно надо бы и приемник сделать через PDC. И у вас есть пример. Надо. У меня и приемник есть, зачем мне пример  Цитата(Andrey Sudnov @ Dec 20 2007, 21:23)  З.Ы. А то что UART вообще выключается, пока копируется буфер, это как повлияет на возможность потери? Никак, если все уже передано. Цитата(Andrey Sudnov @ Dec 20 2007, 21:23)  Что за 174uS? Это время передачи двух байт на скорости 115200. Очень маленькое время, особенно если процессор занят другими задачами.
|
|
|
|
|
Dec 20 2007, 18:49
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 15-03-05
Пользователь №: 3 361

|
Цитата(aaarrr @ Dec 20 2007, 23:35)  Никак, если все уже передано. Т.е. прием и передача идут сразу из пользовательских буферов. Которые, например, локальные. Ню-ню. Цитата Это время передачи двух байт на скорости 115200. Очень маленькое время, особенно если процессор занят другими задачами. К чему это? Продолжительнорсть маскировки прерывания не превышает копирования 128 байт функцией memcpy. Это сколько, не помню, 128 тактов (1 копирование за 4-е такта)? Для того чтобы принятый байт потерялся, необходимо чтобы MC был занят более привелигированной задачей (ну там время считал) указаное вами время поделить на 2, т.е. 2871 такт (я указал 2864  Это значит ваще каюк пришел реал-тайму.
|
|
|
|
Сообщений в этой теме
Andrey Sudnov Исходники UART with PDC для Atmel ARM Aug 10 2005, 13:56 xoms Ну уже можно скачивать или подождать. Aug 10 2005, 15:24 Andrey Sudnov Цитата(xoms @ Aug 10 2005, 20:24)Ну уже можно... Aug 10 2005, 17:44  RRRR Для Linux драйвер с использованием PDC (AT91RM9200... Aug 11 2005, 14:56 bloodden Полезная вещь. Сенкс. Mar 3 2007, 20:04 ivstech Круто, особенно примитивы синхронизации понравилис... Mar 14 2007, 09:58     aaarrr Цитата(Andrey Sudnov @ Dec 20 2007, 21:49... Dec 20 2007, 18:57      Andrey Sudnov Цитата(aaarrr @ Dec 20 2007, 23:57) Я не ... Dec 20 2007, 19:16 aaarrr Цитата(Andrey Sudnov @ Dec 20 2007, 22:16... Dec 20 2007, 19:28 Andrey Sudnov Цитата(aaarrr @ Dec 21 2007, 00:28) и при... Dec 20 2007, 20:31 Dron_Gus Если Вы не против, подкину еще одну тему для обсуж... Dec 20 2007, 19:51 aaarrr Цитата(Dron_Gus @ Dec 20 2007, 22:51) Есл... Dec 20 2007, 22:03  Andrey Sudnov Цитата(aaarrr @ Dec 21 2007, 03:03) ИМХО,... Dec 20 2007, 22:53 Dron_Gus 2 Andrey Sudnov. Да уж алгоритм не тривиален. Пауз... Dec 20 2007, 22:55 aaarrr Цитата(Andrey Sudnov @ Dec 21 2007, 01:53... Dec 21 2007, 00:36 Andrey Sudnov Цитата(aaarrr @ Dec 21 2007, 05:36) Итак:... Dec 21 2007, 05:06 vet а что за беда от выключения PDC? ну выключили, пер... Dec 21 2007, 06:58 Andrey Sudnov Цитата(vet @ Dec 21 2007, 11:58) а что за... Dec 21 2007, 08:43  Andrey_Sudnov Взрыв из прошлого
Кому интересен subj, у мну есть... Dec 7 2015, 04:57 MrAlex Можно вообще не передергивать контроллер и работат... Dec 7 2015, 16:26 Andrey_Sudnov Согласен насчет того, что можно принимать через од... Dec 7 2015, 17:28 MrAlex "Правда в том, что никакой ложки нет."
а... Dec 8 2015, 08:31 Andrey_Sudnov Цитата(MrAlex @ Dec 8 2015, 13:31) ... Dec 8 2015, 14:34
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|