Перейти к содержанию
    

Ring bufer

Для работы с архивами в флеш использую колцевой буфер.

Контроль диапазона индекса буфера реализован на if.

-----------------

Есть решения, где для ограничения выхода за размер буфера

используется операция остатка от деления %

 

Я для работы буфера использую:

- указатель индекса

- кол-во данных в буфере

 

В буфер идет только запись, удалять данные из него не требуется.

 

(?) На сколько лучше-хуже для контроля границы индекса использовать операцию % ?

 

(для размеров буфера, кратных степени 2 можно использовать двоичную маску, это мы знаем. Но размеры заданы и не кратные 2).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

(?) На сколько лучше-хуже для контроля границы индекса использовать операцию % ?

А это имеет значение? :rolleyes: Что вам важно: скорость исполнения кода, размер? Я вообще использую арифметические операции при работе с указателями. Пока на скорость не жалуюсь :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А это имеет значение? :rolleyes: Что вам важно: скорость исполнения кода, размер? Я вообще использую арифметические операции при работе с указателями. Пока на скорость не жалуюсь :rolleyes:

 

Жить ЭТО будет в MSP430, но ни быстродействие ни размер особого значения не имеют.

(в разумных пределах). Хотелось бы уменьшить размер и логику-читабельность исходного текста.

 

Стоит ли мой "ифовый-if" колхоз переделывать на %.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Стоит ли мой "ифовый-if" колхоз переделывать на %.

По-мне так главное вам было понятно, что делает этот код. Во вторую очередь - вашим коллегам (им-то вы сами сможете объяснить, при помощи комментариев))) Ну если вас что-то смущает, поглядите как буфер этот сделан в Boost'е)

У меня сделан шаблоном под произвольный тип данных. Правда в контексте FreeRTOS, что не есть гуд, но работает. Даже на приличной скорости: данные с АЦП ложаться каждые 100 мкс в буфер, и вычитываются оттуда со скорость 8 МБит в SPI. При этом размер данных с АЦП 8 байт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если вас волнует разница между if, % и маской по модулю 2

Посмотрите код ассемблерный (минут 5-10 это занимает) и не стоит разводить бессмысленных обсуждение на 2-3 дня.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

(?) На сколько лучше-хуже для контроля границы индекса использовать операцию % ?

(для размеров буфера, кратных степени 2 можно использовать двоичную маску, это мы знаем. Но размеры заданы и не кратные 2).

Если таких операций - одна-две - то неважно как.

Но как правило операций контроля выхода индекса за пределы массива бывает очень много, тогда всё-же лучше писать оптимально.

Обычно на большинстве embedded-процессоров оптимальнее условный оператор if.

У меня обычно это выглядит так:

#define ncell(m) (sizeof(m) / sizeof((m)[0]))  //кол-во элементов массива m
int ix; //индекс
char buf[N];
if (--ix < 0) ix += ncell(buf);

На Cortex-M с оптимизацией как правило компилится в 3 команды.

На Classic-ARM - может быть всего 2 команды.

Да - как видно - оптимальнее декрементировать индекс. Хотя если хочется можно и в прямом направлении работать, с отрицательными индексами.

Так что даже вариант с размером кратным степени двойки и логическим AND в этом случае может быть не лучше.

Не помню уже как там на MSP430, но лучше можно сделать только на DSP где поддерживается аппаратная циклическая адресация - там вообще 0 команд будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

. . . .

вас что-то смущает, поглядите как буфер этот сделан в Boost'е)

. . . .

Ok. Спасибо.

Если вас волнует разница между if, % . . . .

Посмотрите код ассемблерный . . . .

Так и собираюсь сделать. А может и нет.

тк. Операция целочисленного деления, скорее всего, делается на аппаратном умножителе,

и отличаться от if будет мало, если не быстрее.

Идея вопроса - что логичнее - правилнЕЕ по оптимальности построения алгоритма.

Понятно, что тема - "баян", но меня интересуют просто мнения знатоков (да/нет) а не результат холивара на эту тему :)

Если таких операций - одна-две - то неважно как.

Но как правило операций контроля выхода индекса за пределы массива бывает очень много, тогда всё-же лучше писать оптимально.

. . . .

Не помню уже как там на MSP430, но лучше можно сделать только на DSP где поддерживается аппаратная циклическая адресация - там вообще 0 команд будет.

Спасибо за инф. и пример.

ps - поюзать DSP - моя мечта, как у Шуры Балоганова :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Лично я бы делал if.

В отрыве от предположений об аппаратном множителе и т.д. - операция % дороже сравнения!

 

Вам тут уже подсказали вариант

#define ncell(m) (sizeof(m) / sizeof((m)[0])) //кол-во элементов массива m

int ix; //индекс

char buf[N];

if (--ix < 0) ix += ncell(buf);

Я голосую за него.

 

Так же в плане оптимальности не забывайте, что сравнение с нулем в 90% выгоднее сравнения с любым другим числом.

Об этом даже Александреску в своих лекциях не раз рассказывал. Ибо 0 всегда где-то есть. Либо есть отдельная инструкция для теста на 0 либо в регистре где-то уже есть 0 и компилятор его подсунет в операцию. А любое другое число придется сначала куда-то положить, а потом сравнить. 0 - ваш лучший друг, говорил Александреску и я с ним полностью согласен ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Работаю с буферами через указатель. Для сравнения с границей буфера создаю переменную (даже не переменную, а константу, но она в некий регистр загружается, естественно) buflim, указывающую на конец буфера. Сравниваю указатель с этим пределом. Если указатель вышел за предел, загружаю его снова началом буфера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ps - поюзать DSP - моя мечта, как у Шуры Балоганова :)

Так зачем себе отказывать? Хочется - побалуйте себя. :-)

Отладки с DSP сейчас найти думаю не проблема, какое-то время назад на C5535 (вроде) даже бесплатно раздавали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...