|
кольцевой буфер в модуле ядра, как организовать |
|
|
|
 |
Ответов
|
Aug 8 2012, 20:25
|
Местный
  
Группа: Свой
Сообщений: 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 если нет нечего. Все переменные типа голова-хвост хранятся внутри драйвера.
|
|
|
|
|
Aug 9 2012, 08:15
|
Местный
  
Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052

|
Цитата(cpl @ Aug 8 2012, 23:25)  Реализуйте внутри драйвера обычный кольцевой буфер в который складывайте все что нужно по прерыванию + дма(размер буфера нужно сразу выбрать с запасом), при чтении из пространства пользователя пусть отдается только фрагмент нужного размера или 0 если нет нечего. Все переменные типа голова-хвост хранятся внутри драйвера. спасибо за ответ. получается нужно просто объявить массив? а как сделать так чтобы именно по DMA складывались данные? посмотреть бы код как это сделать, должно быть несколько строк наверное, но нехнаю как. пока не знаю нужно ли каким то особенным способом объявлять массив, нужно ли выделять память специально с определёнными флагами(для DMA)?
|
|
|
|
|
Aug 11 2012, 03:17
|
Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 6-12-04
Пользователь №: 1 340

|
Цитата(Dubov @ Aug 9 2012, 11:15)  спасибо за ответ. получается нужно просто объявить массив? а как сделать так чтобы именно по DMA складывались данные? посмотреть бы код как это сделать, должно быть несколько строк наверное, но нехнаю как. пока не знаю нужно ли каким то особенным способом объявлять массив, нужно ли выделять память специально с определёнными флагами(для DMA)? можно некто не запрещает, хотите статический хотите динамический как больше нравиться, также как и без дма с той лишь разницей что после приема каждого пакета необходимо указатель дма (куда помещать данные) изменять, все зависит от дма они бывают разные, для чего флаги и что они дадут ?
|
|
|
|
|
Aug 11 2012, 19:49
|
Местный
  
Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052

|
Цитата(cpl @ Aug 11 2012, 07:17)  можно некто не запрещает, хотите статический хотите динамический как больше нравиться, также как и без дма с той лишь разницей что после приема каждого пакета необходимо указатель дма (куда помещать данные) изменять, все зависит от дма они бывают разные, для чего флаги и что они дадут ?  так вот я и хочу понять как работать с DMA. есть примеры? если принимать данные по SPI, нужно SPI соответсвующе настроить? и что нужно сделать ещё, если сравнивать с обычной записью(не DMA). А флаги, пример я привёл выше, нужны для того чтобы kmalloc выделила память в области DMA.
Сообщение отредактировал Dubov - Aug 11 2012, 19:50
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|