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

 
 
10 страниц V  « < 3 4 5 6 7 > »   
Reply to this topicStart new topic
> startup asm
sergey sva
сообщение Jan 20 2009, 20:29
Сообщение #61


Гуру
******

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



Сделайте замечания, по FIQ обработчику.
Код
@----------------------------------------------------------------------------------------
FIQ_handler:
    sub   r14,       r14, #0x04         @ LR_FIQ - 4
    mrs   r8 ,       SPSR               @ сохранить в регистре R8_FIQ статуса программы до прерывания (SPSR)
    stmfd sp!,      {r0}                @ сохранить в стеке FIQ регистры r0
    mrs   r9 ,       CPSR               @ сохранить в R9_FIQ текущий статус CPSR
    bic   r9 ,       r9 , #F_BIT        @ логическое И НЕТ С сохранением в R9_FIQ
    orr   r9 ,       r9 , #SYS_MODE     @ логическое ИЛИ с сохранением в R9_FIQ
    msr   CPSR_c,    r9                 @ Запись в CPSR R9_FIQ, разрешение прерывания и переключения в режим SYS
    stmfd sp!,      {r1-r3, r12, r14}   @ сохраняем в стеке R1 - R3 и RL_SYS
@    bl        fiq_handler              @ Вызов си обработчика
    ldmfd sp!,      {r1-r3, r12, r14}   @ чтение из стека SYS регистров R1-R3 и RL_SYS
    mrs   r0,        CPSR               @ запись в R0 текущий статус CPSR
    bic   r0,        r0, #SYS_MODE      @ логическое И НЕТ c сохранением в R0
    orr   r0,        r0, #F_BIT | FIQ_MODE @ логическое ИЛИ с сохранением в R0
    msr   CPSR_c,    r0                 @ Запрет прерываний и переключение в FIQ_MODE
    ldr   r0, =      AT91C_BASE_AIC     @ запись в R0 базовый адрес AIC
    str   r0,       [r0, #AIC_EOICR]    @ запись R0 по адресу R0 + #AIC_EOICR (окончание прерывания)
    ldmfd sp!,      {r0}                @ чтение из стека FIQ R0
    msr   SPSR_cxsf, r8                 @ возврат режима,
   ldmfd  sp!,      {pc}^               @ запись в pc, модифицированого RL_FIQ

@----------------------------------------------------------------------------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 20 2009, 20:59
Сообщение #62


Гуру
******

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



Цитата(sergeeff @ Jan 20 2009, 21:25) *
По п.1. Ручное чтение AIC_IVR не такое уж зло. При этом достаточно написать один обработчик прерываний для всех функций прерываний, а не обрамлять каждую из них соответствуюшим кодом.

В данном случае зло, ибо обработчик не делает ничего полезного.

Цитата(sergeeff @ Jan 20 2009, 21:25) *
По п.2 Переход в режим SYS с запрещенными прерываниями. Так и вы тоже самое делаете в приведенном примере для вложенных прерываний.

Да, но я-то прерывания включаю, а не бестолково меняю один режим на другой!

Цитата(sergey sva @ Jan 20 2009, 23:29) *
Сделайте замечания, по FIQ обработчику.

Могу сделать одно, зато глобальное: использование подобного обработчика не имеет смысла.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 20 2009, 21:11
Сообщение #63


Гуру
******

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



>Могу сделать одно, зато глобальное: использование подобного обработчика не имеет смысла.
Тоже хорошо, как говорится тяжело в учении легко в бою. smile.gif . Если не затруднит, на что обратить внимание ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 20 2009, 21:52
Сообщение #64


Гуру
******

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



Цитата(sergey sva @ Jan 21 2009, 00:11) *
Тоже хорошо, как говорится тяжело в учении легко в бою. smile.gif . Если не затруднит, на что обратить внимание ?

Логика приоритетов в AIC на FIQ не распространяется, источники Fast Forcing нужно снимать вручную, поэтому переключать режим и разрешать FIQ смысла не имеет - вложенности все равно не будет.

Если же абстрагироваться от этих моментов, то тут у Вас ошибка:
Код
    mrs   r8 ,       SPSR               @ сохранить в регистре R8_FIQ статуса программы до прерывания (SPSR)

Сохранять при таком раскладе что-либо в R8 нельзя, так как он может перетереться следующим прерыванием.

Цитата(sergeeff @ Jan 20 2009, 21:25) *
Кстати, как то набрел на такой обработчик, который короче и быстрее, но требует 128 байт в irq стеке:

А еще некорректно работает с CPSR.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 20 2009, 23:30
Сообщение #65


Гуру
******

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



При входе в FIQ прерывание ,запрещаются автоматом,
тогда обработчик должен: сохранить регистр связи и SPSR , r1- r3 , после перейти на обработку
прерывания, после окончания си обработки, сбросить AIC , во становить CPSR. ?
Код
@----------------------------------------------------------------------------------------
FIQ_handler:
    sub   r14,       r14, #0x04         @ LR_FIQ - 4
    stmfd sp!,      {r0-r3,r14}         @ сохранить в стеке FIQ, регистры LR R0-R3, sp - 0x04
    mrs   r8 ,       SPSR               @ сохранить в регистре R8_FIQ статуса программы до прерывания (SPSR)
@    bl        fiq_handler              @ Вызов си обработчика
    ldr   r9, =      AT91C_BASE_AIC     @ запись в R9 базовый адрес AIC
    str   r9,       [r9, #AIC_EOICR]    @ запись R9 по адресу R9 + #AIC_EOICR (окончание прерывания)
    msr   SPSR_cxsf, r8                 @ возврат режима,
   ldmfd  sp!,      {r0-r3,pc}^         @ запись в pc, модифицированого RL_FIQ востановление  R0-R3 обновление CPSR

@----------------------------------------------------------------------------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 21 2009, 00:05
Сообщение #66


Гуру
******

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



SPSR-то зачем сохранять?

Можно извратиться так:
Код
FIQ_handler:
    sub   r14, r14, #4
    stmfd sp!, {r14}
    mov   r8, r0
    mov   r9, r1
    mov   r10, r2
    mov   r11, r3
    bl    fiq_handler_c
    mov   r3, r11
    mov   r2, r10
    mov   r1, r9
    mov   r0, r8
    ldmfd sp!, {pc}^

А можно и просто поручить все это дело компилятору.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 21 2009, 09:16
Сообщение #67


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

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



Цитата(aaarrr @ Jan 21 2009, 01:52) *
А еще некорректно работает с CPSR.


Если не трудно, поясните, пожалуйста, в чем видится некорректность работы с CPSR?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 21 2009, 10:06
Сообщение #68


Гуру
******

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



Цитата(sergeeff @ Jan 21 2009, 12:16) *
Если не трудно, поясните, пожалуйста, в чем видится некорректность работы с CPSR?

Нельзя писать "потолочные" значения в зарезервированные биты CPSR. То есть правильный подход это чтение-модификация-запись.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 21 2009, 10:51
Сообщение #69


Гуру
******

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



Цитата
SPSR-то зачем сохранять?

Можно извратиться так:
CODE
FIQ_handler:
sub r14, r14, #4
stmfd sp!, {r14}
mov r8, r0
mov r9, r1
mov r10, r2
mov r11, r3
bl fiq_handler_c
mov r3, r11
mov r2, r10
mov r1, r9
mov r0, r8
ldmfd sp!, {pc}^

А можно и просто поручить все это дело компилятору.


Вложенность на FIQ сделать нельзя ? Информировать AIC об окончании прерывания FIQ не нужно str r9, [r9, #AIC_EOICR] ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 21 2009, 10:58
Сообщение #70


Гуру
******

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



Цитата(sergey sva @ Jan 21 2009, 13:51) *
Вложенность на FIQ сделать нельзя ? Информировать AIC об окончании прерывания FIQ не нужно str r9, [r9, #AIC_EOICR] ?

Вложенность теоретически сделать можно, но через Ж: определяем источник, сбрасываем источник, сбрасываем Source0 в AIC, разрешаем FIQ. Но при таком раскладе смысл FIQ теряется, да и приоритетов все равно не будет. EOICR писать не нужно.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 21 2009, 12:17
Сообщение #71


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

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



Цитата(aaarrr @ Jan 21 2009, 14:06) *
Нельзя писать "потолочные" значения в зарезервированные биты CPSR. То есть правильный подход это чтение-модификация-запись.


Обратимся к первоисточнику : ARM Architecture Reference Manual, 2005, p.A4-78
Цитата
You must normally update the value of a PSR by moving the PSR to a general-purpose register (using the
MRS instruction), modifying the relevant bits of the general-purpose register, and restoring the updated
general-purpose register value back into the PSR (using the MSR instruction). For example, a good way to
switch the ARM to Supervisor mode from another privileged mode is:

MRS R0,CPSR ; Read CPSR
BIC R0,R0,#0x1F ; Modify by removing current mode
ORR R0,R0,#0x13 ; and substituting Supervisor mode
MSR CPSR_c,R0 ; Write the result back to CPSR

For maximum efficiency, MSR instructions should only write to those fields that they can potentially change.
For example, the last instruction in the above code can only change the CPSR control field, as all bits in the
other fields are unchanged since they were read from the CPSR by the first instruction. So it writes to
CPSR_c, not CPSR_fsxc or some other combination of fields.


таким образом, устанавливаются только контрольные биты в статус регистре.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 21 2009, 13:02
Сообщение #72


Гуру
******

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



Цитата(sergeeff @ Jan 21 2009, 15:17) *
таким образом, устанавливаются только контрольные биты в статус регистре.

Согласен, хотя выделили Вы не совсем тот фрагмент первоисточника:
Цитата
The immediate form must therefore only be used
when the intention is to modify all the bits in the specified fields and, in particular, must not be used if the
specified fields include any as-yet-unallocated bits.

Так как в control field заменяются все биты, то immediate form можно применить.

Справедливости ради замечу, что в старых выпусках ARM7TDMI Datasheet упоминались только CPSR_flg и CPSR, т.е. варианта CPSR_c не было вообще.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 21 2009, 15:51
Сообщение #73


Гуру
******

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



Сделайте замечания, дайте советы, smile.gif если не затруднит.
CODE
.include "crtinc.s"
@----------------------------------------------------------------------------------------
.section .text
.arm
.code 32
.global _start
_start:
@----------------------------------------------------------------------------------------
@ Таблица векторов исключительных ситуаций
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,[pc,#-0xF20] @ IRQ
ldr pc,[pc,#-0xF20] @ FIQ

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
@----------------------------------------------------------------------------------------
RESET_handler:
ldr r0, = STACK
msr cpsr_c, #(UNDEF_MODE | I_BIT | F_BIT)
mov sp, r0
sub r0, r0, #UNDEF_STACK_SIZE
msr cpsr_c, #(ABT_MODE | I_BIT | F_BIT)
mov sp, r0
sub r0, r0, #ABT_STACK_SIZE
msr cpsr_c, #(FIQ_MODE | I_BIT | F_BIT)
mov sp, r0
sub r0, r0, #FIQ_STACK_SIZE
msr cpsr_c, #(IRQ_MODE | I_BIT | F_BIT)
mov sp, r0
sub r0, r0, #IRQ_STACK_SIZE
msr cpsr_c, #(SVC_MODE | I_BIT | F_BIT)
mov sp, r0
sub r0, r0, #SVC_STACK_SIZE
msr cpsr_c, #USR_MODE
mov sp, r0
sub sl, sp, #USR_STACK_SIZE
@----------------------------------------------------------------------------------------
@ WatchDog
ldr r0, = WDT_BASE
ldr r1, = WDD_IS
str r1, [r0, #WDT_MR]
@----------------------------------------------------------------------------------------
@ EFC
ldr r0, = MC_BASE
ldr r1, = MC_FWS
str r1, [r0, #MC_FMR]
@----------------------------------------------------------------------------------------
@ включение тактового генератора и установка времени запуска
ldr r0, = PMC_BASE
ldr r1, = PMC_MOR_Val
str r1, [r0, #PMC_MOR]
@ проверка, тактовый генератор стабилизирован или нет
ldr r2, [r0, #PMC_SR]
ands r2, r2, #PMC_MOSCS
@ bne func mainclock ne stabiln******
@ настройка PMC_USBDIV PMC_MUL PMC_OUT PMC_PLLCOUNT PMC_DIV
ldr r1, = PMC_PLLR_Val
str r1, [r0, #PMC_PLLR]
@ Проверка, ФАПЧ зафиксирована
ldr r2, [r0, #PMC_SR]
ands r2, r2, #PMC_LOCK
@ bne func pll not lock*******
@ установка предделителя, главного генератора
ldr r1, = PMC_PRES
str r1, [r0, #PMC_MCKR]
@ проверка главного генератора готов или нет
ldr r2, [r0, #PMC_SR]
ands r2, r2, #PMC_MCKRDY
@ bne func mainosc not redy******
@ выбор источника генератора и настройка предварительного делителя
ldr r1, = PMC_MCKR_Val
str r1, [r0, #PMC_MCKR]
@ проверка главного генератора готов или нет
ldr r2, [r0, #PMC_SR]
ands r2, r2, #PMC_MCKRDY
@ bne func mainosc not redy******
@----------------------------------------------------------------------------------------
.if REMAP
@ запись таблици векторов прерываний в RAM
ldr r0, = _start
ldr r1, = INTERNAL_RAM_START
ldr r2, = INTERRUPT_VECTORS_END
copy:
ldr r3, [r0], #4
str r3, [r1], #4
cmp r0, r2
bne copy
@ проверка был ремап, или нет.
@ запись значения 0x12345678 по адресу 0x200014
@ после выполняется сравнение что по адресу 0x200014 и 0x14 если равно,
@ то ремап выполнялся
ldr r0, = 0x200014
mov r1, #0x14
ldr r2, = 0x12345678
str r2, [r0]
ldr r0, [r1]
cmp r0, r2
beq remap_end
@ выполнение перераспределения памяти
ldr r0, = MC_BASE
mov r1, #1
str r1, [r0, #MC_RCR]
@ Запись 0х00 по адресу 0x14
remap_end:
mov r0, #0x14
mov r1, #0
str r1, [r0]
.endif
@----------------------------------------------------------------------------------------
@ сдесь инициализация векторов прерываний

@----------------------------------------------------------------------------------------
@ Вызов функции main
mov r0, #0
mov r1, #0
mov r2, #0
mov r3, #0
mov r4, #0
bl main
__main_exit:
b __main_exit
@----------------------------------------------------------------------------------------
DATA_ABORT_handler:
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 | I_BIT @ запрет прерываний, побитовое ИЛИ r14 = r14 | #F_BIT | #I_BIT
msr CPSR_c, r14 @ запись в регистр статуса, переключение в режим который был до режима ABORT
stmia r0!, {r13-r14} @ Сохранить в regs_temp+56 регистры SP_XXX и LR_XXX, r0 + 0x08
mrs r0, CPSR @ чтение текущего статуса в r0
orr r0, r0, #F_BIT |I_BIT|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
@----------------------------------------------------------------------------------------
FIQ_handler:
sub r14, r14, #0x04 @ LR_FIQ - 4
stmfd sp!, {r0-r3,r14} @ сохранить в стеке FIQ, регистры LR R0-R3, sp - 0x04
@ bl fiq_handler @ Вызов си обработчика
ldmfd sp!, {r0-r3,pc}^ @ запись в pc, модифицированого RL_FIQ востановление R0-R3 обновление CPSR
@----------------------------------------------------------------------------------------
IRQ_handler:
sub r14, r14, #0x04 @ LR_IRQ - 4
stmfd sp!, {r14} @ сохранить в стеке IRQ, регистры LR sp +0x04
mrs r14, SPSR @ сохранить в регистре RL_IRQ статуса программы до прерывания (SPSR)
stmfd sp!, {r0, r14} @ сохранить в стеке IRQ регистры r0 r14
mrs r14, CPSR @ сохранить в RL_IRQ текущий статус CPSR
bic r14, r14, #I_BIT @ логическое И НЕТ С сохранением в RL_IRQ
orr r14, r14, #SYS_MODE @ логическое ИЛИ с сохранением в RL_IRQ
msr CPSR_c, r14 @ Запись в CPSR RL_IRQ, разрешение прерывания и переключения в режим SYS
stmfd sp!, {r1-r3, r12, r14} @ сохраняем в стеке R1 - R3 и RL_SYS
@ bl irq_handler @ Вызов си обработчика
ldmfd sp!, {r1-r3, r12, r14} @ чтение из стека SYS регистров R1-R3 и RL_SYS
mrs r0, CPSR @ запись в R0 текущий статус CPSR
bic r0, r0, #SYS_MODE @ логическое И НЕТ c сохранением в R0
orr r0, r0, #I_BIT | IRQ_MODE @ логическое ИЛИ с сохранением в R0
msr CPSR_c, r0 @ Запрет прерываний и переключение в IRQ_MODE
ldr r0, = AIC_BASE @ запись в R0 базовый адрес AIC
str r0, [r0, #AIC_EOICR] @ запись R0 по адресу R0 + #AIC_EOICR (окончание прерывания)
ldmfd sp!, {r0, r14} @ чтение из стека IRQ R0 ,R14
msr SPSR_cxsf, r14 @ возврат режима,
ldmfd sp!, {pc}^ @ запись в pc, модифицированого RL_IRQ
@----------------------------------------------------------------------------------------
PREFETCH_ABORT_handler:
sub r14, r14, #0x04 @ LR_Pabt = LR_abt - 0x04
stmfd r13!, {r14} @ Сохранить LR_abt на стеке PABT
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 | I_BIT @ запрет прерываний, побитовое ИЛИ r14 = r14 | #F_BIT | #I_BIT
msr CPSR_c, r14 @ запись в регистр статуса, переключение в режим который был до режима ABORT
stmia r0!, {r13-r14} @ Сохранить в regs_temp+56 регистры SP_XXX и LR_XXX, r0 + 0x08
mrs r0, CPSR @ чтение текущего статуса в r0
orr r0, r0, #F_BIT |I_BIT|ABT_MODE
msr CPSR_c, r0 @ Записать в CPSR r0, переключение в режим ABT
ldr r0, = regs_temp @ Записать в r0 указатель на regs_temp
@ bl func_obr_Pdata_abort @ Вызов функции C
ldmfd r13!, {r0} @ прочитать r0 из стека ABT
msr SPSR_c, r0 @ записать в регистр сохраненного статуса r0. Возврат статуса.
ldmfd r13!, {r0-r3, r12, pc}^ @ Возврат програмного счетчика, и регистров r0-r3 r12 pc, переключение в режим XXX
@----------------------------------------------------------------------------------------
UNDEF_handler:
sub r14, r14, #0x04 @ LR_Pabt = LR_udef - 0x04
stmfd r13!, {r14} @ Сохранить LR_udef на стеке PABT
stmfd r13!, {r0-r3, r12} @ Сохранить r0 - r3 и r12 на стеке udef
ldr r0, = regs_temp @ Загрузить в r0 адрес структуры regs_temp
str r14, [r0], #0x04 @ Сохранить LR_udef в структуре regs_temp
mov r14, r0 @ Записать в LR_udef адрес regs_temp+4
ldr r0, [r13] @ Прочитать r0 из стека udef
stmia r14!, {r0-r12} @ Сохранить в regs_temp+4 регистры r0 - r12
mov r0, r14 @ Записать в r0 LR_udef (адрес regs_temp+56)
mrs r14, SPSR @ Загрузить в LR_udef копию сохраненого статуса программы
stmfd r13!, {r14} @ Сохранить в стеке udef регистр LR_udef
orr r14, r14, #F_BIT | I_BIT @ запрет прерываний, побитовое ИЛИ r14 = r14 | #F_BIT | #I_BIT
msr CPSR_c, r14 @ запись в регистр статуса, переключение в режим который был до режима udef
stmia r0!, {r13-r14} @ Сохранить в regs_temp+56 регистры SP_XXX и LR_XXX, r0 + 0x08
mrs r0, CPSR @ чтение текущего статуса в r0
orr r0, r0, #F_BIT |I_BIT|UNDEF_MODE
msr CPSR_c, r0 @ Записать в CPSR r0, переключение в режим UNDEF_MODE
ldr r0, = regs_temp @ Записать в r0 указатель на regs_temp
@ bl func_obr_udef @ Вызов функции C
ldmfd r13!, {r0} @ прочитать r0 из стека udef
msr SPSR_c, r0 @ записать в регистр сохраненного статуса r0. Возврат статуса.
ldmfd r13!, {r0-r3, r12, pc}^ @ Возврат програмного счетчика, и регистров r0-r3 r12 pc, переключение в режим XXX
@----------------------------------------------------------------------------------------
SWI_handler:
sub r14, r14, #0x04 @ LR_SWI - 4
stmfd sp!, {r0-r3,r14} @ сохранить в стеке SWI, регистры LR R0-R3, sp - 0x04
@ bl swi_handler @ Вызов си обработчика
ldmfd sp!, {r0-r3,pc}^ @ запись в pc, модифицированого RL_FIQ востановление R0-R3 обновление CPSR
@----------------------------------------------------------------------------------------



regs_temp:
.SPACE 0x40

.end

Модератор. Да научитесь же наконец пользоваться тегами правильно! Для вставки объемных исходников вместо code используйте codebox.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 21 2009, 16:04
Сообщение #74


Гуру
******

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



Что-то я не нашел INTERRUPT_VECTORS_END. А регистры зачем очищать перед вызовом main?
FIQ и SWI handlers в таком виде не нужны вообще - поручите все компилятору (у GCC, правда, был какой-то древний глюк с генерацией пролога/эпилога).

На всякий случай прикладываю свой код запуска генератора и PLL:
CODE

; ***************************************************************************
; * PLL

; Flash Wait State Setup
ldr r0, =AT91C_BASE_MC
mov r1, #AT91C_MC_FWS_1FWS
str r1, [r0, #MC_FMR]

; Watchdog Disable
ldr r0, =AT91C_BASE_WDTC
mov r1, #AT91C_WDTC_WDDIS
str r1, [r0, #WDTC_WDMR]

; Set AT91C_MASTER_CLOCK at 55 296 000

ldr r0, =AT91C_BASE_PMC

; 1 Enabling the Main Oscillator:
; SCK = 1/32768 = 30.51 uSecond
; Start up time = 8 * 6 / SCK = 56 * 30.51 = 1,46484375 ms

mov r1, #(0x06 :SHL: 0x08)
orr r1, r1, #AT91C_CKGR_MOSCEN
str r1, [r0, #PMC_MOR]

; Wait the startup time
0
ldr r1, [r0, #PMC_SR]
tst r1, #AT91C_PMC_MOSCS
beq %B0

; 2 Checking the Main Oscillator Frequency (Optional)
; 3 Setting PLL and divider:
; - div by 1 Fin = 18,432
; - Mul 5+1: Fout = 110,592 = (18,432 * 6)
; Field out NOT USED = 0
; PLLCOUNT pll startup time estimate at : 0.844 ms
; PLLCOUNT 28 = 0.000844 /(1/32768)

mov r1, #0x01 ; AT91C_CKGR_DIV
orr r1, r1, #(0x1c :SHL: 0x08) ; AT91C_CKGR_PLLCOUNT
orr r1, r1, #(0x05 :SHL: 0x10) ; AT91C_CKGR_MUL
orr r1, r1, #AT91C_CKGR_USBDIV_1
str r1, [r0, #PMC_PLLR]

; Wait the startup time
0
ldr r1, [r0, #PMC_SR]
tst r1, #AT91C_PMC_LOCK
beq %B0
0
ldr r1, [r0, #PMC_SR]
tst r1, #AT91C_PMC_MCKRDY
beq %B0

; 4. Selection of Master Clock and Processor Clock
; select the PLL clock divided by 2

mov r1, #AT91C_PMC_PRES_CLK_2
str r1, [r0, #PMC_MCKR]
0
ldr r1, [r0, #PMC_SR]
tst r1, #AT91C_PMC_MCKRDY
beq %B0

ldr r1, [r0, #PMC_MCKR]
orr r1, r1, #AT91C_PMC_CSS_PLL_CLK
str r1, [r0, #PMC_MCKR]
0
ldr r1, [r0, #PMC_SR]
tst r1, #AT91C_PMC_MCKRDY
beq %B0
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Jan 21 2009, 16:32
Сообщение #75


Гуру
******

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



>Что-то я не нашел INTERRUPT_VECTORS_END
> FIQ и SWI handlers в таком виде не нужны вообще - поручите все компилятору (у GCC, правда, был какой-то древний глюк с генерацией
> пролога/эпилога).

Куда должен указывать INTERRUPT_VECTORS_END ?
А если использовать свои FIQ и SWI handlers то что в них добавить исключить?
Компилятору пока не хочется поручать, хочу разобраться как все это работает smile.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 23:51
Рейтинг@Mail.ru


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