Доброго, всем, времени суток!
Написал модуль ядра(2.6.8 Debian Sarge) работающий с ISA карточкой, предназначенной для обработки сигналов. В модуле, из порта платы читается массив данных размером 0,5 Мб за время ~ 600 мс.
---------------
for(i=0; i < dataSize; i++)
{
t = inw(DATA_PORT);
put_user(t, buffAddr++);}
---------------
С драйвером взаимодействует KDE'шное приложение (осциллограф-спектроанализатор и т.д.) которое посредством ioctl(...) собственно и вызывает команду чтения. При выполнении вышеприведенного цикла наблюдается дикие тормоза системы, что очень нехорошо смотрится при циклическом вызове команды. Загрузка процессора почти max. Выделение вызова ioctl(...) в отдельный поток в приложении естественно не помогает.
Вопрос: каким образом избавиться от высокой загрузки процессора в модуле, не сильно выходя за пределы тех же 600 мс? Может быть как-то изменить алгоритм чтения из порта?
Заранее благодарен за конструктивные приложения...
>Доброго, всем, времени суток!
>Написал модуль ядра(2.6.8 Debian Sarge) работающий с ISA карточкой, предназначенной для обработки
>сигналов. В модуле, из порта платы читается массив данных размером 0,5
>Мб за время ~ 600 мс.
>---------------
>for(i=0; i < dataSize; i++)
>{
> t = inw(DATA_PORT);
> put_user(t, buffAddr++);
>
>}
>---------------
> С драйвером взаимодействует KDE'шное приложение (осциллограф-спектроанализатор и т.д.) которое посредством ioctl(...)
>собственно и вызывает команду чтения. При выполнении вышеприведенного цикла наблюдается дикие
>тормоза системы, что очень нехорошо смотрится при циклическом вызове команды. Загрузка
>процессора почти max. Выделение вызова ioctl(...) в отдельный поток в приложении
>естественно не помогает.железко DMA не умеет?
>Вопрос: каким образом избавиться от высокой загрузки процессора в модуле, не сильно
>выходя за пределы тех же 600 мс? Может быть как-то изменить
>алгоритм чтения из порта?
>Заранее благодарен за конструктивные приложения...
переключение из режима ядра в режим процесса и обратно - очень дорогостоящая операция. Передача в userspace по одному байту хотя и не является таковым, но имеет много общего.Что можно предложить из конструктива:
- гораздо лучше было бы воспользоваться функцией copy_to_user, чем put_user;
- прежде, чем выдавать пользователю данные, их сперва лучше накопить. В этом смысле insw больше подходит, чем inw;смотри также про inw_p(9):
http://cdrom.gnutemberg.org/manuali/ldd/LinuxDeviceDrivers.pdf
страница 232 секция Pausing I/O
Спасибо. Попробую в понедельник (железка на работе). Кстати, воткнул в цикл schdule_timeout(1) - мыша в X'ах перестала замирать.
>железко DMA не умеет?
Нет. DMA к сожалению не умеет.