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

 
 
> кольцевой буфер в модуле ядра, как организовать
Dubov
сообщение Aug 8 2012, 08:51
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



требуется реализоывать следующий драйвер: по внешнему прерыванию считывается 16 байт данных по spi(обязательно с использованием DMA) иданные складываются в кольцевой буфер в самом драйвере. Пользовательское приложение должно раз в 100мс считывать из буфера блок данных, такого размера, чтобы обеспечить "непрерывность" данных в буфере.
При написании руководствуюсь книгой "Linux device drivers 3rd" но никак не пойму как проще реализовать сам буфер и механизм считывания куска данных(не всего буфера, а только данных фиксированного размера, причём с того места где остановились в прошлый раз).
В книге написано что можно сделать так:

char *buf;
buf = kmalloc(BUF_LEN, GFP_DMA);

но как фисать в такой буфер по кольцу(при достижении конца буфера записывать в начало)? и как потом считывать данные не всего буфера целиком, а кусками, запомитная место последнего чтения.

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
cpl
сообщение Aug 8 2012, 20:25
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 6-12-04
Пользователь №: 1 340



Цитата(Dubov @ Aug 8 2012, 11:51) *
требуется реализоывать следующий драйвер: по внешнему прерыванию считывается 16 байт данных по spi(обязательно с использованием DMA) иданные складываются в кольцевой буфер в самом драйвере. Пользовательское приложение должно раз в 100мс считывать из буфера блок данных, такого размера, чтобы обеспечить "непрерывность" данных в буфере.
При написании руководствуюсь книгой "Linux device drivers 3rd" но никак не пойму как проще реализовать сам буфер и механизм считывания куска данных(не всего буфера, а только данных фиксированного размера, причём с того места где остановились в прошлый раз).
В книге написано что можно сделать так:

char *buf;
buf = kmalloc(BUF_LEN, GFP_DMA);

но как фисать в такой буфер по кольцу(при достижении конца буфера записывать в начало)? и как потом считывать данные не всего буфера целиком, а кусками, запомитная место последнего чтения.


Реализуйте внутри драйвера обычный кольцевой буфер в который складывайте все что нужно по прерыванию + дма(размер буфера нужно сразу выбрать с запасом), при чтении из пространства пользователя пусть отдается только фрагмент нужного размера или 0 если нет нечего. Все переменные типа голова-хвост хранятся внутри драйвера.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st August 2025 - 17:41
Рейтинг@Mail.ru


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