0 / 0 / 0
Регистрация: 06.12.2014
Сообщений: 35
|
|
1 | |
воод/вывод FIFO05.03.2017, 08:19. Показов 4108. Ответов 9
Метки нет (Все метки)
!здравствуйте уважаемые!
В программировании уже довольно давно. Задумался по поводу по поводу довольно простенького вопросика. Кольцевые буфера ввода-вывода. Точнее UART. Еще точнее PIC/AVR. Самое простое - выводим данные: Для вывода вызываем функцию и данные для вывода помещаются в буфер. По прерываниям это данные отправляются куда надо. Если буфер полн - ждем пока освободится. Ввод данных посложнее: Проверяем кол-во принятых данных, и если их нет - продолжаем ждать. Динные появились - все их вытаскиваем пока не кончились (данные попадают в буфер посредством механизма прерываний). И задумался по поводу обработчика прерывания ввода: Что делать с данными, если буфер полн, и данные некуда складывать? В AVR можно было просто игнорировать эти данные, и следующие прерывания нормально генерировались. PIC вроде требует обязательно считать данные, чтобы запустилась система прерываний. И вот вопросик: что делать с этими данными? a) просто игнорировать? b) складывать в конец буфера? ест-но выставлять флаг переполнения. Кто как обрабатывает такое состояние?
0
|
05.03.2017, 08:19 | |
Ответы с готовыми решениями:
9
Спецификация FIFO STM32F4 SPI DMA FIFO. Ошибка FIFO, но передача происходит Организация буфера FIFO ПЛИС. Verilog. FIFO |
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
|
|
05.03.2017, 08:31 | 2 |
ЮАРТ для МК - очень медленный интерфейс. Чем занят ваш контроллер, что не успевает обработать проходящие данные?
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
|
|
05.03.2017, 08:44 | 3 |
Нет места - значит, данные теряются. Точка.
Единственное - можно заранее (когда в буфере мало места) просигналить другой стороне, чтобы заткнулась - см. flow control.
0
|
0 / 0 / 0
Регистрация: 06.12.2014
Сообщений: 35
|
|
05.03.2017, 09:02 | 4 |
Для просигналить - сейчас ножек просто нет. На будущее совмещу со светиком.
В основном вопрос, куда девать данные - выбрасывать или складывать в конец? Потеря данных не критична.
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
|
|
05.03.2017, 09:15 | 5 |
Выбрасывать - складывать-то некуда.
Для просигналить лишние ножки не обязательны - см. software flow control (норм, если у вас чисто текстовый протокол).
0
|
0 / 0 / 0
Регистрация: 06.12.2014
Сообщений: 35
|
|
05.03.2017, 12:30 | 6 |
Модифицировал обработчик прерываний.
Сейчас данные ВСЕГДА складываются в конец буфера, а потом проверяется - можно/нельзя было этого делать. Правда флагов переполнения не выставляю. Да они мне и не нужны. Все из-за того, что в PIC для возобновления прерываний обязательно нужно прочитать данные. Удалось сэкономить целй байт программной памяти... если интересен код - могу выложить... Для software flow control памяти и так в обрез - уже лишних более 100 байт...
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
|
|
05.03.2017, 12:36 | 7 |
Так делать нельзя. Теряется монотонность событий. Надо ИЛИ останавливать прием ИЛИ его продолжать. Первый вариант лучше.
Разрывы обмена очень плохо воспринимаются, особенно для текстового вывода. Какой смысл в наличии 1 байта из какого-то другого сообщения в конце буфера? При последующем вычитывании этот _неправильный_ байт будет восприниматься как "нормальный" в конце сообщения, что приведет к неверному анализу сообщения.
0
|
0 / 0 / 0
Регистрация: 28.10.2010
Сообщений: 893
|
|
05.03.2017, 13:17 | 8 |
Буфер это информация, ее ценность не может знать посторонний человек
u37 правильно написал, новые данные могут испортить всё Если для возобновления прерываний нужно читать, то не обязательно писать прочитанное в буфер Есть данные, которые нужно писать только группами, не помещается группа - нужно решать, стереть самые старые или пожертвовать новыми. Мы этого не знаем, что важнее.
0
|
0 / 0 / 0
Регистрация: 06.12.2014
Сообщений: 35
|
|
05.03.2017, 13:59 | 9 |
А кто как обрабатывает ошибки железного UART, такие как ошибка формата и переполнение?
0
|
0 / 0 / 0
Регистрация: 21.08.2011
Сообщений: 1,057
|
|
05.03.2017, 15:22 | 10 |
Первый вопрос: это происходит в ОСРВ или без нее? Если есть ОСРВ, есть смысл использовать штатные средства межпроцессовой коммуникации: мьютексы, семафоры, очереди сообщений итд.
Если же без ОСРВ, то есть разные техники. Флаг "Очередь полна" и проверка флага перед записью в фифо. Функция записи в буфер, мгновенно возвращающая ошибку если попытаться записать больше данных чем есть в буфере. Например, функция UARTwritebuf(&UART_Ptr, *char), которая возвращает число байт, "не влезших" в буфер. Если всё влезло тогда 0, ошибки нет. Ошибки аппаратного UART надо обрабатывать внутри функций работы с портом - например не очищать буфер пока нет подтверждения успешной отправки или таймаута без ошибок. С автоматическим повторением сообщения после. Но лучше всего это грамотный протокол поверх всего этого. Что-то типа zModem если надо блоки данных или Modbus если надо короткие сообщения.
0
|
05.03.2017, 15:22 | |
05.03.2017, 15:22 | |
Помогаю со студенческими работами здесь
10
Кто разбирался с буфером FIFO ? Объясните про Dual Clock FIFO Кто работал с FT2232H в режиме синхронного FIFO? FIFO буфер UARTa принимает не все входящие байты Асинхронная передача пакета по UART (пакет больше FIFO) TM4C Асинхронная передача пакета по UART (пакет больше FIFO) TM4C1294 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |