Ruslan1 17 30 сентября, 2006 Опубликовано 30 сентября, 2006 · Жалоба Сразу оговорюсь, что если я не включаю кеш в бутлодере, то все работает отлично. В своем первичном бутлодере включаю кеш команд: __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 включить? Хочу кеш данных использовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 30 сентября, 2006 Опубликовано 30 сентября, 2006 · Жалоба Не совсем понятно, что у Вас происходит с кешем в самом первом случае - он включается только один раз в bootloader'е, или как? Второй раз включать кеш просто так нельзя, его нужно сначала инвалидировать (регистр 7 в CP15). P.S. У Атмелов есть Abort Status Register - можно посмотреть, что именно вызвало Data Abort. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yuri_t 0 30 сентября, 2006 Опубликовано 30 сентября, 2006 · Жалоба Использование 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" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 30 сентября, 2006 Опубликовано 30 сентября, 2006 · Жалоба Использование cache без включенного MMU не рекомендуется (нельзя это делать вообще-то). ICache вообще-то можно. Если у Вас не Linux с MMU, то MMU надо использовать в режиме MPU (иначе при переключении контекста придется выгружать cache). Для I/O портов надо создать регион(ы), где кеширование запрещено. Что скрывается за аббревиатурой MPU? Если это protection unit, то на 920-м ядре его нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yuri_t 0 30 сентября, 2006 Опубликовано 30 сентября, 2006 · Жалоба To aaarrr Насчет использования I-cache without MMU/MPU - да, в даташите на AT91RM920 это описывается, но я лично так бы делать не стал... Насчет MPU и ARM920T - Я здесь имел ввиду использование регионов с fixed addressing (fixed page tables) (Вы правы - буду точней в терминологии next time). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 30 сентября, 2006 Опубликовано 30 сентября, 2006 · Жалоба Не совсем понятно, что у Вас происходит с кешем в самом первом случае - он включается только один раз в bootloader'е, или как? Второй раз включать кеш просто так нельзя, его нужно сначала инвалидировать (регистр 7 в CP15). P.S. У Атмелов есть Abort Status Register - можно посмотреть, что именно вызвало Data Abort. Это про первую строчку сообщения? Если я не включаю кеш в бутлодере, а включаю его в стартапе основного приложения, то все работает без ошибок. Был у меня и вариант, когда кеш включается только в бутлодере и все. Результат: при передаче управления основной программе программа успевает совершить некоторые действия (выдать в дебаггерский порт сообщение о своем старте) и виснет. Вероятно, происходит то же исключение, у меня там заглушка. Насчет инвалидировать- спасибо, я не знал. Сейчас(нет, все же завтра) прочитаю еще раз описание CP15. В случае этого действия что произойдет? довыполнятся операции, уже сохраненные в кеше, и кеш выключится? Мне кажется, что у меня такая хитрость: во время работы кеша происходит, можно сказать, переключение контекста (в адресах SDRAM появляется новый код). Может быть, в этом и дело? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 30 сентября, 2006 Опубликовано 30 сентября, 2006 · Жалоба Использование 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 это описывается, но я лично так бы делать не стал... Ну уж нет, оно того стОит- ускорение в четыре раза это не шуточки! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 30 сентября, 2006 Опубликовано 30 сентября, 2006 · Жалоба Насчет инвалидировать- спасибо, я не знал. Сейчас(нет, все же завтра) прочитаю еще раз описание CP15. В случае этого действия что произойдет? довыполнятся операции, уже сохраненные в кеше, и кеш выключится? Нет. Лучше почитайте документацию. Мне кажется, что у меня такая хитрость: во время работы кеша происходит, можно сказать, переключение контекста (в адресах SDRAM появляется новый код). Может быть, в этом и дело? Вопрос в том, как в SDRAM появляется новый код, и включен ли при этом ICache. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 30 сентября, 2006 Опубликовано 30 сентября, 2006 · Жалоба Насчет инвалидировать- спасибо, я не знал. Сейчас(нет, все же завтра) прочитаю еще раз описание CP15. В случае этого действия что произойдет? довыполнятся операции, уже сохраненные в кеше, и кеш выключится? Нет. Лучше почитайте документацию. Мне кажется, что у меня такая хитрость: во время работы кеша происходит, можно сказать, переключение контекста (в адресах SDRAM появляется новый код). Может быть, в этом и дело? Вопрос в том, как в SDRAM появляется новый код, и включен ли при этом ICache. Вона как! Если кеш в это время включен- то потом возможна ошибка? Я как-то не думал об этом, так как до этого к SDRAM вообще не обращаюсь, откуда комады из той области попадут в кеш? Хотя однако туда контроллер ПДП обращается. Это объясняет то, почему я нашел почти нормально работающее сочетание, тогда у меня действительно кеш был выключен в то время, как по ПДП в SDRAM лилась новая прошивка. Но имеется один непонятный эффект, вероятно связанный с некорректным выключением кеша. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yuri_t 0 30 сентября, 2006 Опубликовано 30 сентября, 2006 · Жалоба Я не призываю не использовать 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." Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 30 сентября, 2006 Опубликовано 30 сентября, 2006 · Жалоба Я не призываю не использовать 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. (Все, вырубаюсь, спать охота. Завтра все, что тут рекомендовали, попробую начать воплощать.) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 30 сентября, 2006 Опубликовано 30 сентября, 2006 · Жалоба Вона как! Если кеш в это время включен- то потом возможна ошибка? Обратите внимание на главу 4.4 Cache coherence в ARM920T TRM - это как раз Ваш случай. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DropDown 0 1 октября, 2006 Опубликовано 1 октября, 2006 · Жалоба И вдогонку: а как MMU включить? Хочу кеш данных использовать. http://www.geocities.com/michaelanburaj/ARM/ поковыряйтесь в коде для S3c2410x - он тоже на 920 ядре Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 1 октября, 2006 Опубликовано 1 октября, 2006 · Жалоба В-общем шаманство какое-то. Может кто-то сталкивался с подобным? Рекомендую выполнить все указания раздела 9 документа ARM DDI0198D (правда, это про 926EJS, надо найти аналогичный для 920) - про Instruction Memory Barrier. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 2 октября, 2006 Опубликовано 2 октября, 2006 · Жалоба Ощущение такое, что ошибка в чем-то другом. Я работаю со включенном icache без MMU - ни разу не замечал описанных выше вещей. Портировал scmRTOS - тоже все работало устойчиво на at91rm9200. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться