реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> AT91RM9200: использование кеша и Data Abort, Выключаю кеш- и ошибка пропадает
Ruslan1
сообщение Sep 30 2006, 16:58
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



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

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

__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 включить? Хочу кеш данных использовать.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 30 2006, 17:36
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

P.S. У Атмелов есть Abort Status Register - можно посмотреть, что именно вызвало Data Abort.
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Sep 30 2006, 17:41
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Использование 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"
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 30 2006, 18:07
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(yuri_t @ Sep 30 2006, 21:41) *
Использование cache без включенного MMU не рекомендуется (нельзя это делать
вообще-то).

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

Цитата(yuri_t @ Sep 30 2006, 21:41) *
Если у Вас не Linux с MMU, то MMU надо использовать в режиме MPU
(иначе при переключении контекста придется выгружать cache).
Для I/O портов надо создать регион(ы), где кеширование запрещено.

Что скрывается за аббревиатурой MPU? Если это protection unit, то на 920-м ядре его нет.
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Sep 30 2006, 18:42
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



To aaarrr

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

Насчет MPU и ARM920T - Я здесь имел ввиду использование регионов с fixed addressing (fixed page tables) (Вы правы - буду точней в терминологии next time).
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Sep 30 2006, 19:28
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(aaarrr @ Sep 30 2006, 20:36) *
Не совсем понятно, что у Вас происходит с кешем в самом первом случае - он включается только один раз в bootloader'е, или как?
Второй раз включать кеш просто так нельзя, его нужно сначала инвалидировать (регистр 7 в CP15).

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

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

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

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

Мне кажется, что у меня такая хитрость: во время работы кеша происходит, можно сказать, переключение контекста (в адресах SDRAM появляется новый код). Может быть, в этом и дело?
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Sep 30 2006, 19:54
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(yuri_t @ Sep 30 2006, 20:41) *
Использование 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, и его наличие тоже является проблемой. smile.gif


Цитата(yuri_t @ Sep 30 2006, 21:42) *
Насчет использования I-cache without MMU/MPU - да, в даташите на AT91RM920 это
описывается, но я лично так бы делать не стал...

Ну уж нет, оно того стОит- ускорение в четыре раза это не шуточки!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 30 2006, 20:16
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Ruslan1 @ Sep 30 2006, 23:28) *
Насчет инвалидировать- спасибо, я не знал. Сейчас(нет, все же завтра) прочитаю еще раз описание CP15. В случае этого действия что произойдет? довыполнятся операции, уже сохраненные в кеше, и кеш выключится?

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

Цитата(Ruslan1 @ Sep 30 2006, 23:28) *
Мне кажется, что у меня такая хитрость: во время работы кеша происходит, можно сказать, переключение контекста (в адресах SDRAM появляется новый код). Может быть, в этом и дело?

Вопрос в том, как в SDRAM появляется новый код, и включен ли при этом ICache.
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Sep 30 2006, 20:35
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(aaarrr @ Sep 30 2006, 23:16) *
Цитата(Ruslan1 @ Sep 30 2006, 23:28) *

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

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

Цитата(Ruslan1 @ Sep 30 2006, 23:28) *
Мне кажется, что у меня такая хитрость: во время работы кеша происходит, можно сказать, переключение контекста (в адресах SDRAM появляется новый код). Может быть, в этом и дело?

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


Вона как! Если кеш в это время включен- то потом возможна ошибка?
Я как-то не думал об этом, так как до этого к SDRAM вообще не обращаюсь, откуда комады из той области попадут в кеш? Хотя однако туда контроллер ПДП обращается.
Это объясняет то, почему я нашел почти нормально работающее сочетание, тогда у меня действительно кеш был выключен в то время, как по ПДП в SDRAM лилась новая прошивка.
Но имеется один непонятный эффект, вероятно связанный с некорректным выключением кеша.
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Sep 30 2006, 20:35
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Я не призываю не использовать 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."
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Sep 30 2006, 20:43
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(yuri_t @ Sep 30 2006, 23:35) *
Я не призываю не использовать 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.

(Все, вырубаюсь, спать охота. Завтра все, что тут рекомендовали, попробую начать воплощать.)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 30 2006, 21:44
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Ruslan1 @ Oct 1 2006, 00:35) *
Вона как! Если кеш в это время включен- то потом возможна ошибка?

Обратите внимание на главу 4.4 Cache coherence в ARM920T TRM - это как раз Ваш случай.
Go to the top of the page
 
+Quote Post
DropDown
сообщение Oct 1 2006, 05:53
Сообщение #13


Участник
*

Группа: Свой
Сообщений: 44
Регистрация: 26-06-04
Пользователь №: 189



Цитата(Ruslan1 @ Sep 30 2006, 19:58) *
И вдогонку: а как MMU включить? Хочу кеш данных использовать.


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

поковыряйтесь в коде для S3c2410x - он тоже на 920 ядре
Go to the top of the page
 
+Quote Post
Rst7
сообщение Oct 1 2006, 07:03
Сообщение #14


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(Ruslan1 @ Sep 30 2006, 19:58) *
В-общем шаманство какое-то. Может кто-то сталкивался с подобным?


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


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Oct 2 2006, 05:29
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 20:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01509 секунд с 7
ELECTRONIX ©2004-2016