Синхронное внешнее прерывание на ARM

Я создавал приложение для «голого железа» на ARM Cortex A9 Pandaboard и часто сталкивался с прерыванием выборки инструкций. Когда я выгружаю регистр IFSR, я получаю 0x1008. Я прочитал справочное руководство и понял, что 1008 — это синхронное внешнее прерывание. Проблема в том, что означает синхронное внешнее прерывание и откуда оно берется? Спасибо за вашу помощь.


person Adhe Widianjaya    schedule 16.12.2014    source источник


Ответы (1)


В разделе ARMv7 ARM "Прерывания памяти VMSA" подробно рассматривается этот вопрос. можно было бы ожидать (учитывая, что это авторитетное определение архитектуры), но подвести итог чуть менее чем на 14 страницах;

Прервать означает, что ЦП пытался выполнить доступ к памяти, который по какой-либо причине не мог быть завершен, поэтому возникает исключение.

Прерывание внешнего происходит извне по отношению к процессору, т. е. от чего-то на шине. Другими словами, доступ не сработал в MMU, вышел на шину, а либо какое-то устройство, либо сам интерконнект вернулся и сказал: «Эй, я не могу с этим справиться».

синхронное внешнее прерывание означает, что вам скорее повезло, поскольку отладка не будет совершенно отвратительной — в случае прерывания предварительной выборки это означает, что IFAR будет содержать действительный VA для неисправную инструкцию, чтобы вы точно знали, что ее вызвало. Неприятной альтернативой является асинхронное внешнее прерывание, которое представляет собой не более чем прерывание, чтобы сказать: «Эй, что-то, что вы сделали некоторое время назад, на самом деле не сработало. Нет, я тоже не знаю, что это было». ."

Итак, вы пытаетесь выполнить инструкции из чего-то, что вы считаете памятью, но таковой не является. Без каких-либо дополнительных подробностей фактической причиной может быть что угодно, от опечатки жестко запрограммированного адреса до хитрых таблиц страниц, устаревших записей TLB, когерентности кеша и т. д. и т. д.

person Notlikethat    schedule 16.12.2014
comment
Большое спасибо за ответ. Я получил четкое представление о своей проблеме. Но несколько минут назад я попытался вставить функции для очистки моего кеша, и эти прерывания никогда не происходили. Есть ли проблема с кешем? Я использовал общие атрибуты обычной памяти в своей таблице перевода, чтобы использовать кеш. - person Adhe Widianjaya; 16.12.2014
comment
У вас есть правильные атрибуты, установленные в соответствующих TTBRn для последовательного обхода стола? Помните, что сами атрибуты в записях таблицы влияют только на доступ к ЦП, транслируемый MMU — обходчик таблиц MMU — это отдельный интерфейс. - person Notlikethat; 16.12.2014
comment
Я использовал формат короткого дескриптора для своих 32-битных плат ARM. Я установил бит Shareable в регистре TTBR0 через доступ CP15. Но когда я попытался установить бит предварительной выборки L1 и атрибут внутренней кэшируемости (IRGN), я получил странное поведение. Я не мог установить эти два бита, и в моем TTBR0 всегда был установлен только бит Shareable. Я пропустил что-то важное? - person Adhe Widianjaya; 16.12.2014