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

 
 
> startup asm
sergey sva
сообщение Jan 14 2009, 14:12
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
10 страниц V  « < 4 5 6 7 8 > »   
Start new topic
Ответов (75 - 89)
aaarrr
сообщение Jan 21 2009, 16:36
Сообщение #76


Гуру
******

Группа: Свой
Сообщений: 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 то что в них добавить исключить?
Компилятору пока не хочется поручать, хочу разобраться как все это работает smile.gif

Это зависит от задачи - мало ли как используются FIQ и SWI. Пока ничего добавлять/исключать не надо.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 21 2009, 17:03
Сообщение #77


Гуру
******

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



Если сделать так: объявить в присоединенном файле, где все объявление ?
.equ INTERRUPT_VECTORS_END, 0x00001C @ конец таблици векторов прерывания
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 21 2009, 17:07
Сообщение #78


Гуру
******

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



Цитата(sergey sva @ Jan 21 2009, 20:03) *
Если сделать так: объявить в присоединенном файле, где все объявление ?
.equ INTERRUPT_VECTORS_END, 0x00001C @ конец таблици векторов прерывания

А зачем делать совсем неочевидные (и неправильные, кстати) .equ, когда можно написать так:
Код
INTERRUPT_VECTORS_END:
RESET_handler:
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 21 2009, 17:13
Сообщение #79


Гуру
******

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



поясните пожалуйста, что не правильно ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 21 2009, 17:17
Сообщение #80


Гуру
******

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



Код
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

Это тоже должно быть скопировано.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 21 2009, 17:42
Сообщение #81


Гуру
******

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



Цитата(sergey sva @ Jan 21 2009, 17:51) *
Сделайте замечания, дайте советы, smile.gif если не затруднит.



Обработчик exception незачем иметь размазанным через copy-paste.

Вызов неких сишных функций приводит необходимости раздувать стек да и система может быть уже начисто сломана, и железо распрограммировано.....

Возращаться обратно после exception - отгребете продолжение глюков - надежнее на перезапуск при котором собствено и разберетесь что там было запротоколировано. 


Содержимое стека тоже надо запоминать - толку от того, что по LR Вы найдете, например, какой-нибудь memcpy() вызываемый из десятков мест просто никакого.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 21 2009, 17:58
Сообщение #82


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 21 2009, 19:06
Сообщение #83


Гуру
******

Группа: Свой
Сообщений: 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
@----------------------------------------------------------------------------------------
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 21 2009, 19:11
Сообщение #84


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 21 2009, 19:17
Сообщение #85


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

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



Думается, что в embedded мире неожиданные exception есть ничто иное как ляп, который должен быть ликвидирован. Соответственно наша задача - максимально облегчить себе жизнь в уяснении причины и места возникновения ляпа. Для этого, выдать информативный дамп и остановиться, представляется совершенно достаточным.


По поводу выдачи дампа стека. Как-то не ясно, что он может дать для прояснения возникновения exception'a? Ведь вызов функции не всегда сопровождается запихиванием чего бы то ни было в стек. Может уважаемый zltigo прояснит этот вопрос?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 21 2009, 20:25
Сообщение #86


Гуру
******

Группа: Свой
Сообщений: 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, в противном случае - то место в стеке, где должен быть адрес возврата. Так мы почти в любом случае можем установить ту процедуру, которая вызвала "упавшую".
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 21 2009, 20:48
Сообщение #87


Гуру
******

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



Цитата(aaarrr @ Jan 21 2009, 22:25) *
Сишная программа вызывается в режиме ABORT/UNDEF с соответствующим стеком, как она может испортить другой?


Ну в принципе, если указатель на стек в обработчике сохранили, то можно действительно безболезненно посмотреть. Ну а со всем отальным как быть? Вывались в эту "сишную функцию", например, из обработчика прерывания, штатный ввод/вывод обеспечивает операционка. Что будем делать, как сообщать о случишемся. Да, я понимаю, что можно написать аварийную консольку, проинициализировать перед этми железо по минимуму... Но зачем все эти пляски?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 21 2009, 22:10
Сообщение #88


Гуру
******

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



Контроллер aic поддерживает 32 прерывания, эти прерывания закреплены к источникам, или перенастраиваются для разных источников,
например прерывание 1 только от SPI или можно все прерывания настроить, что бы срабатывали от PIO?
Если все прерывания будут настроены от PIO и разрешить прерывания от каждой ноги, что то не пойму
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 21 2009, 22:19
Сообщение #89


Гуру
******

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



Цитата(zltigo @ Jan 21 2009, 23:48) *
Ну а со всем отальным как быть? Вывались в эту "сишную функцию", например, из обработчика прерывания, штатный ввод/вывод обеспечивает операционка. Что будем делать, как сообщать о случишемся. Да, я понимаю, что можно написать аварийную консольку, проинициализировать перед этми железо по минимуму... Но зачем все эти пляски?

А на асме что бы делали? Вот и здесь то же. К чему эти вопросы, я не пойму?

Цитата(sergey sva @ Jan 22 2009, 01:10) *
Контроллер aic поддерживает 32 прерывания, эти прерывания закреплены к источникам, или перенастраиваются для разных источников

Закреплены.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 21 2009, 23:30
Сообщение #90


Гуру
******

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



Цитата(aaarrr @ Jan 22 2009, 00:19) *
А на асме что бы делали?


Только самое необходимое. Сохраняется, все, что можно-нужно, устанавливается признак exception и на restart. После инициализации системы при наличии флага распечатка, или любые иные действия с сохраненной информацией о вылете. 

Цитата
Вот и здесь то же.


'Здесь' некие действия с негарантированным результатом и непредсказуемым продолжением.

Цитата
К чему эти вопросы, я не пойму?


Был задан вопрос о недостатках приведенного решения.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:16
Рейтинг@Mail.ru


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