Недосягаемый DMA* или рабочие будни
Apr. 16th, 2015 02:11 am*) Direct Memory Access - Прямой доступ к памяти
В мире ядра Линукс и железа категории SoC - "я — не волшебник, я ещё только учусь" (Linux development, Шел далёкий 2008 год... ), но постепенно опыт приходит.
Первый раз, когда у меня не запускался процесс обработки изображения во фронт-энде TI DM365 (всё вроде заполняю, отдаю на обработку, а обратно прерывание не возвращается), мой русский коллега мне посоветовал разобраться, а что там в DMA, что, мол, пора бы уже...
Но пришёл начальник, француз с большим опытом работы с подобным родом железа и софта, отодвинул идею разобраться с DMA, стал со мной проверять значения регистров. Нашёл достаточно быстро, что значение регистров вертикального и горизонтального пэддинга - вообще не соответствуют задаваемому разрешению картинки (остаётся непонятным, почему тогда драйвер принимает эти значения, какой физический смысл таких значений вообще; по ходу конвейера должен быть запас столбцов и строк для обработки изображения). Значения поправили, прерывание окончания обработки стало приходить.
А тут недавно другой коллега, который аппликуху пишет, заметил, что иногда, если процесс перезапускать - происходит зависание. Я помог локализовать, где происходит зависание. Оказалось - на poll() в video4linux. Далее уже быстро выяснили, что из-за того же: не приходит прерывание от завершения обработки. Не часто такая ситуация возникает, только после многих перезапусков, но уж если произошла, то дальше уже — как не перезапускай, а результат один.
Я сразу проверил содержимое регистров железа, сравнил с хорошим и плохим случаем, криминала — не нашёл, стал дальше вдумываться... И сова коллега посоветовал посмотреть DMA.
Но снова пришёл начальник, и в этот раз был у него — цифровой осциллограф, он приложил щуп к одной из ног матрицы (которая в конце снятия кадра по этой ноге сигнал соответствующий посылает) и обнаружил, что когда происходит зависание — нога перестаёт посылать во фронт-энд сигнал. Тут же было проверено решение: резетить микруху матрицы железно, подавая сигнал на соответствующую ногу. И процесс вошёл в нужное русло.
Так и не довелось мне пока пощупать DMA. Да и доки фронт-энда объясняют: мы вам объясним, как с помощью регистров всё сделать, запустить; но есть ещё и с помощью DMA вариант тоже самое сделать, но это мы объяснять не будем, не нужно это...
В мире ядра Линукс и железа категории SoC - "я — не волшебник, я ещё только учусь" (Linux development, Шел далёкий 2008 год... ), но постепенно опыт приходит.
Первый раз, когда у меня не запускался процесс обработки изображения во фронт-энде TI DM365 (всё вроде заполняю, отдаю на обработку, а обратно прерывание не возвращается), мой русский коллега мне посоветовал разобраться, а что там в DMA, что, мол, пора бы уже...
Но пришёл начальник, француз с большим опытом работы с подобным родом железа и софта, отодвинул идею разобраться с DMA, стал со мной проверять значения регистров. Нашёл достаточно быстро, что значение регистров вертикального и горизонтального пэддинга - вообще не соответствуют задаваемому разрешению картинки (остаётся непонятным, почему тогда драйвер принимает эти значения, какой физический смысл таких значений вообще; по ходу конвейера должен быть запас столбцов и строк для обработки изображения). Значения поправили, прерывание окончания обработки стало приходить.
А тут недавно другой коллега, который аппликуху пишет, заметил, что иногда, если процесс перезапускать - происходит зависание. Я помог локализовать, где происходит зависание. Оказалось - на poll() в video4linux. Далее уже быстро выяснили, что из-за того же: не приходит прерывание от завершения обработки. Не часто такая ситуация возникает, только после многих перезапусков, но уж если произошла, то дальше уже — как не перезапускай, а результат один.
Я сразу проверил содержимое регистров железа, сравнил с хорошим и плохим случаем, криминала — не нашёл, стал дальше вдумываться... И сова коллега посоветовал посмотреть DMA.
Но снова пришёл начальник, и в этот раз был у него — цифровой осциллограф, он приложил щуп к одной из ног матрицы (которая в конце снятия кадра по этой ноге сигнал соответствующий посылает) и обнаружил, что когда происходит зависание — нога перестаёт посылать во фронт-энд сигнал. Тут же было проверено решение: резетить микруху матрицы железно, подавая сигнал на соответствующую ногу. И процесс вошёл в нужное русло.
Так и не довелось мне пока пощупать DMA. Да и доки фронт-энда объясняют: мы вам объясним, как с помощью регистров всё сделать, запустить; но есть ещё и с помощью DMA вариант тоже самое сделать, но это мы объяснять не будем, не нужно это...
no subject
Date: 2015-04-16 02:31 am (UTC)Re: вау
Date: 2015-04-16 07:07 am (UTC)Надеюсь, это - только начало.
Сайт компании: http://nexvision.fr/
no subject
Date: 2015-04-16 03:07 am (UTC)меня тут тоже недавно на чистых сях писать таки заставили
Re: эмбеддед какой? )
Date: 2015-04-16 07:05 am (UTC)no subject
Date: 2015-04-20 02:45 pm (UTC)Re: еще не научился работать с осцилирограффом ???
Date: 2015-04-20 10:37 pm (UTC)no subject
Date: 2015-04-20 03:21 pm (UTC)Re: кручусь в каком-то недо-embedded.
Date: 2015-04-20 10:42 pm (UTC)Но железяки в этой фирме не только программирую, но и разрабатывают.
Так что, интересно, конечно.