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

 
 
> Логирование данных во внешнюю память.
Jenya7
сообщение Feb 4 2015, 09:25
Сообщение #1


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



мне нужно логировать данные во внешнюю память.
каждая запись это структура. думал сделать circular buffer чтоб можно было читать/писать из разных потоков. вопрос есть ли какая нибудь готовая библиотека чтоб не городить свои велосипеды?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
toweroff
сообщение Feb 4 2015, 13:32
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Jenya7 @ Feb 4 2015, 12:25) *
мне нужно логировать данные во внешнюю память.
каждая запись это структура. думал сделать circular buffer чтоб можно было читать/писать из разных потоков. вопрос есть ли какая нибудь готовая библиотека чтоб не городить свои велосипеды?

что-то типа:
Код
#define    IBUF_LENGTH        (32)
#define    IBUF_MASK        (IBUF_LENGTH-1)

#define    OBUF_LENGTH        (32)
#define    OBUF_MASK        (OBUF_LENGTH-1)

uint32_t ibus_start, ibuf_end, obuf_start, obuf_end;

char    BufOut[OBUF_LENGTH];
char    BufIn[IBUF_LENGTH];

void obuf_init()
{
    obuf_start = obuf_end = 0;
}

void ibuf_init()
{
    ibuf_start = ibuf_end = 0;
}

void put(char c)
{
    while((ibuf_start+IBUF_LENGTH) == ibuf_end);
    BufIn[ibuf_end++ & IBUF_MASK] = c;
}

char get(void)
{
    while(obuf_end == obuf_start);
    return BufOut[obuf_start++ & OBUF_MASK];
}


на скорую руку, так что проверяйте sm.gif

недостаток - размер массивов по степени двойки, тип, разумеется, можно сделать какой нужно
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Feb 4 2015, 14:20
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(toweroff @ Feb 4 2015, 13:32) *
что-то типа:

на скорую руку, так что проверяйте sm.gif

недостаток - размер массивов по степени двойки, тип, разумеется, можно сделать какой нужно


"...иногда лучше молчать, чем говорить" (с)
Топикстартер явно упомянул многопоточность, а тут конструкции, типа "data[obuf_start++ & OBUF_MASK]".
Треды, атомарность, синхронизация.. слышали про такое ?

Можно сделать закат солнца вручную, т.е. написать свою очередь. Это не сложно. Сложно сделать так, чтобы оно работало правильно.
В самом тупом случае берутся примитивы синхронизации, типа мютексов, пишется тупая кольцевая очередь, где PutData() / GetData() обвешаны этими мютексами как новогодние елки.
Тупо, примитивно, не сильно оптимально по быстродействию и требует наличия ОС.

Если ОС нет или нужно выжать производительность, пишется неблокирующая очередь (а потом еще полгода отлаживается). Тут уже в ход идут такие вещи, как intrinsic функции для атомарного инкремента/декремента, реализация CAS, спинлоки и memory barriers если хотим, шоб оно еще не глючило на многоядерных системах..
.. Это один из любимых вопросов на собеседованиях в конторах типа АРМа..

В промежуточном случае пишутся свои мютексы. Но тут опять же надо очень хорошо разбираться в том, что делаешь.

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




Go to the top of the page
 
+Quote Post
Kabdim
сообщение Feb 4 2015, 15:18
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(CrimsonPig @ Feb 4 2015, 17:20) *
Если ОС нет или нужно выжать производительность, пишется неблокирующая очередь (а потом еще полгода отлаживается).

А зачем самому писать, если можно изучить готовые варианты:
http://www.liblfds.org/ - C, вроде как работает на армах из коробки
http://libcds.sourceforge.net/ - C++, придется запилитить свою прокладку для атомарных операций
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 4 2015, 15:30
Сообщение #5


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Kabdim @ Feb 4 2015, 21:18) *
А зачем самому писать, если можно изучить готовые варианты:
http://www.liblfds.org/ - C, вроде как работает на армах из коробки
http://libcds.sourceforge.net/ - C++, придется запилитить свою прокладку для атомарных операций


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

Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jenya7   Логирование данных во внешнюю память.   Feb 4 2015, 09:25
|- - Jenya7   Цитата(toweroff @ Feb 4 2015, 19:32) что-...   Feb 4 2015, 14:14
|- - Kabdim   Цитата(Jenya7 @ Feb 4 2015, 18:30) мда......   Feb 5 2015, 10:53
- - Jenya7   упрощенно, в первом приближении написал так. как ...   Feb 4 2015, 15:15
|- - CrimsonPig   Цитата(Jenya7 @ Feb 4 2015, 15:15) не гор...   Feb 4 2015, 15:43
|- - Jenya7   Цитата(CrimsonPig @ Feb 4 2015, 21:43) То...   Feb 4 2015, 15:47
|- - CrimsonPig   Цитата(Jenya7 @ Feb 4 2015, 15:47) ок. а ...   Feb 4 2015, 15:57
|- - Jenya7   Цитата(CrimsonPig @ Feb 4 2015, 21:57) - ...   Feb 4 2015, 16:07
|- - CrimsonPig   Цитата(Jenya7 @ Feb 4 2015, 16:07) вот я ...   Feb 4 2015, 16:15
|- - Jenya7   Цитата(CrimsonPig @ Feb 4 2015, 22:15) А ...   Feb 4 2015, 16:26
- - WitFed   Я бы порекомендовал от вечных шлюх последнего врем...   Feb 4 2015, 16:26
- - CrimsonPig   Цитата(Jenya7 @ Feb 4 2015, 16:26) да вот...   Feb 4 2015, 16:37
- - Jenya7   Цитата(CrimsonPig @ Feb 4 2015, 22:37) А,...   Feb 4 2015, 16:45


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

 


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


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