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

 
 
> кольцевой буфер в модуле ядра, как организовать
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
Dubov
сообщение Aug 9 2012, 08:15
Сообщение #3


Местный
***

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



Цитата(cpl @ Aug 8 2012, 23:25) *
Реализуйте внутри драйвера обычный кольцевой буфер в который складывайте все что нужно по прерыванию + дма(размер буфера нужно сразу выбрать с запасом), при чтении из пространства пользователя пусть отдается только фрагмент нужного размера или 0 если нет нечего. Все переменные типа голова-хвост хранятся внутри драйвера.

спасибо за ответ. получается нужно просто объявить массив? а как сделать так чтобы именно по DMA складывались данные? посмотреть бы код как это сделать, должно быть несколько строк наверное, но нехнаю как. пока не знаю нужно ли каким то особенным способом объявлять массив, нужно ли выделять память специально с определёнными флагами(для DMA)?
Go to the top of the page
 
+Quote Post
cpl
сообщение Aug 11 2012, 03:17
Сообщение #4


Местный
***

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



Цитата(Dubov @ Aug 9 2012, 11:15) *
спасибо за ответ. получается нужно просто объявить массив?
а как сделать так чтобы именно по DMA складывались данные?
посмотреть бы код как это сделать, должно быть несколько строк наверное, но нехнаю как. пока не знаю нужно ли каким то особенным способом объявлять массив, нужно ли выделять память специально с определёнными флагами(для DMA)?


можно некто не запрещает, хотите статический хотите динамический как больше нравиться,
также как и без дма с той лишь разницей что после приема каждого пакета необходимо указатель дма (куда помещать данные) изменять,
все зависит от дма они бывают разные,
для чего флаги и что они дадут ?
biggrin.gif
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Aug 12 2012, 08:13
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



Цитата(cpl @ Aug 11 2012, 07:17) *
для чего флаги и что они дадут ?
biggrin.gif

__GFP_DMA - это флаг запрашивает, чтобы выделение блока памяти произошло в DMA совместимой зоне памяти(Linux device drivers 3rd edition).

Сообщение отредактировал TigerSHARC - Aug 12 2012, 08:14
Go to the top of the page
 
+Quote Post
cpl
сообщение Aug 12 2012, 20:09
Сообщение #6


Местный
***

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



Цитата(TigerSHARC @ Aug 12 2012, 11:13) *
__GFP_DMA - это флаг запрашивает, чтобы выделение блока памяти произошло в DMA совместимой зоне памяти(Linux device drivers 3rd edition).

Спасибо понял, интересное ограничение получается.
rolleyes.gif
Go to the top of the page
 
+Quote Post



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

 


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


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