Обработчик прерывания Spi работает, когда используется printf()

Я пытаюсь инициировать spi-связь между процессором omap и процессором sam4l. Я настроил протокол spi, и omap является ведущим. Теперь я вижу, что тестовые данные, которые я отправляю, правильно достигают sam4l, и я вижу, что isr печатает эти данные. Использование большего количества printf здесь и там в isr приводит к тому, что операция происходит, и происходит соответствующая операция, но если я удаляю все printfs, я не вижу, чтобы какая-либо операция происходила. Что может быть причиной этой аномалии? Это обычный случай неправильной настройки частоты или что-то в этом роде? Если нужен код, я тоже опубликую его, но он большой. Спасибо


person Nikhil Chaubey    schedule 29.01.2015    source источник
comment
printf() работает в ISR?   -  person Martin James    schedule 29.01.2015
comment
Его не следует использовать, но он работает.   -  person Nikhil Chaubey    schedule 29.01.2015
comment
Никогда не используйте printf в isr. Дополнительная информация: stackoverflow.com/questions/12704196/   -  person Eugene Sh.    schedule 29.01.2015
comment
Я думаю, что если я использую printf, а код не работает, то это проблема. Но здесь я удаляю printf, и тогда он не работает.   -  person Nikhil Chaubey    schedule 29.01.2015
comment
printf работает медленно - если ваша проблема связана со временем, то, возможно, ваш printf замедляет работу настолько, что ему удается работать.   -  person Katie    schedule 29.01.2015
comment
пожалуйста, опубликуйте (минимальную) функцию прерывания, так как, похоже, именно в ней находится корень проблемы.   -  person user3629249    schedule 29.01.2015
comment
в простой функции прерывания SPI jane необходимо решить следующие вопросы: 1) убедиться, что прерывание исходит от периферийного устройства SPI. 2) если буфер не заполнен, прочитать один байт, иначе установить индикацию ошибки переполнения буфера, перейти к 6 3) сохранить этот байт в «глобальный» буфер 4) увеличить «глобальный» индекс в этом буфере. 5) если получено полное сообщение -или-буфер полон, то установить «глобальную» индикацию доступности буфера 6) очистить флаг доступности прерывания 7) выйти. Поскольку и основное, и прерывание обрабатывают одни и те же данные, должен быть мьютекс. кроме того, двойная буферизация поможет избежать потери символов.   -  person user3629249    schedule 29.01.2015


Ответы (2)


Я думаю, вы пытаетесь напечатать сообщение в драйвере.

При печати сообщения на консоли с замедлением работы вашего драйвера он может работать медленно, и ваш драйвер работает хорошо.

Используйте pr_info() для отладки и изменения настроек, чтобы сообщение не появлялось на консоли, изменив /proc/sys/kernel/printk на 4 4 1 7

-> Он будет хранить отладочное сообщение в буфере.

-> Драйвер не замедляется из-за вывода сообщения на экран.

-> И вы можете увидеть это, введя команду dmesg позже.

Затем найдите оригинальную проблему, которая может вызвать ошибку.

person Ratnesh69    schedule 20.05.2015

Если подпрограмма работает с printf "здесь и там", а не иначе, почти наверняка проблема в том, что есть проблемы с синхронизацией. В качестве тривиального примера предположим, что вы пишете на флэш-память SPI, а затем проверяете ее содержимое. Запись во флэш-память займет некоторое время, поэтому, если вы проверите сразу, данные будут недействительными, но если вы вставите вызов printf между ними, может потребоваться достаточно времени, чтобы обратное чтение теперь было действительным.

person Richard at ImageCraft    schedule 29.04.2019