Вопрос относительно обработчика прерываний - PullRequest
1 голос
/ 10 сентября 2010

Могу ли я выполнять операции с плавающей запятой в обработчике прерываний? (x86 или 64) Также я хотел бы знать, могу ли я использовать функцию печати внутри обработчика прерываний?

Ответы [ 2 ]

3 голосов
/ 10 сентября 2010

Внутри обработчика прерываний не используйте ничего, что может блокировать. Это означает, что не используйте функции печати, если они не являются блокирующими. В идеале ваш ISR должен сделать минимум, необходимый для очистки прерывания, а затем запустить нормальный поток, чтобы выполнить остальную часть обработки. Если вам нужны операторы печати для отладки, подумайте о том, чтобы не-ISR часть вашей программы объявляла глобальный, изменчивый буфер, а ваш ISR записывал в него ваши данные отладки. Ваш код не-ISR может проверить буфер и printf данные из него при необходимости.

Вам следует избегать операций с плавающей точкой внутри ISR (и в коде ядра в целом).

0 голосов
/ 15 сентября 2010

Большинство модулей с плавающей запятой могут генерировать исключения, деленные на ноль и т. Д. Если ваш код вызвал одно из этих исключений изнутри контекста прерывания, результат будет очень грязным.

Также на x86 некоторые операции с памятью / строкой имеютВерсии MMX, использующие пространство регистров с плавающей запятой в качестве временного хранилища, чтобы они могли выполнять 64-битные операции чтения / записи, поэтому в зависимости от конфигурации процессора / ядра вы можете столкнуться с некоторыми неприятными сюрпризами.

В конечном итоге вы можете потратить многовремя отладки, поэтому мой совет будет стараться избегать использования плавающей запятой в коде ядра, если это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...