Перейти к содержанию
    

Сделайте замечания, по 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

@----------------------------------------------------------------------------------------

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По п.1. Ручное чтение AIC_IVR не такое уж зло. При этом достаточно написать один обработчик прерываний для всех функций прерываний, а не обрамлять каждую из них соответствуюшим кодом.

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

 

По п.2 Переход в режим SYS с запрещенными прерываниями. Так и вы тоже самое делаете в приведенном примере для вложенных прерываний.

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

 

Сделайте замечания, по FIQ обработчику.

Могу сделать одно, зато глобальное: использование подобного обработчика не имеет смысла.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

>Могу сделать одно, зато глобальное: использование подобного обработчика не имеет смысла.

Тоже хорошо, как говорится тяжело в учении легко в бою. :) . Если не затруднит, на что обратить внимание ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тоже хорошо, как говорится тяжело в учении легко в бою. :) . Если не затруднит, на что обратить внимание ?

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

 

Если же абстрагироваться от этих моментов, то тут у Вас ошибка:

    mrs   r8 ,       SPSR               @ сохранить в регистре R8_FIQ статуса программы до прерывания (SPSR)

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

 

Кстати, как то набрел на такой обработчик, который короче и быстрее, но требует 128 байт в irq стеке:

А еще некорректно работает с CPSR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При входе в 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

@----------------------------------------------------------------------------------------

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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}^

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А еще некорректно работает с CPSR.

 

Если не трудно, поясните, пожалуйста, в чем видится некорректность работы с CPSR?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если не трудно, поясните, пожалуйста, в чем видится некорректность работы с CPSR?

Нельзя писать "потолочные" значения в зарезервированные биты CPSR. То есть правильный подход это чтение-модификация-запись.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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] ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вложенность на FIQ сделать нельзя ? Информировать AIC об окончании прерывания FIQ не нужно str r9, [r9, #AIC_EOICR] ?

Вложенность теоретически сделать можно, но через Ж: определяем источник, сбрасываем источник, сбрасываем Source0 в AIC, разрешаем FIQ. Но при таком раскладе смысл FIQ теряется, да и приоритетов все равно не будет. EOICR писать не нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нельзя писать "потолочные" значения в зарезервированные биты 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.

 

таким образом, устанавливаются только контрольные биты в статус регистре.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

таким образом, устанавливаются только контрольные биты в статус регистре.

Согласен, хотя выделили Вы не совсем тот фрагмент первоисточника:

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 не было вообще.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделайте замечания, дайте советы, :) если не затруднит.

.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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то я не нашел INTERRUPT_VECTORS_END. А регистры зачем очищать перед вызовом main?

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

 

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

; ***************************************************************************
; *    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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

>Что-то я не нашел INTERRUPT_VECTORS_END

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

> пролога/эпилога).

 

Куда должен указывать INTERRUPT_VECTORS_END ?

А если использовать свои FIQ и SWI handlers то что в них добавить исключить?

Компилятору пока не хочется поручать, хочу разобраться как все это работает :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...