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

 
 
10 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> startup asm
aaarrr
сообщение Jan 17 2009, 18:21
Сообщение #31


Гуру
******

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



Ссылка с рекомендациями. Для data abort и undefined instruction делаются аналогичные обработчики.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 17 2009, 18:48
Сообщение #32


Гуру
******

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



В функции prefetch_abort_handler_c должен быть еще какой то код,нужный для обработки прерывания?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 17 2009, 20:19
Сообщение #33


Гуру
******

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



Цитата(sergey sva @ Jan 17 2009, 21:48) *
В функции prefetch_abort_handler_c должен быть еще какой то код,нужный для обработки прерывания?

Нет, это самая обычная функция.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 17 2009, 21:36
Сообщение #34


Гуру
******

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



Понятно. Разбираюсь еще с ассемблером, появился вопрос, простой smile.gif ,
Подумал лучше спросить чем оставаться с сомнениями.
команда and логическое и, с флагом S выполняется если условие истинно.
Получается если:
mov R1 , #0xFF
ands R1 , R1, #0xFF
B lab1 условие истинное будет выполняться эта команда
B lab2 условие не истинное будет выполняться эта команда
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 17 2009, 21:45
Сообщение #35


Гуру
******

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



Флаг S в команде указывает процессору, что нужно установить флаги в CPSR по результатам операции.
B lab1 будет выполняться всегда, BEQ lab2 - будет выполняться, если флаг Z установлен и т.д.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 17 2009, 22:11
Сообщение #36


Гуру
******

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



Если правильно понял:
mov R1 , #0xFF
ands R1 , R1, #0xFF
lab1 условие выполняется всегда
lab2 это условие и все что дальше, будет выполнятся если R1 && 0xFF истинно.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 17 2009, 22:21
Сообщение #37


Гуру
******

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



Цитата(sergey sva @ Jan 18 2009, 01:11) *
lab1 условие выполняется всегда
lab2 это условие и все что дальше, будет выполнятся если R1 && 0xFF истинно.

Ничего не понимаю. Что такое lab1 и lab2?
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 17 2009, 22:29
Сообщение #38


Гуру
******

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



Виноват, не корректно поставил вопрос.

Если правильно понял:
mov R1 , #0xFF
ands R1 , R1, #0xFF
mov R2 , #0xFF @этот код выполняется всегда
mov R3 , #0xFF @этот код и все что дальше, будет выполнятся если R1 && 0xFF истинно.
.....
....

Сообщение отредактировал sergey sva - Jan 17 2009, 22:30
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 17 2009, 22:33
Сообщение #39


Гуру
******

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



Цитата(sergey sva @ Jan 18 2009, 01:29) *
Если правильно понял:


mov R1, #0xFF
ands R1, R1, #0xFF
movne R2 , #0xFF ; этот код выполняется, если R1 & 0xFF != 0
mov R3 , #0xFF ;этот код выполняется всегда
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 18 2009, 13:38
Сообщение #40


Гуру
******

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



Что проверяет _check_mapping: , для чего сохранять 0x12345678 в конец таблицы векторов, по адресу 0x200014 . ?

Код
_check_mapping:
    ldr    r0, =0x200014
    mov    r1, #0x14
    ldr    r2, =0x12345678
    str    r2, [r0]
    ldr    r0, [r1]
    cmp    r0, r2
    beq    _check_mapping_end
_mem_remap:
    @ RAM remap
    ldr    r0, =MC_BASE
    mov    r1, #1
    str    r1, [r0, #MC_RCR]
_check_mapping_end:
    mov    r0, #0x14
    mov    r1, #0
    str    r1, [r0]
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 18 2009, 13:44
Сообщение #41


Гуру
******

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



check_mapping пишет 0x12345678 по адресу 0x200014 и проверяет, что по адресу 0x14 записано то же самое (т.е. ОЗУ отмаплено в нулевой адрес). Если это не так, выполняется remap.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 18 2009, 16:08
Сообщение #42


Гуру
******

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



Объясните, пожалуйста
Код
    AREA code1, DATA, READWRITE  @ DATA  эта директива как то влияет  на код , или это для удобства чтения кода ?

regs_temp            @метка
    SPACE    0x40  @указатель на структуру  0х40 ?

    END                 @ конец AREA1,  или  всей страницы кода?


Сообщение отредактировал sergey sva - Jan 18 2009, 16:08
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 18 2009, 16:30
Сообщение #43


Гуру
******

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



Цитата(sergey sva @ Jan 18 2009, 19:08) *
Объясните, пожалуйста
Код
    AREA code1, DATA, READWRITE  @ DATA  эта директива как то влияет  на код , или это для удобства чтения кода ?

regs_temp            @метка
    SPACE    0x40  @указатель на структуру  0х40 ?

    END                 @ конец AREA1,  или  всей страницы кода?

AREA - указывает название и тип сегмента для линковки.
SPACE n - резервирует n байт памяти
END - конец файла

Все вышеперечисленное имеет смысл только для RVCT. У GCC дериктивы будут другими (.section, .zero и т.д).
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 18 2009, 18:10
Сообщение #44


Гуру
******

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



Поправите если что не так понял. Изучаю доку, но не все же не понятно,
CPSR регистр статуса и регистр сохранного статуса SPSR , SPSR это резервный регист, в него нужно программно сохранять статус или он сам сохраняет
CPSR что то я не где это не нашел. Еще в программе обработки исключительной ситуации, вместе с включением прерываний ядро переключается в ABORT_MODE, а где его переводить в USER_MODE?
CODE

DATA_ABORT_handler:
sub r14, r14, #0x04
@ регистр связи r14 = r14 - 0x04
stmfd r13!, {r14}
@ Сохранить регистр R14 в Стеке
stmfd r13!, {r0-r3, r12}
@ Сохранить регистры r0 - r3 и r12 в Стеке
ldr r0, = regs_temp
@ Сохранить в r0 адрес структуры regs_temp
str r14, [r0], #0x04
@ Сохранить r14 в в структуре regs_temp
mov r14, r0
@ Записать в регистр связи адрес regs_temp
ldr r0, [r13]
@ Прочитать r0 из стека
stmia r14!, {r0-r12}
@ Сохранит в regs_temp регистры r0 - r12
mov r0, r14
@ Записать в r0 r14(адрес regs_temp)
mrs r14, SPSR
@ сохранить в r14, копию сохраненого статуса программы
stmfd r13!, {r14}
@ Сохранить в стеке регистр r14
orr r14, r14, #F_BIT
orr r14, r14, #I_BIT
@ запрет прерываний, логическое или r14 = r14 || #F_BIT || #I_BIT
msr CPSR_c, r14
@ запись в регистр статуса
stmia r0!, {r13-r14}
@ Сохранит в regs_temp регистры r13-r14
and r0, #F_BIT
and r0, #I_BIT
and r0, #ABT_MODE
@ логическое и, разрешение прерываний, переключение режима работы в аварийный.
@ r0 = r0 && #F_BIT && #I_BIT && #ABT_MODE
msr CPSR_c, r0
@ Записать в CPSR r0
ldr r0, = regs_temp
@ Записать в r0 указатель на regs_temp
@ bl func_obr_data_abort **** Вызов функции C
ldmfd r13!, {r0}
@ прочитать из стека r0
msr SPSR_c, r0
@ записать в регистр статуса r0. Возврат статуса.
ldmfd r13!, {r0-r3, r12, pc}^
@ Возврат програмного счетчика, и регистров r0-r3 r12 pc
@----------------------------------------------------------------------------------------

Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 18 2009, 19:28
Сообщение #45


Гуру
******

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



Код
    sub    r14,       r14, #0x04         @ LR_abt = LR_abt - 0x04
    stmfd  r13!,     {r14}               @ Сохранить LR_abt на стеке ABT
    stmfd  r13!,     {r0-r3, r12}        @ Сохранить r0 - r3 и r12 на стеке ABT
    ldr    r0, =      regs_temp          @ Загрузить в r0 адрес структуры regs_temp
    str    r14,      [r0], #0x04         @ Сохранить LR_abt в структуре regs_temp
    mov    r14,       r0                 @ Записать в LR_abt адрес regs_temp+4
    ldr    r0,       [r13]               @ Прочитать r0 из стека ABT
    stmia  r14!,     {r0-r12}            @ Сохранить в regs_temp+4 регистры r0 - r12
    mov    r0,        r14                @ Записать в r0 LR_abt (адрес regs_temp+56)
    mrs    r14,       SPSR               @ Загрузить в LR_abt копию сохраненого статуса программы
    stmfd  r13!,     {r14}               @ Сохранить в стеке ABT регистр LR_abt
    orr    r14,       r14, #F_BIT        @ запрет прерываний, побитовое ИЛИ r14 = r14 | #F_BIT | #I_BIT
    orr    r14,       r14, #I_BIT
    msr    CPSR_c,    r14                @ запись в регистр статуса, переключение в режим XXX
    stmia  r0!,      {r13-r14}           @ Сохранить в regs_temp+56 регистры SP_XXX и LR_XXX
    and    r0,       #F_BIT              @ ????????
    and    r0,       #I_BIT              @ ????????
    and    r0,       #ABT_MODE           @ ????????
    msr    CPSR_c,    r0                 @ Записать в CPSR r0, переключение в режим ABT
    ldr    r0, =     regs_temp           @ Записать в r0 указатель на regs_temp
@    bl     func_obr_data_abort           @ Вызов функции C
    ldmfd  r13!,     {r0}                @ прочитать r0 из стека ABT
    msr    SPSR_c,    r0                 @ записать в регистр сохраненного статуса r0. Возврат статуса.
    ldmfd  r13!,     {r0-r3, r12, pc}^   @ Возврат програмного счетчика, и регистров r0-r3 r12 pc, переключение в режим XXX


Вот здесь у вас что-то, мягко говоря, странное написано:
Код
    and    r0,       #F_BIT
    and    r0,       #I_BIT
    and    r0,       #ABT_MODE
    msr    CPSR_c,    r0


Цитата(sergey sva @ Jan 18 2009, 21:10) *
SPSR это резервный регист, в него нужно программно сохранять статус или он сам сохраняет CPSR

Сам сохраняет.

Цитата(sergey sva @ Jan 18 2009, 21:10) *
Еще в программе обработки исключительной ситуации, вместе с выключением прерываний ядро переключается в ABORT_MODE, а где его переводить в USER_MODE?

Обратите внимание на "^" в последней инструкции.
Go to the top of the page
 
+Quote Post

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

 


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


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