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

 
 
> Ring bufer, критерии выбора реализации
k155la3
сообщение Jan 24 2017, 14:54
Сообщение #1


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Для работы с архивами в флеш использую колцевой буфер.
Контроль диапазона индекса буфера реализован на if.
-----------------
Есть решения, где для ограничения выхода за размер буфера
используется операция остатка от деления %

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

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

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

(для размеров буфера, кратных степени 2 можно использовать двоичную маску, это мы знаем. Но размеры заданы и не кратные 2).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jcxz
сообщение Jan 24 2017, 16:20
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(k155la3 @ Jan 24 2017, 17:54) *
(?) На сколько лучше-хуже для контроля границы индекса использовать операцию % ?
(для размеров буфера, кратных степени 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 команд будет.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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