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

 
 
> Исходники 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
 
Start new topic
Ответов
aaarrr
сообщение Dec 20 2007, 19:28
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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
Andrey_Sudnov
сообщение Dec 20 2007, 20:31
Сообщение #3


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

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



Цитата(aaarrr @ Dec 21 2007, 00:28) *
и причем здесь прием?

Не помню что там выключается. Я рассматривал исходя из передачи, поэтому так написал. Имел ввиду весь UART. Ведь если при передаче выключается передатчик, то при преме должен выключаться приемник. Ведь так? К тому же передача из произвольных буферов я еще представляю, а прием в произвольные - это как? Вызвали GetData, передав указатель, вернулись, что-то делаем, потом каким-то образом узнаем что данные получены. Ну, буфер заполнен. Новые данные принимать некуда. Надо подставлять новый. А в этот момент бабац, и пресловутое запрещение прерываний. А мы ведь в пользовательском коде, ваще самые некотируемые.
Нее. Так не правильно.
Цитата
Если в системе крутится один драйвер UART, то невозможно. Но обычно крутится еще много чего другого безо всяких катастроф.

Обработчик прерываний не должен выполнять никакой длительной работы работы внутри себя. Это даже по Windows (далеко не реал-тайм) - закон! Если же в программе допускаются такие задержки, то ни при каком способе работы с UART нельзя гарантировать, что не произойдет потери принятого байта. Ведь задержка может произойти между переключениями буферов в пользовательском коде (а такое переключение более длительное, чем метод, используемый у меня).


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

Переключаться между режимами может быть и можно, но не правильно. Думаю, в данном случае надо всегда работать через PDC. После "+IPD<размер>:" есть таймаут или сразу данные идут? В любом случае, настраиваем таймаут (ну там, возможны другие команды, URC), указываем буфер, ждем когда он заполнится (полностью или нет, не важно). По любому парсим начиная с начала. Если нашли "+IPD<размер>:", остальную часть буфера рассматриваем как данные. Три варианта: 1) после данных есть еще строковые ответы, 2) данные кончаются в конце буфера, 3) не все данные влезли в буфер. Во третьем случае указываем еще буфер, но после заполнения помним, что там данные вначале. А потом могут быть строки.
Алгоритм не тривиален. Если его делать влоб - не получиться. Но могу псевдокодом расписать, как делать.

Кстати, что насчет URC? У некоторых телефонов возможны такие фишки:
AT+CMGL=0 (запрос списка новых входящих SMS)
+CMGL: 1,0,,24 (ответ: индекс, статус,,длина)
0791xxxxxxxxxxF1040B919720380422F6 (это PDU - закодированная SMS)
+CMTI: "ME",39 (хопа, пришло URC - уведомление - о новом сообщении)
00006001701041130005C8329BFD06 (продолжение PDU)
Как такое обрабатывать?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
- - Andrey Sudnov   Глянул на исходники PDC от Linux (древние, правда)...   Dec 20 2007, 07:24
|- - aaarrr   Цитата(Andrey Sudnov @ Dec 20 2007, 10:24...   Dec 20 2007, 12:57
|- - Andrey Sudnov   Цитата(aaarrr @ Dec 20 2007, 17:57) А ка...   Dec 20 2007, 18:23
|- - aaarrr   Цитата(Andrey Sudnov @ Dec 20 2007, 21:23...   Dec 20 2007, 18:35
|- - Andrey Sudnov   Цитата(aaarrr @ Dec 20 2007, 23:35) Никак...   Dec 20 2007, 18:49
|- - 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
- - 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


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

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 12:44
Рейтинг@Mail.ru


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