|
startup asm |
|
|
|
Jan 14 2009, 14:12
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Объясните как работает этот кот, с ассемблером плохо знаком, сейчас читаю, но не совсем все понятно. А именно инструкция ldr записывает значение находящееся по адресу RESET_ADDR , в регистр pc, переменная RESET_ADDR не где не объявляется так же как и pc ? код взят отсюда : http://electronix.ru/forum/index.php?act=a...st&id=16569Код ldr pc, RESET_ADDR ldr pc, UNDEF_ADDR ldr pc, SWI_ADDR ldr pc, PREFETCH_ABORT_ADDR ldr pc, DATA_ABORT_ADDR .word 0 ldr pc, IRQ_ADDR ldr pc, FIQ_ADDR RESET_ADDR: .word RESET_handler UNDEF_ADDR: .word UNDEF_handler SWI_ADDR: .word SWI_handler PREFETCH_ABORT_ADDR: .word PREFETCH_ABORT_handler DATA_ABORT_ADDR: .word DATA_ABORT_handler .word 0 IRQ_ADDR: .word IRQ_handler FIQ_ADDR: .word FIQ_handler
|
|
|
|
|
 |
Ответов
(75 - 89)
|
Jan 21 2009, 16:36
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(sergey sva @ Jan 21 2009, 19:32)  Куда должен указывать INTERRUPT_VECTORS_END ? Туда же, куда и RESET_handler. Цитата(sergey sva @ Jan 21 2009, 19:32)  А если использовать свои FIQ и SWI handlers то что в них добавить исключить? Компилятору пока не хочется поручать, хочу разобраться как все это работает  Это зависит от задачи - мало ли как используются FIQ и SWI. Пока ничего добавлять/исключать не надо.
|
|
|
|
|
Jan 21 2009, 17:42
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(sergey sva @ Jan 21 2009, 17:51)  Сделайте замечания, дайте советы,  если не затруднит. Обработчик exception незачем иметь размазанным через copy-paste. Вызов неких сишных функций приводит необходимости раздувать стек да и система может быть уже начисто сломана, и железо распрограммировано..... Возращаться обратно после exception - отгребете продолжение глюков - надежнее на перезапуск при котором собствено и разберетесь что там было запротоколировано. Содержимое стека тоже надо запоминать - толку от того, что по LR Вы найдете, например, какой-нибудь memcpy() вызываемый из десятков мест просто никакого.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 21 2009, 17:58
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(zltigo @ Jan 21 2009, 20:42)  Обработчик exception незачем иметь размазанным через copy-paste. Возвраты из разных типов исключений разные. Так получится один размазанный обработчик. Цитата(zltigo @ Jan 21 2009, 20:42)  Вызов неких сишных функций приводит необходимости раздувать стек да и система может быть уже начисто сломана, и железо распрограммировано..... Сишная функция мало чем отличается от ассемблерного аналога. Вполне себе безопасно отработает в режиме исключения. Цитата(zltigo @ Jan 21 2009, 20:42)  Возращаться обратно после exception - отгребете продолжение глюков - надежнее на перезапуск при котором собствено и разберетесь что там было запротоколировано. Это уже дело верхнего уровня - решить, что именно делать: зависнуть, перезапуститься и т.п. Архитектурой ARM предусмотрен возврат, так почему бы его не поддержать? Цитата(zltigo @ Jan 21 2009, 20:42)  Содержимое стека тоже надо запоминать - толку от того, что по LR Вы найдете, например, какой-нибудь memcpy() вызываемый из десятков мест просто никакого. Содержимое стека можно спокойно потом достать и из C-подпрограммы. 2 sergey sva: Еще ошибки, должо быть так: Код DATA_ABORT_handler: sub r14, r14, #0x08 @ LR_abt = LR_abt - 0x08 stmfd r13!, {r14} @ Сохранить LR_abt на стеке ABT ...
PREFETCH_ABORT_handler: sub r14, r14, #0x04 @ LR_Pabt = LR_abt - 0x04 stmfd r13!, {r14} @ Сохранить LR_abt на стеке ABT ...
UNDEF_handler: stmfd r13!, {r14} @ Сохранить LR_udef на стеке UNDEF
|
|
|
|
|
Jan 21 2009, 19:06
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Почему для UNDEF_handler:(Неопределенная инструкция) не нужно модифицировать LR? При возникновение, неопределенного прерывания в какой режим переключится ядро? Код @---------------------------------------------------------------------------------------- UNDEF_IRQ: sub r14, r14, #0x04 @ LR - 4 stmfd sp!, {r0,r14} @ сохранить в стеке ??, регистры LR , sp - 0x04 ldr r0, = AIC_BASE @ запись в R0 базовый адрес AIC str r0, [r0, #AIC_EOICR] @ запись R0 по адресу R0 + #AIC_EOICR (окончание прерывания) ldmfd sp!, {r0,pc}^ @ запись в pc, модифицированого RL востановление R0 обновление CPSR @----------------------------------------------------------------------------------------
|
|
|
|
|
Jan 21 2009, 19:11
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(aaarrr @ Jan 21 2009, 19:58)  Возвраты из разных типов исключений разные. Так получится один размазанный обработчик. Отличий много меньше, нежели общего. Цитата Сишная функция мало чем отличается от ассемблерного аналога. Вполне себе безопасно отработает в режиме исключения. Угу, только вот произвольная функция начинает требовать побольше места под стек, вызывать, например, printf(), захочет воспользоваться прерываниями.... Цитата Это уже дело верхнего уровня - решить, что именно делать: зависнуть, перезапуститься и т.п. Архитектурой ARM предусмотрен возврат, так почему бы его не поддержать? Потому, что это в подавляющем большинстве случаев возврат в сошедшую с ума программу. Типа а почему-бы его не прeдусмотреть... Цитата Содержимое стека можно спокойно потом достать и из C-подпрограммы. Которая или этим стеком уже воспользовалась испортила, или должна переключиться, испортить и посмотреть....
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 21 2009, 20:25
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(zltigo @ Jan 21 2009, 22:11)  Отличий много меньше, нежели общего. Вам жалко 200 байт? Цитата(zltigo @ Jan 21 2009, 22:11)  Угу, только вот произвольная функция начинает требовать побольше места под стек, вызывать, например, printf(), захочет воспользоваться прерываниями.... Это не произвольная функция, а вполне определенная функция обработки исключения. Вы же пишете обработчики прерываний на C, так почему здесь C-подпрограмма вызывает такую реакцию? Просто удобнее сохранение/вывод истории ошибки сделать на C. Цитата(zltigo @ Jan 21 2009, 22:11)  Потому, что это в подавляющем большинстве случаев возврат в сошедшую с ума программу. Типа а почему-бы его не прeдусмотреть... Да, почему бы не предусмотреть. Это универсальное решение. Цитата(zltigo @ Jan 21 2009, 22:11)  Которая или этим стеком уже воспользовалась испортила, или должна переключиться, испортить и посмотреть.... Сишная программа вызывается в режиме ABORT/UNDEF с соответствующим стеком, как она может испортить другой? Цитата(sergeeff @ Jan 21 2009, 22:17)  По поводу выдачи дампа стека. Как-то не ясно, что он может дать для прояснения возникновения exception'a? Ведь вызов функции не всегда сопровождается запихиванием чего бы то ни было в стек. Если не сопровождается - смотрим LR, в противном случае - то место в стеке, где должен быть адрес возврата. Так мы почти в любом случае можем установить ту процедуру, которая вызвала "упавшую".
|
|
|
|
|
Jan 21 2009, 20:48
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(aaarrr @ Jan 21 2009, 22:25)  Сишная программа вызывается в режиме ABORT/UNDEF с соответствующим стеком, как она может испортить другой? Ну в принципе, если указатель на стек в обработчике сохранили, то можно действительно безболезненно посмотреть. Ну а со всем отальным как быть? Вывались в эту "сишную функцию", например, из обработчика прерывания, штатный ввод/вывод обеспечивает операционка. Что будем делать, как сообщать о случишемся. Да, я понимаю, что можно написать аварийную консольку, проинициализировать перед этми железо по минимуму... Но зачем все эти пляски?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 21 2009, 22:19
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(zltigo @ Jan 21 2009, 23:48)  Ну а со всем отальным как быть? Вывались в эту "сишную функцию", например, из обработчика прерывания, штатный ввод/вывод обеспечивает операционка. Что будем делать, как сообщать о случишемся. Да, я понимаю, что можно написать аварийную консольку, проинициализировать перед этми железо по минимуму... Но зачем все эти пляски? А на асме что бы делали? Вот и здесь то же. К чему эти вопросы, я не пойму? Цитата(sergey sva @ Jan 22 2009, 01:10)  Контроллер aic поддерживает 32 прерывания, эти прерывания закреплены к источникам, или перенастраиваются для разных источников Закреплены.
|
|
|
|
|
Jan 21 2009, 23:30
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(aaarrr @ Jan 22 2009, 00:19)  А на асме что бы делали? Только самое необходимое. Сохраняется, все, что можно-нужно, устанавливается признак exception и на restart. После инициализации системы при наличии флага распечатка, или любые иные действия с сохраненной информацией о вылете. Цитата Вот и здесь то же. 'Здесь' некие действия с негарантированным результатом и непредсказуемым продолжением. Цитата К чему эти вопросы, я не пойму? Был задан вопрос о недостатках приведенного решения.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|