|
Частота прерываний под Linux'ом, реально достижимая |
|
|
|
 |
Ответов
|
Aug 11 2012, 23:13
|

Практикующий маг
     
Группа: Свой
Сообщений: 3 634
Регистрация: 28-04-05
Из: Дубна, Моск.обл
Пользователь №: 4 576

|
Цитата(TigerSHARC @ Aug 11 2012, 16:43)  Господа, я надеюсь действующая полемика не относится к kernel space. Мне нужно писать драйвер АЦП и обрабатывать аппаратные прерывания с частотой в 100кГц. Но всё это на уровне ядра (в модуле ядра). Думаю такое возможно, а иначе как работают действующие драйверы АЦП? Тогда возникает вопрос для ТС: почему бы обработку прерываний не вынести в модуль ядра?
P.S. Возможно я чего-то не понимаю. Если Вы про платы сбора данных типа NI то скорей всего там с АЦП работает ПЛИСина, которая является также буфером, тогда требования для процессора и ОС в основном касаются пропускной способности шины, задержки на реакцию уже не так важны. То что касается Вашего вопроса ко мне, то тут все проще -никаких ядер у меня нет и ничего встраивать не нужно. Все обрабатывается обычным прерыванием, даже не стал заморачиваться с FIQ. Быстродействия хватает с лихвой. Я не понимаю почему нельзя сделать простой обработчик прерываний в ОС, который бы работал так как и задумано для прерывания- прерывал текущую задачу, отрабатывал и потом возвращался к прерванной задаче с минимальными издержками. Я думаю Вам однозначно надо предусмотреть буфер на PLD или какомто малоногом контроллере, который будет заниматься лишь сбором данных с АЦП. Обмен между процами можно сделать по SDIO через DMA. Это у меня был как один из запасных вариантов. Либо еще вариант -настроить проц на считывание АЦП через ДМА, используя 2 канала ДМА в режиме качелей. Но тут надо досконально знать железо и его особенности.
|
|
|
|
|
Aug 12 2012, 07:03
|
Знающий
   
Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195

|
Цитата(Alexashka @ Aug 12 2012, 03:13)  Если Вы про платы сбора данных типа NI то скорей всего там с АЦП работает ПЛИСина, которая является также буфером, тогда требования для процессора и ОС в основном касаются пропускной способности шины, задержки на реакцию уже не так важны. То что касается Вашего вопроса ко мне, то тут все проще -никаких ядер у меня нет и ничего встраивать не нужно. Все обрабатывается обычным прерыванием, даже не стал заморачиваться с FIQ. Быстродействия хватает с лихвой. Я не понимаю почему нельзя сделать простой обработчик прерываний в ОС, который бы работал так как и задумано для прерывания- прерывал текущую задачу, отрабатывал и потом возвращался к прерванной задаче с минимальными издержками. Я думаю Вам однозначно надо предусмотреть буфер на PLD или какомто малоногом контроллере, который будет заниматься лишь сбором данных с АЦП. Обмен между процами можно сделать по SDIO через DMA. Это у меня был как один из запасных вариантов. Либо еще вариант -настроить проц на считывание АЦП через ДМА, используя 2 канала ДМА в режиме качелей. Но тут надо досконально знать железо и его особенности. Зачем буфер на PLD? если можно кольцевой буфер сделать в самом драйвере. В драйвере же считывать через DMA по SPI данные с АЦП.
|
|
|
|
|
Aug 13 2012, 19:36
|
Знающий
   
Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195

|
Цитата(aaarrr @ Aug 13 2012, 10:27)  Сотни кГц? Я бы очень сильно напрягся, если бы приходилось дергать систему с частотой 10кГц, а уж о сотнях не стал бы и думать - это просто похоронить производительность на оверхеде от прерываний. можно по-подробнее? Просто в исходниках ядра полно драйверов различных АЦП. И разработчики из технической поддержки AD охотно давали советы, когда я спрашивал про тактирование и приём данных от АЦП. А вы говорите что такое невозможно... P.S. Платформа AT91SAM9G20
Сообщение отредактировал TigerSHARC - Aug 13 2012, 19:42
|
|
|
|
|
Aug 17 2012, 05:52
|
Знающий
   
Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195

|
Цитата(sasamy @ Aug 16 2012, 21:31)  делаете пару буферов для 1000 сэмплов и прерываний нужно уже не 100к а 100, при этом можно уже не думать ни о какой латентности - пока DMA следующий буфер заполняет времени хватит выше крыши. прерывание, на уровне ядра, всё равно же отробатывается, когда данные готовы от АЦП, что зависит от частоты дискретизации АЦП, например для 100кГц, нужно 100к прерываний в секунду (а иначе как забирать данные?). В прерывании на уровне ядра: заполняем буфер по указателю через DMA и инкрементируем указатель. А уже медленное пользовательское приложение забирает данные из БОЛЬШОГО буфера ядра. Так ведь? прерывания всё равно нужно отработать быстро.
|
|
|
|
|
Aug 17 2012, 06:29
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(TigerSHARC @ Aug 17 2012, 09:52)  прерывание, на уровне ядра, всё равно же отробатывается, когда данные готовы от АЦП, что зависит от частоты дискретизации АЦП, например для 100кГц, ну это вы так решили что busy нужно как источник прерывания использовать Цитата нужно 100к прерываний в секунду (а иначе как забирать данные?). вы же не для ванильного ядра фреймворк делаете как AD для все своей продукции - так что в реализации не стеснены. Например берем процессор atmel и ацп ad7606. Берем вариант Timing Diagrams - Figure 2. CONVST Timing—Reading After a Conversion (Rev. C | Page 9 of 36). У atmel есть 6 таймеров - вам надо всего 2 чтобы сформировать времянки аппаратно - один для CONVST A,CONVST B, второй для клока spi. Переводите spi atmel в slave, busy заводите на CS ad7606 и NSS atmel, его же на внешний триггер таймеров - чтобы засинхронизировать спадающим фронтом busy счетчики таймеров т.к. t CONV "плавает". Нужно вам 128 клоков второго таймера на период первого (если рассматривать 8 канальный вариант ацп, или 64 чтобы по-быстрей считать с 2 выходов параллельно - тогда второй spi у atmel включить) - в итоге процессор нужно дергать только когда PDC буфер заполнит, при этом данные будут продолжать приниматься в следующий буфер - у PDC два указателя Цитата If the value of next counter is zero, the channel stops transferring data and sets the appropriate flag. But if the next counter value is greater then zero, the values of the next pointer/next counter are copied into the current pointer/current counter and the channel resumes the transfer whereas next pointer/next counter get zero/zero as values т.о. вам нужно будет в прерывании по заполнению буфера корректировать Receive Next Pointer Register & Receive Next Counter Register чтобы процесс был циклическим и никогда не прерывался. PS можно еще четче сделать - на busy вообще забить, а CS управлять каналом B первого таймера - отсчитывать им (t 1max + t CONVmax) и выдать CS active, его спадающий фронт использоватьв качестве триггера второго таймера который формирует клок для spi, соответсвенно нужное количество клоков spi уложить во время CS active - тогда количество сэмплов в секунду будет строго фиксированным.
Сообщение отредактировал sasamy - Aug 17 2012, 09:39
|
|
|
|
Сообщений в этой теме
Alexashka Частота прерываний под Linux'ом Jul 27 2012, 11:01 Lyubimov Зависит от времени переключения контекста. Можете ... Jul 31 2012, 12:49 Alexashka Цитата(Lyubimov @ Jul 31 2012, 16:49) А в... Jul 31 2012, 13:48  skyv Цитата(Alexashka @ Jul 31 2012, 16:48) Во... Aug 1 2012, 10:24   Alexashka Цитата(skyv @ Aug 1 2012, 14:24) Интересн... Aug 1 2012, 14:12    aaarrr Цитата(Alexashka @ Aug 1 2012, 18:12) Вот... Aug 1 2012, 14:33     Alexashka Цитата(aaarrr @ Aug 1 2012, 18:33) Тактов... Aug 1 2012, 23:05    rudy_b Цитата(Ruslan1 @ Aug 1 2012, 15:55) Укажи... Aug 2 2012, 01:23     demiurg_spb 2ТС: А вы RT-path накладывали при сборке Linux... Aug 2 2012, 06:14  rudy_b Цитата(Alexashka @ Jul 31 2012, 16:48) ..... Aug 1 2012, 12:38   Ruslan1 Цитата(rudy_b @ Aug 1 2012, 15:38) Ага, и... Aug 1 2012, 12:55   _Артём_ Цитата(rudy_b @ Aug 1 2012, 15:38) Если п... Aug 1 2012, 13:03 Alexashka Померял: 10 NOP'ов из внутренней SRAM выполняю... Aug 3 2012, 12:14 aaarrr Цитата(Alexashka @ Aug 3 2012, 16:14) Пом... Aug 3 2012, 12:40  Alexashka Цитата(aaarrr @ Aug 3 2012, 16:40) Естест... Aug 6 2012, 19:29   aaarrr Цитата(Alexashka @ Aug 6 2012, 23:29) Мне... Aug 6 2012, 20:52 _Pasha Цитата(Alexashka @ Aug 3 2012, 15:14) 10 ... Aug 3 2012, 14:16  aaarrr Цитата(_Pasha @ Aug 3 2012, 18:16) Надо б... Aug 3 2012, 14:42 Alexashka Нашел интересную ссылочку, может кому пригодится..... Aug 8 2012, 18:32 rudy_b Ага, это весьма похоже на правду. Т.е. задержка от... Aug 9 2012, 12:58  demiurg_spb Ну почему-же? Вполне себе реалтайм, просто кому-то... Aug 9 2012, 13:37   Ruslan1 Извиняюсь, но мне кажется, что иногда (по моим наб... Aug 9 2012, 19:04    rudy_b С одной стороны - так, с другой - не так. Ежели уж... Aug 10 2012, 19:08     R.A.K. Цитата(rudy_b @ Aug 10 2012, 23:08) С одн... Aug 10 2012, 19:46      rudy_b Цитата(R.A.K. @ Aug 10 2012, 22:46) ...Ре... Aug 10 2012, 20:58       R.A.K. Цитата(rudy_b @ Aug 11 2012, 00:58) Да и ... Aug 10 2012, 21:23        rudy_b Цитата(R.A.K. @ Aug 11 2012, 00:23) Так о... Aug 11 2012, 14:25 jks Разница между мягким и жестким реалтаймом не в джи... Aug 11 2012, 12:33       aaarrr Цитата(TigerSHARC @ Aug 13 2012, 23:36) м... Aug 13 2012, 19:45 TigerSHARC Скачайте ванильное ядро Linux. Папка /drivers/stag... Aug 14 2012, 05:50 Alexashka Цитата(TigerSHARC @ Aug 14 2012, 09:50) С... Aug 15 2012, 19:35 TigerSHARC Ничем не отличаются, те же самые прерывания.
А гд... Aug 16 2012, 07:29 Alexashka Цитата(TigerSHARC @ Aug 16 2012, 11:29) В... Aug 16 2012, 15:45 TigerSHARC Посмотрите вот этот аппарат: uake.ru
Работает по L... Aug 16 2012, 17:35 TigerSHARC to sasamy:
Интересный подход. Но если инженеры AD ... Aug 17 2012, 13:03 sasamy Цитата(TigerSHARC @ Aug 17 2012, 17:03) 1... Aug 17 2012, 13:34  Alexashka Цитата(sasamy @ Aug 17 2012, 17:34) 2) да... Aug 17 2012, 14:16   sasamy Цитата(Alexashka @ Aug 17 2012, 18:16) Ту... Aug 17 2012, 15:27    Alexashka Цитата(sasamy @ Aug 17 2012, 19:27) Делае... Aug 17 2012, 19:20     sasamy Цитата(Alexashka @ Aug 17 2012, 23:20) Т.... Aug 17 2012, 21:01 TigerSHARC sasamy предложил красивое решение, но если взять п... Aug 17 2012, 20:18 TigerSHARC Получается PDC настраивается один раз во время ини... Aug 18 2012, 06:06 sasamy Цитата(TigerSHARC @ Aug 18 2012, 10:06) B... Aug 19 2012, 21:34
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|