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

 
 
5 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Кольцевой буфер не успевает себя сдвигать до прихода нового байта.., Помогите найти решение.
barabek
сообщение Nov 11 2011, 05:53
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(demiurg_spb @ Nov 11 2011, 15:05) *
У вас идеология неверная. Уарт заполняет фифо и только.
Фоновая программа выгребает фифо и парсит фреймы. В таком варианте будет достаточным иметь размер фифо байт на 16-64..
А парсер фреймов (собственно протокол) может иметь свой буфер на максимальный размер пакета.
Как-то так обычно делается.
Благодаря чему выполняется парадигма минимизации времени обработки прерываний...
Более того некоторые протоколы регламентируют максимальный размер фифо канала связи. Так например modbus имеет пожелания на размер фифо в 32 байта...


А если пример с NMEA? Там остановить передачу нельзя. В этом случае нужно иметь буфер на максимальную посылку. Ну а как обрабатывать - уже выше описали.




Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 11 2011, 06:18
Сообщение #17


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(barabek @ Nov 11 2011, 08:53) *
А если пример с NMEA?
Тем более.
В 90% случаев цикл основной программы отрабатывается быстрее чем несколько мс. Только исходя из этого и выбирается размер фифо (чтобы не переполнился за эти пару мс).
Например на скорости 115200 один байт передаётся за ~90мкс, а цикл фоновой программы 2мс.
Следовательно минимальный размер фифо будет 2000мкс/90мкс = 22 байта. Округлим до ближайшего кратного 2 и получим 32.
ЧИТД. Вот такая простая арифметика.

А то, что вам написали (ловить старт-стоп) нужно делать в фоновой программе (в модуле протокола NMEA например медленно и печально искать пакеты и сверять crc) а не в ISR уарта.
Тем самым вы рассекаете на независимые логические модули свою программу.
Я вам дельный совет даю - прислушайтесь.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Flexz
сообщение Nov 11 2011, 06:25
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



При желании разбирать входные данные можно вообще безо всяких буферов, исключительно на конечных автоматах. Объем кода получится приличный, зато без затрат памяти и быстро - можно отрабатывать не выходя из прерывания.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 11 2011, 06:35
Сообщение #19


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Flexz @ Nov 11 2011, 09:25) *
При желании разбирать входные данные можно вообще безо всяких буферов, исключительно на конечных автоматах. Объем кода получится приличный, зато без затрат памяти и быстро - можно отрабатывать не выходя из прерывания.
Дилетантский подход в подавляющем большинстве случаев, ИМХО.
Долго сидеть в прерывании - зло.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Flexz
сообщение Nov 11 2011, 06:52
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Все относительно и ситуационно.
Дилетантский подход в подавляющем большинстве случае - это возводить в абсолют время сидения в прерывании, ИМХО sm.gif
Часто минимизировать нужно именно время реакции системы, а перекладывание из буфера в буфер скорости не добавит.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Nov 11 2011, 07:47
Сообщение #21


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Для простых программ (относительно простых), с крайне малым числом конкурирующих процессов можно вообще всю программу запихать в прерывание. И в этом нет никакого зла.

Но такой подход плох только одним. Появляется привычка. И в следующих, настоящих сложных проектах не будет опыта распределять нагрузку, работать с буферами и прочим.

В данном же случае, очевидно, что NMEA не имеет никакой возможности загрузить контроллер до упора. Посему можно создавать кучу буферов и сделать программу более понятной для самого себя. Как бэ потренироваться в создании уровней обработки. На простом примере. Ибо также очевидно, что если чел не знаком с кольцевыми буферами, то ему самое время начать тренировки...

Времена, когда на IBM PC экономили память и оптимизировали код ассемблером канули в вечность.

Времена, когда нечего экономить и в микроконтроллерах - уже наступили. Только еще не все в курсе...


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Nov 11 2011, 08:11
Сообщение #22


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(Flexz @ Nov 11 2011, 10:52) *
Все относительно и ситуационно.
Дилетантский подход в подавляющем большинстве случае - это возводить в абсолют время сидения в прерывании, ИМХО sm.gif
Часто минимизировать нужно именно время реакции системы, а перекладывание из буфера в буфер скорости не добавит.


А собственно чего сидеть в прерывании USART, что Вам это даст ? У него самая тупая задача , принял (запихнул в буфер) - передал. На это он и расчитан.
Другую Вы ему даже предложить не сможете.
В лучшем случае в прерывании одна команда - вон туда положить. Никаких предворительных ласк делать не надо , как в случае - ВСЁ обрабатывать в прерывании (запихивать в стек регистры ,SREG и прочее, прочее, тратя на эту хрень время) . Вышли и всё остальное время можете тратить на разбор "полётов" .


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 11 2011, 08:29
Сообщение #23


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Flexz @ Nov 11 2011, 09:52) *
Часто минимизировать нужно именно время реакции системы, а перекладывание из буфера в буфер скорости не добавит.
Оценим на пальцах ДОБАВОЧНУЮ латентность, возникающую при использовании фифо.
Максимум один цикл основной программы в случае ТУПОГО суперлупа, а при использовании планировщика или чуть более внятного суперлупа много меньше.
Большая задержка? С Вас примеры где это действительно важно...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Nov 11 2011, 09:19
Сообщение #24


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Автору уже советовали конечный автомат - так как он
Цитата
На флажках это дело решать муторно.

упёрся в сложность программы. Если он перенесёт "работу с флажками" во внешнюю (по отношению к прерыванию) программы - не поможет...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 11 2011, 09:24
Сообщение #25


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(DpInRock @ Nov 11 2011, 10:47) *
Но такой подход плох только одним. Появляется привычка. И в следующих, настоящих сложных проектах не будет опыта распределять нагрузку, работать с буферами и прочим.

Как это? Все равно ведь работа по прерываниям получше, чем по триггерам и использует ресурсы идеально.
Go to the top of the page
 
+Quote Post
Flexz
сообщение Nov 11 2011, 09:47
Сообщение #26


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Цитата(demiurg_spb @ Nov 11 2011, 11:29) *
Оценим на пальцах ДОБАВОЧНУЮ латентность, возникающую при использовании фифо.
Максимум один цикл основной программы в случае ТУПОГО суперлупа, а при использовании планировщика или чуть более внятного суперлупа много меньше.
Большая задержка? С Вас примеры где это действительно важно...

что, как других дилетантами обзывать так запросто, а как вас, так и обиделись? sm.gif
Примеры, да пожалуста:
1. Принимаем команды по наложению OSD, шина RS485 абонентов много, при получении команды не позже чем через нцать мкс (точное число ен помню больше 100 но меньше 500) следует отправить подтверждение приема. Других задач не выполняем. Формирование картинки работает не быстро - суперлуп длинный. Ну и? ради великой самоцели "малосидения в прерывании" делать еще и планировщик с тиком 100мкс?
2. Резервное устройство на батарейном питании, по команде дергаем клапан. Тут ключевой момент даже не время реакции, а потребление, проц работает ТОЛЬКО в прерывании, остальное время дрыхнет, вынос обработки в суперлуп увеличит потребление на величину отличную от нуля.
Реальные примеры из практики, а не тупые суперлупы в вакууме.

PS продолжим холивар или дадим ТСу решать свою задачу?
Go to the top of the page
 
+Quote Post
Demeny
сообщение Nov 11 2011, 10:03
Сообщение #27


Знающий
****

Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237



Цитата(demiurg_spb @ Nov 10 2011, 13:40) *
Размер кольцевого буфера лучше иметь кратным степени 2...

А можно пояснить подробнее - в чём преимущество кольцевого буфера с размером, кратным степени 2 ?


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
Nixon
сообщение Nov 11 2011, 10:07
Сообщение #28


Гуру
******

Группа: Админы
Сообщений: 2 736
Регистрация: 17-06-04
Из: Киев
Пользователь №: 48



Проще закруглять. Одной командой &.


--------------------
Вам помочь или не мешать?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 11 2011, 10:12
Сообщение #29


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Flexz @ Nov 11 2011, 12:47) *
что, как других дилетантами обзывать так запросто, а как вас, так и обиделись? sm.gif
Вовсе нет. Вас лично я и не пытался задеть.
Цитата
PS продолжим холивар или дадим ТСу решать свою задачу?
Можем продолжить.
1. У ТС протокол без жёских временных ограничений (и таких протоколов несоизмеримо больше).
2. Кто мешает поставить команду sleep в тело суперлупа и просыпаться по тем же прерываниям уарта?

Цитата(Nixon @ Nov 11 2011, 13:07) *
Проще закруглять. Одной командой &.
Или % что современные компиляторы хорошо оптимизируют.
Код
#define FIFO_SIZE 32
i = (i+1) % FIFO_SIZE; // никремент индекса fifo
что будет эквивалентно
Код
i = (i+1) & (FIFO_SIZE-1); // никремент индекса fifo
в случае когда FIFO_SIZE кратно степени 2.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Nov 11 2011, 10:15
Сообщение #30


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

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Обрабатываю NMEA. Сделал следующим образом:
В памяти программ создал таблицу с адресами 25 подпрограмм (из них 16 уникальных), каждая из которых занимается отлавливанием определенного символа или сохранением данных. В прерывании UART запускаем одну из этих подпрограмм по маркеру, который инкрементируется при успешном выполнении подпрограммы, тем самым указывая, что в следующий раз надо будет выполнить другую подпрограмму. Если подпрограмма возвращает ложь, то маркер сбрасывается и в следующий раз будем начинать все сначала.
В итоге SRAM - 2 байта (один маркер, другой счетчик символов при сохранении данных), и скорость максимальная. =)

Сообщение отредактировал Alt.F4 - Nov 11 2011, 10:17
Go to the top of the page
 
+Quote Post

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

 


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


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