SergeyVas 0 20 января, 2009 Опубликовано 20 января, 2009 · Жалоба Сделайте замечания, по 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 @---------------------------------------------------------------------------------------- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 64 20 января, 2009 Опубликовано 20 января, 2009 · Жалоба По п.1. Ручное чтение AIC_IVR не такое уж зло. При этом достаточно написать один обработчик прерываний для всех функций прерываний, а не обрамлять каждую из них соответствуюшим кодом. В данном случае зло, ибо обработчик не делает ничего полезного. По п.2 Переход в режим SYS с запрещенными прерываниями. Так и вы тоже самое делаете в приведенном примере для вложенных прерываний. Да, но я-то прерывания включаю, а не бестолково меняю один режим на другой! Сделайте замечания, по FIQ обработчику. Могу сделать одно, зато глобальное: использование подобного обработчика не имеет смысла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 20 января, 2009 Опубликовано 20 января, 2009 · Жалоба >Могу сделать одно, зато глобальное: использование подобного обработчика не имеет смысла. Тоже хорошо, как говорится тяжело в учении легко в бою. :) . Если не затруднит, на что обратить внимание ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 64 20 января, 2009 Опубликовано 20 января, 2009 · Жалоба Тоже хорошо, как говорится тяжело в учении легко в бою. :) . Если не затруднит, на что обратить внимание ? Логика приоритетов в AIC на FIQ не распространяется, источники Fast Forcing нужно снимать вручную, поэтому переключать режим и разрешать FIQ смысла не имеет - вложенности все равно не будет. Если же абстрагироваться от этих моментов, то тут у Вас ошибка: mrs r8 , SPSR @ сохранить в регистре R8_FIQ статуса программы до прерывания (SPSR) Сохранять при таком раскладе что-либо в R8 нельзя, так как он может перетереться следующим прерыванием. Кстати, как то набрел на такой обработчик, который короче и быстрее, но требует 128 байт в irq стеке: А еще некорректно работает с CPSR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 20 января, 2009 Опубликовано 20 января, 2009 · Жалоба При входе в 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 @---------------------------------------------------------------------------------------- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 64 21 января, 2009 Опубликовано 21 января, 2009 · Жалоба 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}^ А можно и просто поручить все это дело компилятору. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 21 января, 2009 Опубликовано 21 января, 2009 · Жалоба А еще некорректно работает с CPSR. Если не трудно, поясните, пожалуйста, в чем видится некорректность работы с CPSR? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 64 21 января, 2009 Опубликовано 21 января, 2009 · Жалоба Если не трудно, поясните, пожалуйста, в чем видится некорректность работы с CPSR? Нельзя писать "потолочные" значения в зарезервированные биты CPSR. То есть правильный подход это чтение-модификация-запись. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 21 января, 2009 Опубликовано 21 января, 2009 · Жалоба 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] ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 64 21 января, 2009 Опубликовано 21 января, 2009 · Жалоба Вложенность на FIQ сделать нельзя ? Информировать AIC об окончании прерывания FIQ не нужно str r9, [r9, #AIC_EOICR] ? Вложенность теоретически сделать можно, но через Ж: определяем источник, сбрасываем источник, сбрасываем Source0 в AIC, разрешаем FIQ. Но при таком раскладе смысл FIQ теряется, да и приоритетов все равно не будет. EOICR писать не нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 21 января, 2009 Опубликовано 21 января, 2009 · Жалоба Нельзя писать "потолочные" значения в зарезервированные биты 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. таким образом, устанавливаются только контрольные биты в статус регистре. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 64 21 января, 2009 Опубликовано 21 января, 2009 · Жалоба таким образом, устанавливаются только контрольные биты в статус регистре. Согласен, хотя выделили Вы не совсем тот фрагмент первоисточника: 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 не было вообще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 21 января, 2009 Опубликовано 21 января, 2009 · Жалоба Сделайте замечания, дайте советы, :) если не затруднит. .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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 64 21 января, 2009 Опубликовано 21 января, 2009 · Жалоба Что-то я не нашел 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 21 января, 2009 Опубликовано 21 января, 2009 · Жалоба >Что-то я не нашел INTERRUPT_VECTORS_END > FIQ и SWI handlers в таком виде не нужны вообще - поручите все компилятору (у GCC, правда, был какой-то древний глюк с генерацией > пролога/эпилога). Куда должен указывать INTERRUPT_VECTORS_END ? А если использовать свои FIQ и SWI handlers то что в них добавить исключить? Компилятору пока не хочется поручать, хочу разобраться как все это работает :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться