Сразу оговорюсь, что если я не включаю кеш в бутлодере, то все работает отлично.
В своем первичном бутлодере включаю кеш команд:
__MCR(15,0,__MRC(15,0,1,0,0) | 0x00001000,1,0,0) ;
Кеш данных не включаю, так как MMU не использую (не умею), а без MMU он не работает.
Все отлично и шикарно, ускорение ого-го (в 4 раза при тестировании SDRAM).
Но вот когда загружаю в SDRAM основную прошивку и перехожу на нее, то в какой-то момент возникает исключение по вектору 0x10 (Data Abort). При попытке пошагово просмотреть то место, с которого происходит исключение, ничего крамольного не вижу. Более того- если я даже просто ставлю точку останова в основной программе до возникновения исключения, то дальше исключения уже не происходит. То есть достаточно поставить отладчиком точку останова, а при остановке запустить дальше- и никаких усключений, все работает отлично. Такое ощущение, что пока оно стоит, что-то там в кеше успевает дозреть и далее работает нормально.
Ну ладно. Выключаю кеш в конце бутлодера и потом включаю его по новой в основном коде- тоже возникает исключение.
Передаю управление основной программе из бутлодера в состоянии, как можно более близком к ресету (в основной программе происходит полный стартап, кроме уже проинициализированной бутлодером периферии): и ARM-мода, и прерывания выключены, и в супервизоре. Чего ему еще не хватает, не понимаю.
С помощью метода тыка добился почти работоспособного варианта: выключаю кеш где-то посередине бутлодера, и включаю его уже потом в основной программе.
В-общем шаманство какое-то. Может кто-то сталкивался с подобным?
И от чего вообще может возникает этот Data Abort, если я не включаю кеш данных (кстати, пробовал включать, ничего не изменилось), и не использую MMU ?
И вдогонку: а как MMU включить? Хочу кеш данных использовать.