|
|
  |
Кольцевой буфер не успевает себя сдвигать до прихода нового байта.., Помогите найти решение. |
|
|
|
Nov 11 2011, 06:18
|

неотягощённый злом
     
Группа: Свой
Сообщений: 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 уарта. Тем самым вы рассекаете на независимые логические модули свою программу. Я вам дельный совет даю - прислушайтесь.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Nov 11 2011, 06:52
|
Местный
  
Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797

|
Все относительно и ситуационно. Дилетантский подход в подавляющем большинстве случае - это возводить в абсолют время сидения в прерывании, ИМХО Часто минимизировать нужно именно время реакции системы, а перекладывание из буфера в буфер скорости не добавит.
|
|
|
|
|
Nov 11 2011, 07:47
|

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

|
Для простых программ (относительно простых), с крайне малым числом конкурирующих процессов можно вообще всю программу запихать в прерывание. И в этом нет никакого зла.
Но такой подход плох только одним. Появляется привычка. И в следующих, настоящих сложных проектах не будет опыта распределять нагрузку, работать с буферами и прочим.
В данном же случае, очевидно, что NMEA не имеет никакой возможности загрузить контроллер до упора. Посему можно создавать кучу буферов и сделать программу более понятной для самого себя. Как бэ потренироваться в создании уровней обработки. На простом примере. Ибо также очевидно, что если чел не знаком с кольцевыми буферами, то ему самое время начать тренировки...
Времена, когда на IBM PC экономили память и оптимизировали код ассемблером канули в вечность.
Времена, когда нечего экономить и в микроконтроллерах - уже наступили. Только еще не все в курсе...
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Nov 11 2011, 08:11
|

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

|
Цитата(Flexz @ Nov 11 2011, 10:52)  Все относительно и ситуационно. Дилетантский подход в подавляющем большинстве случае - это возводить в абсолют время сидения в прерывании, ИМХО Часто минимизировать нужно именно время реакции системы, а перекладывание из буфера в буфер скорости не добавит. А собственно чего сидеть в прерывании USART, что Вам это даст ? У него самая тупая задача , принял (запихнул в буфер) - передал. На это он и расчитан. Другую Вы ему даже предложить не сможете. В лучшем случае в прерывании одна команда - вон туда положить. Никаких предворительных ласк делать не надо , как в случае - ВСЁ обрабатывать в прерывании (запихивать в стек регистры ,SREG и прочее, прочее, тратя на эту хрень время) . Вышли и всё остальное время можете тратить на разбор "полётов" .
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Nov 11 2011, 08:29
|

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

|
Цитата(Flexz @ Nov 11 2011, 09:52)  Часто минимизировать нужно именно время реакции системы, а перекладывание из буфера в буфер скорости не добавит. Оценим на пальцах ДОБАВОЧНУЮ латентность, возникающую при использовании фифо. Максимум один цикл основной программы в случае ТУПОГО суперлупа, а при использовании планировщика или чуть более внятного суперлупа много меньше. Большая задержка? С Вас примеры где это действительно важно...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Nov 11 2011, 09:47
|
Местный
  
Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797

|
Цитата(demiurg_spb @ Nov 11 2011, 11:29)  Оценим на пальцах ДОБАВОЧНУЮ латентность, возникающую при использовании фифо. Максимум один цикл основной программы в случае ТУПОГО суперлупа, а при использовании планировщика или чуть более внятного суперлупа много меньше. Большая задержка? С Вас примеры где это действительно важно... что, как других дилетантами обзывать так запросто, а как вас, так и обиделись?  Примеры, да пожалуста: 1. Принимаем команды по наложению OSD, шина RS485 абонентов много, при получении команды не позже чем через нцать мкс (точное число ен помню больше 100 но меньше 500) следует отправить подтверждение приема. Других задач не выполняем. Формирование картинки работает не быстро - суперлуп длинный. Ну и? ради великой самоцели "малосидения в прерывании" делать еще и планировщик с тиком 100мкс? 2. Резервное устройство на батарейном питании, по команде дергаем клапан. Тут ключевой момент даже не время реакции, а потребление, проц работает ТОЛЬКО в прерывании, остальное время дрыхнет, вынос обработки в суперлуп увеличит потребление на величину отличную от нуля. Реальные примеры из практики, а не тупые суперлупы в вакууме. PS продолжим холивар или дадим ТСу решать свою задачу?
|
|
|
|
|
Nov 11 2011, 10:12
|

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

|
Цитата(Flexz @ Nov 11 2011, 12:47)  что, как других дилетантами обзывать так запросто, а как вас, так и обиделись?  Вовсе нет. Вас лично я и не пытался задеть. Цитата 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.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|