Перейти к содержанию
    

AT91RM9200: использование кеша и Data Abort

Сразу оговорюсь, что если я не включаю кеш в бутлодере, то все работает отлично.

 

В своем первичном бутлодере включаю кеш команд:

 

__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 включить? Хочу кеш данных использовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не совсем понятно, что у Вас происходит с кешем в самом первом случае - он включается только один раз в bootloader'е, или как?

Второй раз включать кеш просто так нельзя, его нужно сначала инвалидировать (регистр 7 в CP15).

 

P.S. У Атмелов есть Abort Status Register - можно посмотреть, что именно вызвало Data Abort.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использование cache без включенного MMU не рекомендуется (нельзя это делать

вообще-то).

Если у Вас не Linux с MMU, то MMU надо использовать в режиме MPU

(иначе при переключении контекста придется выгружать cache).

Для I/O портов надо создать регион(ы), где кеширование запрещено.

 

Иcпользование MMU/MPU и cachies - это большая тема и, к сожалению, в двух

словах об этом не рассказать. Настоятельно рекомендую почитать об этом в книге

Andrew Sloss , Dominic Symes , Chris Wright

"ARM System Developer's Guide: Designing and Optimizing System Software"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использование cache без включенного MMU не рекомендуется (нельзя это делать

вообще-то).

ICache вообще-то можно.

 

Если у Вас не Linux с MMU, то MMU надо использовать в режиме MPU

(иначе при переключении контекста придется выгружать cache).

Для I/O портов надо создать регион(ы), где кеширование запрещено.

Что скрывается за аббревиатурой MPU? Если это protection unit, то на 920-м ядре его нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

To aaarrr

 

Насчет использования I-cache without MMU/MPU - да, в даташите на AT91RM920 это

описывается, но я лично так бы делать не стал...

 

Насчет MPU и ARM920T - Я здесь имел ввиду использование регионов с fixed addressing (fixed page tables) (Вы правы - буду точней в терминологии next time).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не совсем понятно, что у Вас происходит с кешем в самом первом случае - он включается только один раз в bootloader'е, или как?

Второй раз включать кеш просто так нельзя, его нужно сначала инвалидировать (регистр 7 в CP15).

 

P.S. У Атмелов есть Abort Status Register - можно посмотреть, что именно вызвало Data Abort.

Это про первую строчку сообщения? Если я не включаю кеш в бутлодере, а включаю его в стартапе основного приложения, то все работает без ошибок.

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использование cache без включенного MMU не рекомендуется (нельзя это делать

вообще-то).

Если у Вас не Linux с MMU, то MMU надо использовать в режиме MPU

(иначе при переключении контекста придется выгружать cache).

Для I/O портов надо создать регион(ы), где кеширование запрещено.

 

Иcпользование MMU/MPU и cachies - это большая тема и, к сожалению, в двух

словах об этом не рассказать. Настоятельно рекомендую почитать об этом в книге

Andrew Sloss , Dominic Symes , Chris Wright

"ARM System Developer's Guide: Designing and Optimizing System Software"

 

У меня не Линукс, у меня Юкос.

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

 

Насчет книг- спасибо за наводку, гляну. Еще вот увидел в документации на ядро 920T о кешах.

 

А про MMU я со времен Блэкфина еще что-то помню. Потому что там его не было вообще, и это составляло проблему. Теперь же у меня есть MMU, и его наличие тоже является проблемой. :)

 

 

Насчет использования I-cache without MMU/MPU - да, в даташите на AT91RM920 это

описывается, но я лично так бы делать не стал...

Ну уж нет, оно того стОит- ускорение в четыре раза это не шуточки!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Нет. Лучше почитайте документацию.

 

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

Вопрос в том, как в SDRAM появляется новый код, и включен ли при этом ICache.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Нет. Лучше почитайте документацию.

 

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

Вопрос в том, как в SDRAM появляется новый код, и включен ли при этом ICache.

 

Вона как! Если кеш в это время включен- то потом возможна ошибка?

Я как-то не думал об этом, так как до этого к SDRAM вообще не обращаюсь, откуда комады из той области попадут в кеш? Хотя однако туда контроллер ПДП обращается.

Это объясняет то, почему я нашел почти нормально работающее сочетание, тогда у меня действительно кеш был выключен в то время, как по ПДП в SDRAM лилась новая прошивка.

Но имеется один непонятный эффект, вероятно связанный с некорректным выключением кеша.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не призываю не использовать cache, IMHO, просто надежней ее использовать

совместно с MMU.

 

Вот цитата из ARM920T Technical Reference Manual, Rev. DDI0151C.

 

4.2.2 Enabling and disabling the ICache

 

"...The ICache is usually used with the MMU enabled. In this case the Ctt in the relevant MMU

translation table descriptor indicates whether an area of memory is cachable."

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не призываю не использовать cache, IMHO, просто надежней ее использовать

совместно с MMU.

 

Вот цитата из ARM920T Technical Reference Manual, Rev. DDI0151C.

 

4.2.2 Enabling and disabling the ICache

 

"...The ICache is usually used with the MMU enabled. In this case the Ctt in the relevant MMU

translation table descriptor indicates whether an area of memory is cachable."

 

Да я ж не против, я только за обеими четырьмя конечностями!

Но это ж не так просто, задействовать MMU.

 

(Все, вырубаюсь, спать охота. Завтра все, что тут рекомендовали, попробую начать воплощать.)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вона как! Если кеш в это время включен- то потом возможна ошибка?

Обратите внимание на главу 4.4 Cache coherence в ARM920T TRM - это как раз Ваш случай.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И вдогонку: а как MMU включить? Хочу кеш данных использовать.

 

http://www.geocities.com/michaelanburaj/ARM/

 

поковыряйтесь в коде для S3c2410x - он тоже на 920 ядре

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В-общем шаманство какое-то. Может кто-то сталкивался с подобным?

 

Рекомендую выполнить все указания раздела 9 документа ARM DDI0198D (правда, это про 926EJS, надо найти аналогичный для 920) - про Instruction Memory Barrier.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ощущение такое, что ошибка в чем-то другом. Я работаю со включенном icache без MMU - ни разу не замечал описанных выше вещей. Портировал scmRTOS - тоже все работало устойчиво на at91rm9200.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...