создать небольшую задержку в обработчике прерывания Linux

Я работаю над обработчиком прерывания с группой разработчиков оборудования, и мы пытаемся выяснить, где находится ошибка. Читаю чип по шине SPI на 5кГц. Чип загружает 4 байта и запускает вывод готовности данных.

Мой обработчик прерываний просыпается, читает 4 байта с шины SPI и сохраняет данные в буфере. Как ни странно, каждое 17-е чтение дает 4 байта из всех нулей, что неправильно. Один из вариантов, который мы изучаем, заключается в том, что чип не всегда фактически готов, когда он отправляет сигнал готовности данных.

Итак, я знаю, что не могу заснуть в обработчике прерывания, но я хотел бы попробовать ввести задержку в 10 или 20 микросекунд. Прямо сейчас у меня есть цикл for, который считает до 100000, а затем обрабатывает прерывание. Я не заметил никаких изменений, поэтому подумал, что могу посмотреть, есть ли у кого-нибудь более эффективная техника для активного ожидания. Или, по крайней мере, лучший способ выяснить, сколько итераций цикла мне нужно пройти, поскольку я не уверен, сколько времени это займет, или если компилятор просто оптимизирует все это.


person Maxwell Bottiger    schedule 17.10.2013    source источник
comment
Подключите цифровой анализатор к линиям SPI. Посмотрите, действительно ли ошибочные данные возвращаются после того, как данные готовы. Если вы лучше не определите основную причину проблемы, вы можете вечно мучиться с задержками и т. Д.   -  person Martin James    schedule 18.10.2013


Ответы (2)


Я не знаю, есть ли у вас доступ к каким-либо библиотекам генерации псевдослучайных чисел на вашем встроенном устройстве, но выполнение большого умножения чисел с последующей модификацией определенно займет несколько циклов. Вместо простого добавления 1 (что очень быстро на аппаратном уровне, и компилятор может оптимизировать его для смещения, поскольку вы делаете это статическое количество раз) используйте начальное число случайных чисел (есть ли у системы доступ к часам времени? ), если доступно, и выполнять операции умножения больших чисел, модуля или факториала, деление на отрицательные числа также занимает вечность. Помните, что деление занимает больше всего времени на аппаратном уровне. Используйте это в своих интересах.

person Snofe    schedule 17.10.2013

Я предполагаю, что ваш компилятор выделит простой цикл.

Вам следует использовать volatile.

volatile unsigned long i;
for (i=0;i< 1000000; i++) 
  continue;

Я также предполагаю, что это не устранит проблему и не поможет вам.

Я не могу поверить, что в периферийном устройстве SPI есть такая ошибка.

Но возможно, что вы читаете для замедления данные из SPI-Fifo.
Таким образом, некоторые из полученных данных будут отброшены.

Вы должны проверить флаги ошибок модуля SPI и проверить RX-empty RX-fullflags SPI.

person jeb    schedule 18.10.2013