Форум программистов, компьютерный форум, киберфорум
Электроника для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/20: Рейтинг темы: голосов - 20, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 06.12.2014
Сообщений: 35
1

воод/вывод FIFO

05.03.2017, 08:19. Показов 4108. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
!здравствуйте уважаемые!
В программировании уже довольно давно.
Задумался по поводу по поводу довольно простенького вопросика.
Кольцевые буфера ввода-вывода. Точнее UART. Еще точнее PIC/AVR.
Самое простое - выводим данные:
Для вывода вызываем функцию и данные для вывода помещаются в буфер.
По прерываниям это данные отправляются куда надо.
Если буфер полн - ждем пока освободится.
Ввод данных посложнее:
Проверяем кол-во принятых данных, и если их нет - продолжаем ждать.
Динные появились - все их вытаскиваем пока не кончились (данные попадают
в буфер посредством механизма прерываний).
И задумался по поводу обработчика прерывания ввода:
Что делать с данными, если буфер полн, и данные некуда складывать?
В AVR можно было просто игнорировать эти данные, и следующие прерывания
нормально генерировались.
PIC вроде требует обязательно считать данные, чтобы запустилась система
прерываний.
И вот вопросик: что делать с этими данными?
a) просто игнорировать?
b) складывать в конец буфера?
ест-но выставлять флаг переполнения.
Кто как обрабатывает такое состояние?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2017, 08:19
Ответы с готовыми решениями:

Спецификация FIFO
Собираюсь подружить FTDI (DLP-USB1232) и контроллер по параллельной шине, но ни как не могу найти...

STM32F4 SPI DMA FIFO. Ошибка FIFO, но передача происходит
Добрый день! Пытаюсь наладить передачу по SPI данных к дисплею с DMA. Передача работает, дисплей...

Организация буфера FIFO
Доброго времени суток Всем! Подскажите пожалуйста, можно ли организовать буфер типа FIFO если...

ПЛИС. Verilog. FIFO
Добрый день! Пишу модуль FIFO с разным тактированием на чтение и запись. Для того, что бы...

9
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2017, 15:22
Помогаю со студенческими работами здесь

Кто разбирался с буфером FIFO ?
LIS331EB (= Sortix0+LIS3DSH )...

Объясните про Dual Clock FIFO
В процессе ковыряния примеров от altera university program, решил не много изменить код модуля для...

Кто работал с FT2232H в режиме синхронного FIFO?
Может, у кого есть примеры какие, на сайте ftdi только комповая часть, а у меня какой-то глюк с...

FIFO буфер UARTa принимает не все входящие байты
Для передачи использую интерфейс UART. Есть входной FIFO глубиной 32. Ставлю уровень заполнения...

Асинхронная передача пакета по UART (пакет больше FIFO) TM4C
Здравствуйте. Плата Tiva C Series TM4C1294 с контроллером: TM4C1294NCPDT. Необходимо управлять...

Асинхронная передача пакета по UART (пакет больше FIFO) TM4C1294
Здравствуйте. Плата Tiva C Series TM4C1294 с контроллером: TM4C1294NCPDT. Необходимо управлять...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru