реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Исходники UART with PDC для Atmel ARM, Состряпал от нифиг делать :)
Andrey_Sudnov
сообщение Aug 10 2005, 13:56
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 82
Регистрация: 15-03-05
Пользователь №: 3 361



Кому нужны готовые, либо как примеры работы с UART через PDC (т.е. ПДП) смело в юз.
Помучился с ними пару дней. Работает уже пару недель. Без ошибок.
Приемник работает посимвольно, и приемник и передатчик работают через прерывания, у каждого свой кольцевой буфер. Функции передачи не ждут, если данные помещаются в кольцевой буфер. Если надо ждать конца передачи - есть фунция. Поддерживается работа в многопоточной среде. Можно легко интегрировать в операционную систему (если переписать функции работы с сигналами).
Кристалл у меня AT91SAM7S64 и AT91RM9200, но, думаю, любой Atmel подойдет.
В общем, кому интересно, смело смотрим. Public domain.

О как! Тока запостил, сразу ошибку нашел! Исправил. Как расценить сей шаг всевышнего даже не знаю, но что не случается, все к лучшему wink.gif
Прикрепленные файлы
Прикрепленный файл  uartpdc.rar ( 2.3 килобайт ) Кол-во скачиваний: 457
 
Go to the top of the page
 
+Quote Post
xoms
сообщение Aug 10 2005, 15:24
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 124
Регистрация: 20-06-04
Пользователь №: 67



Ну уже можно скачивать или подождать.
Go to the top of the page
 
+Quote Post
Andrey_Sudnov
сообщение Aug 10 2005, 17:44
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 82
Регистрация: 15-03-05
Пользователь №: 3 361



Цитата(xoms @ Aug 10 2005, 20:24)
Ну уже можно скачивать или подождать.
*

Да, вполне можно. Ошибка была в ветке алгоритма, которую недавно дописал и не тестировал. Проявилась бы при передаче функции PutStr строки длинее, чем внутренний буфер, когда он пуст.

Конечно же возможны и другие ошибки. Но перекачал уже мегов 100 по X modem да и в консоли постоянно работаю - все ОК.
Go to the top of the page
 
+Quote Post
RRRR
сообщение Aug 11 2005, 14:56
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 18
Регистрация: 23-06-05
Пользователь №: 6 264



Для Linux драйвер с использованием PDC (AT91RM9200) лежит на www.ipbx.ru/rm9200
Go to the top of the page
 
+Quote Post
bloodden
сообщение Mar 3 2007, 20:04
Сообщение #5


Бывалый
***

Группа: Validating
Сообщений: 375
Регистрация: 19-10-05
Из: Kiev, UA
Пользователь №: 9 853



cheers.gif a14.gif
Полезная вещь. Сенкс.


--------------------
Заходите кому надо на мой сайт
Go to the top of the page
 
+Quote Post
ivstech
сообщение Mar 14 2007, 09:58
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 204
Регистрация: 5-01-06
Пользователь №: 12 860



Круто, особенно примитивы синхронизации понравились
Go to the top of the page
 
+Quote Post
Andrey_Sudnov
сообщение Dec 20 2007, 07:24
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 82
Регистрация: 15-03-05
Пользователь №: 3 361



Глянул на исходники PDC от Linux (древние, правда). Там функция вывода, перед тем как поместить новые данные в буфер и настроить указатели, выключает(!) передатчик. Т.е. если в этот момент произойдет более высокоуровневое прерывание - передатчик будет выключен и данные передаваться не будут. Если же запрещаются все прерывания, значит в течение всего времени копирования выходных данных в буфер нет возможности прерваться на более привелигированную операцию (не помню, запрещаются ли прерывания, но у обоих вариантов есть минусы). К тому же какова цена выключения и включения передатчика? Это просто кажущаяся простота смены значения одного бита, за которой, на самом деле идет много всяких переключений, а это лишняя трата энергии, что иногда немаловажно.

В моем драйвере применяется более сложный алгоритм, который позволяет передатчику продолжать работать в момент копирования буфера, прерывания при этом разрешены. Единственное, что на момент копирования маскируется прерывание самого передатчика.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 20 2007, 12:57
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Andrey Sudnov @ Dec 20 2007, 10:24) *
К тому же какова цена выключения и включения передатчика? Это просто кажущаяся простота смены значения одного бита, за которой, на самом деле идет много всяких переключений, а это лишняя трата энергии, что иногда немаловажно.

smile.gif А какова цена побайтного копирования данных из приемника в прерывании?
Я уж не говорю о том, что это потенциальная причина потери данных при даже не очень длительном (174uS @ 115200) запрещении прерываний.
Go to the top of the page
 
+Quote Post
Andrey_Sudnov
сообщение Dec 20 2007, 18:23
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 82
Регистрация: 15-03-05
Пользователь №: 3 361



Цитата(aaarrr @ Dec 20 2007, 17:57) *
smile.gif А какова цена побайтного копирования данных из приемника в прерывании?
Я уж не говорю о том, что это потенциальная причина потери данных при даже не очень длительном (174uS @ 115200) запрещении прерываний.

??? Не понял.
В каком месте там теряются данные? В приемнике? Да, приемник работает не через PDC. Но я не вижу там проблем.
Не помню детально работу с UART у SAM. Но по идее потеря произойдет только если не уcпеть считать предыдущей принятый байт. Байты приходят через каждые 2864 такта. Прерывания от UART маскируются для копирования порции данных в выходрой буфер. Если в этот момент поступит байт, обработан он не будет. Сразу же. А только после того, как memcpy скопирует данные, прерывание демаскируются и тут же срабатывает. Размер буфера передатчика всего 128 байт, так что байт не потеряется.
Хотя, конечно надо бы и приемник сделать через PDC. И у вас есть пример.
З.Ы. А то что UART вообще выключается, пока копируется буфер, это как повлияет на возможность потери?
Что за 174uS?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 20 2007, 18:35
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Andrey Sudnov @ Dec 20 2007, 21:23) *
Хотя, конечно надо бы и приемник сделать через PDC. И у вас есть пример.

Надо. У меня и приемник есть, зачем мне пример smile.gif

Цитата(Andrey Sudnov @ Dec 20 2007, 21:23) *
З.Ы. А то что UART вообще выключается, пока копируется буфер, это как повлияет на возможность потери?

Никак, если все уже передано.

Цитата(Andrey Sudnov @ Dec 20 2007, 21:23) *
Что за 174uS?

Это время передачи двух байт на скорости 115200. Очень маленькое время, особенно если процессор занят другими задачами.
Go to the top of the page
 
+Quote Post
Andrey_Sudnov
сообщение Dec 20 2007, 18:49
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 82
Регистрация: 15-03-05
Пользователь №: 3 361



Цитата(aaarrr @ Dec 20 2007, 23:35) *
Никак, если все уже передано.

Т.е. прием и передача идут сразу из пользовательских буферов. Которые, например, локальные. Ню-ню.
Цитата
Это время передачи двух байт на скорости 115200. Очень маленькое время, особенно если процессор занят другими задачами.

К чему это?
Продолжительнорсть маскировки прерывания не превышает копирования 128 байт функцией memcpy. Это сколько, не помню, 128 тактов (1 копирование за 4-е такта)? Для того чтобы принятый байт потерялся, необходимо чтобы MC был занят более привелигированной задачей (ну там время считал) указаное вами время поделить на 2, т.е. 2871 такт (я указал 2864 smile.gif Это значит ваще каюк пришел реал-тайму.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 20 2007, 18:57
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Andrey Sudnov @ Dec 20 2007, 21:49) *
Т.е. прием и передача идут сразу из пользовательских буферов. Которые, например, локальные. Ню-ню.

Я не говорю, что запрещать правильно и хорошо. Просто это не приведет к катастрофическим последствиям.

Цитата(Andrey Sudnov @ Dec 20 2007, 21:49) *
Для того чтобы принятый байт потерялся, необходимо чтобы MC был занят более привелигированной задачей (ну там время считал) указаное вами время поделить на 2, т.е. 2871 такт (я указал 2864 smile.gif Это значит ваще каюк пришел реал-тайму.

Во-первых, ничего делить не надо - для переполнения нужно два символа. А во-вторых, почему бы процессору не отвлечься на такое время? Реал-тайм реал-тайму рознь smile.gif
Go to the top of the page
 
+Quote Post
Andrey_Sudnov
сообщение Dec 20 2007, 19:16
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 82
Регистрация: 15-03-05
Пользователь №: 3 361



Цитата(aaarrr @ Dec 20 2007, 23:57) *
Я не говорю, что запрещать правильно и хорошо. Просто это не приведет к катастрофическим последствиям.

Ну вот выключили мы UART. И отвлеклись. Причем не на 2 байта, а всего на один стартовый бит. Потом включили. Нееет, все нормально, никаких катострофических последствий.
Цитата
Во-первых, ничего делить не надо - для переполнения нужно два символа. А во-вторых, почему бы процессору не отвлечься на такое время? Реал-тайм реал-тайму рознь smile.gif

Принимаю, вроде так. Ну дак значит времени на оброботку есть еще больше.

Я утверждаю, что даже с посимвольным вводом, ситуация, когда потеряется символ - невозможна. Точнее это произойдет только в том случае, если прерывания будут запрещены в течение 5742 такта, а это невозможно. Если же это возможно, значит возможны и другие катастрофы.

Вспомнил насчет копироавния и внутренних буферов. Они нужны для того чтобы вызвать PutStr и сразу же вернуться из нее. При этом буфер, который указывали PutStr можно использовать по новому. Единственное но. Длина не должна превышать свободный размер внутреннего буфера, иначе PutStr будет ждать его освобождения. Размер буфера 128 байт. Для некоторых применеий может быть мало. Но тут нет идеально варианта, в любом случае в чем-то выигрываем, в чем то проигрываем.
В случае если PDC будет работать прям из переданного буфера, функция PutStr вынуждена ждать завершение передачи, иначе данные могут быть испорчены программой, после возврата из нее.
Как вариант - все время передавать из разных мест. Да, в некоторых случаех надо делать так, но это гораздо сложнее, чем вызвать PutStr и забыть.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 20 2007, 19:28
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Andrey Sudnov @ Dec 20 2007, 22:16) *
Ну вот выключили мы UART. И отвлеклись. Причем не на 2 байта, а всего на один стартовый бит. Потом включили. Нееет, все нормально, никаких катострофических последствий.

Ваши слова:
Цитата(Andrey Sudnov @ Dec 20 2007, 10:24) *
выключает(!) передатчик

и причем здесь прием?

Цитата(Andrey Sudnov @ Dec 20 2007, 22:16) *
Я утверждаю, что даже с посимвольным вводом, ситуация, когда потеряется символ - невозможна. Точнее это произойдет только в том случае, если прерывания будут запрещены в течение 5742 такта, а это невозможно. Если же это возможно, значит возможны и другие катастрофы.

Если в системе крутится один драйвер UART, то невозможно. Но обычно крутится еще много чего другого безо всяких катастроф.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Dec 20 2007, 19:51
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Если Вы не против, подкину еще одну тему для обсуждения. Есть такое замечательное устройство GSM-модем SIM508. Так вот он при приеме пакета данных сообщает об этом следующим образом "+IPD<размер>:". Есть идея обработки обычных сообщений через обычные прерывания. Т.е. посимвольно. Ибо неизвестно, когда же закончится входящее сообщение. А парсить его на предмет <CR><LF> расточительно. Зато принимать пакеты заранее известной длинны оч. удобно через PDC. Есть вопрос: теоретически возможна ли потеря символов при переключении режимов работы. Что-то я в документации ничего толкового не нашел по этому вопросу...


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 14:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01491 секунд с 7
ELECTRONIX ©2004-2016