Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/126: Рейтинг темы: голосов - 126, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 268

Циклический(кольцевой) буфер.

01.05.2016, 09:46. Показов 25471. Ответов 97
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Понадобилось мне тут...
Для начала, чтобы не изобретать велосипед, долго искал.
В итоге пришлось изобрести. Вроде работает, но... покритикуйте....

<Изображение удалено>

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#define RBUF_INIT(TYPE, LENPOW2 ) volatile struct { \
uint32_t wr; \
uint32_t rd; \
TYPE data[ 1 << (LENPOW2)]; \
}
 
#define RBUF_PUT( RBUF, YMM)  \
{ if((RBUF).rd == (RBUF).wr ) { \
(RBUF).wr = 0; \
(RBUF).rd = 0; \
} \
(RBUF).data[ RBUF_MASK(RBUF) & (RBUF).wr++] = YMM; }
 
#define RBUF_MASK(RBUF) ( sizeof((RBUF).data)/sizeof((RBUF).data[0]) -1)
#define RBUF_NOTEMPTY (RBUF) ((RBUF).rd < (RBUF).wr)
#define RBUF_NOTFULL (RBUF) ((RBUF).wr - (RBUF).rd <= RBUF_MASK(RBUF))
 
#define RBUF_GET( RBUF)  (RBUF).data[ RBUF_MASK(RBUF) & ((RBUF).rd++)];
 
//=========== ПРИМЕР ИСПОЛЬЗОВАНИЯ ========================
 
RBUF_INIT(uint8_t, 5) buf; //байтовый циклический буфер длинной 32
RBUF_INIT(Pack *, 3) packs; //циклический буфер пакетов длинной 8
 
void main(void)
{
if (RBUF_NOTEMPTY(buf)) uint8_t data = RBUF_GET(buf);
 
if (RBUF_NOTFULL(buf))RBUF_PUT(buf, 34);
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.05.2016, 09:46
Ответы с готовыми решениями:

ADSP - Организовать циклический буфер в памяти данных и занести в него данные с инкрементом 1
Есть задание: Организовать цыклический буффер в памьяти данных и занести туду данные с инкрементом 1. Длина буффера: 16. Начальный...

adc-dma Кольцевой буфер для стерео-диктофона с сжатием.
Здравствуйте! Перекладываю свою компьютерную программу на STM32F103RBT6. Хотелось бы сразу пойти в правильном направлении. Сначала...

Кольцевой буфер
Здравствуйте , при реализации кольцевого буфера столкнулся с такой проблемой что , не могу вывести последнюю ячейку буфера 16 в окно,...

97
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 886
01.05.2016, 10:12
Оно конечно не thread safe, но может оно и не надо.
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 268
01.05.2016, 10:14
Оно конечно не thread safe
в каком именно месте? и какие проблемы от этого?

но может оно и не надо.
НАДО!

volatile struct

что то ещё можно сделать? (чтобы и в 8 битниках работало!)
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
01.05.2016, 10:58
В макросы воткнуть синхронизацию, вестимо. Например, через OTOMIC_BLOCK из atomic.h (при этом даже volatile уже не нужен будет).
Но это, конечно, если не делать внешнюю синхронизацию (например, пара notempty/get просится в единый блок)
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 268
01.05.2016, 11:03
OTOMIC_BLOCK из atomic.h
что то ещё можно сделать? (чтобы и в 8 битниках работало!)
notempty/get просится
а как обрабатывать логику если буфер пуст?
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 268
01.05.2016, 11:29
добавил скобочек в RBUF_NOTEMPTY и RBUF_NOTFULL для того, чтобы можно было писать

Code
1
2
3
if(!RBUF_NOTEMPTY(buf)){
 
}
0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
01.05.2016, 11:50
https://github.com/scmrtos/scmrtos/btob ... e/usrlib.h
https://github.com/scmrtos/scmrtos/btob ... usrlib.cpp
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 268
01.05.2016, 11:56
https://github.com/scmrtos/scmrtos/btob ... e/usrlib.h
https://github.com/scmrtos/scmrtos/btob ... usrlib.cpp
что то ещё можно сделать? (чтобы и в 8 битниках работало!)
0
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
01.05.2016, 12:45
1. Оно не компилируется - лишние пробелы и точка с запятой.
2. Оно не работает - при переполнении wr.
3. Thread-safe потом обсудим.
0
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
01.05.2016, 13:17
[QUOTE="shibtym"][QUOTE="Цитата:[/QUOTE]
что то ещё можно сделать? (чтобы и в 8 битниках работало!)
а что, не работает?
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 268
01.05.2016, 13:20
1. Оно не компилируется - лишние пробелы и точка с запятой.
дайка угадаю - компилятор cosmic? в IAR прекрасно компилится.
2. Оно не работает - при переполнении wr.
4 гигабайта непрерывного, интенсивного трафика на приём? мы точно про микроконтроллеры говорим?
3. Thread-safe потом обсудим.
звучит зловеще многообещающе, бум ждать...
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 268
01.05.2016, 13:24
а что, не работает?
возможно и работает, но в моём IAR-e кнопочка скомпилировать С++ с шаблонами серая и не нажимается.... чянд?
0
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
01.05.2016, 13:28
1. gcc
2. Вероятностное программирование?
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 268
01.05.2016, 13:55
Вероятностное программирование?
2% невзлетевших ракет - реальный индустриальный показатель.

да, эта реализация не для тех, кто собрался прокачивать непрерывно 4 гигабайта на 8 битном контроллере.

на более мощных машинках и чрезвычайно интенсивном трафике можно использовать ulong, но по мне - так это излишество.
0
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
01.05.2016, 14:12
Ну тогда рассуждать о многопоточности не имеет смысла - вероятность сбоев небольшая, и так сойдет.
0
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
01.05.2016, 14:49
thread safeм и не пахнет.
Т.е. в прерываниях использовать нельзя.
На 8ми битниках тем более. И 4 гига тут вовсе не причем. Даже на 10 байтах и драйвере, построенном на прерываниях, а не на pottyngе, будет вылет в какой нить аборт.
0
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
01.05.2016, 14:54
Я бы перешёл на указатели. Потому что вот это:
(RBUF).data[ RBUF_MASK(RBUF) & (RBUF).wr++]
вычисляется ну очень долго.
Как-то так:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define RBUF_INIT(TYPE, LENPOW2 ) volatile struct { \
TYPE data[ 1 << (LENPOW2)]; \
TYPE *wr = data; \
TYPE *rd = data; \
}
 
#define RBUF_PUT( RBUF, YMM)  \
{ if((RBUF).rd == (RBUF).wr ) { \
(RBUF).wr = data; \
(RBUF).rd = data; \
} \
*(RBUF).data = YMM;  \
(RBUF).data++;}
 
#define RBUF_NOTEMPTY (RBUF) ((RBUF).rd < (RBUF).wr)
#define RBUF_NOTFULL (RBUF) ((RBUF).wr <  &(RBUF).data [1 << (LENPOW2)])
 
#define RBUF_GET( RBUF, DATA)  {(RBUF).rd++); \
DATA = *(RBUF).data; }
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
01.05.2016, 14:56
[QUOTE="shibtym"][QUOTE="Цитата:[/QUOTE]
notempty/get просится
а как обрабатывать логику если буфер пуст?
Я имел в виду в самом кольцевом буфере "thread safety" не делать, а все обращения к нему убирать в OTOMIC_BLOCK там, где они используются. Причём вызов "isempty" с последующим "get" - в один блок.
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 268
01.05.2016, 15:28
нету в STM8, например, OTOMIC_BLOCK. совсем. есть только отменить прерывания,чёта сделать, и возобновить. всё.

но мне это кажется ещё хуже. ибо летят данные....

на эту тему... http://we.iosyitistromyss.ru/S... a-arm.html как я и сказал.

В любом случае спасибо. Это полезное примечание.
0
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
01.05.2016, 15:32
Цитата Сообщение от SOVO
Я бы перешёл на указатели. Потому что вот это:
(RBUF).data[ RBUF_MASK(RBUF) & (RBUF).wr++]
вычисляется ну очень долго.
Как-то так:
И потерять при этом цикличность буфера.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.05.2016, 15:32
Помогаю со студенческими работами здесь

Кольцевой буфер
Здравствуйте, уважаемые пользователи. Мне поставили задачу, которую я один решить не могу и поэтому обращаюсь за помощью к вам. Итак, у...

Кольцевой буфер
Всем привет, в общем задача такая, писать в кольцевой буфер значения с Line edit, вроде как пишет но не считывает норм, если пишу одно и...

Кольцевой буфер на WinApi
Всем привет! Ребята, может у кого есть пример любой хотя бы простенькой программы, чтоб был реализован кольцевой буфер на WinApi. Всё...

Кольцевой буфер(Кольцевая очередь)
Задали написать на Java кольцевой буффер. Только вот толкового описания строения и механизма работы этой структуры данных я никак не смог...

Циклический список (кольцевой)
Здравствуйте! Помогите пожалуйста!! нужно создать циклический список(кольцевой) фиксированного объема. Не могу понять что не так,и почему...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru