Каковы частые причины ошибок Prefetch Abort на устройствах на базе ARM? - PullRequest
0 голосов
/ 09 октября 2018

Моя C программа работает на голом металле Raspberry Pi 3B +.Он работает нормально, за исключением того, что я получил случайные зависания, которые сам процессор сообщает как Prefetch Abort.Устройство может нормально работать в течение нескольких часов, а затем неожиданно зависает.Он не делает ничего особенного, прежде чем падает, поэтому это не предсказуемо.

Регистр FS (FSR) устанавливается в 0xD, когда происходит эта ошибка, что говорит об ошибке разрешения: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0087e/Cihhhged.html

Другие регистры: FAR - 0xE80000B6, LR - 0xFFFFFFFF, ПК - 0xE80000B6, PSR - 0x200001F1

В моей программе используются прерывания FIQ и IRQ и используются все четыре ядра процессора.

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

1 Ответ

0 голосов
/ 09 октября 2018

Учитывая, что ваш код многопоточный (на самом деле, многоядерный) и сбой непредсказуем, я бы сказал, что прерывание предварительной выборки почти наверняка вызвано повреждением памяти из-за гонки.

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

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

Если в миксе тоже есть гонки доступа к данным, обратите вниманиечто для их решения вам понадобятся не только инструкции по защите данных.Инструкции по защите данных только решают проблемы согласованности, связанные с незавершенными транзакциями памяти.Они не препятствуют кешированию регистров совместно используемых данных (для этого вам нужно ключевое слово volatile) или одновременным гонкам чтения-изменения-записи (для этого нужны механизмы взаимного исключения, предоставляемые любой используемой платформой или домашней версией).-приготовлено с использованием инструкций STREX и LDREX на armv7).

...