Эти примеры ориентированы на С - без классов Точнее, в этих примерах в cstartup нет запуска конструкторов глобальных объектов. Я как раз с этих примеров и начинал разбираться в процессором и убил кучу времени, пока не наткнулся на сей факт. После чего с помощью представителей конференции, в частности д__, принял решение использовать за основу cstartup из стандартной IAR библиотеки. Но в примерах от Atmel и IAR библиотеке по разному инициализируется стек.
IAR:
; Mode, correspords to bits 0-5 in CPSR MODE_BITS DEFINE 0x1F ; Bit mask for mode bits in CPSR USR_MODE DEFINE 0x10 ; User mode FIQ_MODE DEFINE 0x11 ; Fast Interrupt Request mode IRQ_MODE DEFINE 0x12 ; Interrupt Request mode SVC_MODE DEFINE 0x13 ; Supervisor mode ABT_MODE DEFINE 0x17 ; Abort mode UND_MODE DEFINE 0x1B ; Undefined Instruction mode SYS_MODE DEFINE 0x1F ; System mode ;---покоцано ; Initialize the stack pointers. ; The pattern below can be used for any of the exception stacks: ; FIQ, IRQ, SVC, ABT, UND, SYS. ; The USR mode uses the same stack as SYS. ; The stack segments must be defined in the linker command file, ; and be declared above. mrs r0,cpsr ; Original PSR value bic r0,r0,#MODE_BITS ; Clear the mode bits orr r0,r0,#IRQ_MODE ; Set IRQ mode bits msr cpsr_c,r0 ; Change the mode ldr sp,=SFE(IRQ_STACK) & 0xFFFFFFF8 ; End of IRQ_STACK bic r0,r0,#MODE_BITS ; Clear the mode bits orr r0,r0,#SYS_MODE ; Set System mode bits msr cpsr_c,r0 ; Change the mode ldr sp,=SFE(CSTACK) & 0xFFFFFFF8 ; End of CSTACKAtmel:
;------------------------------------------------------------------------------ ;- Top of Stack Definition ;------------------------- ;- Interrupt and Supervisor Stack are located at the top of internal memory in ;- order to speed the exception handling context saving and restoring. ;- ARM_MODE_SVC (Application, C) Stack is located at the top of the external memory. ;------------------------------------------------------------------------------ IRQ_STACK_SIZE EQU (2*8*4) ; 2 words per interrupt priority level ARM_MODE_FIQ EQU 0x11 ARM_MODE_IRQ EQU 0x12 ARM_MODE_SVC EQU 0x13 I_BIT EQU 0x80 F_BIT EQU 0x40 ;------------------------------------------------------------------------------ ;- Setup the stack for each mode ;------------------------------- ldr r0, =__iramend ;- Set up Fast Interrupt Mode and set FIQ Mode Stack msr CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT ;- Init the FIQ register ldr r8, =AT91C_BASE_AIC ;- Set up Interrupt Mode and set IRQ Mode Stack msr CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT mov r13, r0 ; Init stack IRQ sub r0, r0, #IRQ_STACK_SIZE ;- Enable interrupt & Set up Supervisor Mode and set Supervisor Mode Stack msr CPSR_c, #ARM_MODE_SVC mov r13, r0Может это суть одно и тоже ? Отдельная тема - обработчик прерываний FIQ и IRQ, которых в библиотеке вовсе нет. Либо я плохо искал. Зато в примере от Atmel они есть, но это - другой топик. За ссылочку на arm.com - отдельное спасибо. Там действительно есть документ ARM7TDMI r4p1 Technical Reference Manual, котором есть немного информации по режимам. Мне же хотелось узнать о практическом применении разных режимов. В частности, зачем нужен режим System ? Для чего нужен режим Supervisor ?
-
- ИАРовский стартап - общий для всех АРМов, а атмеловский учитывает особенности AT91SAM7 Alexandr1(404 знак., 17.06.2005 15:03, )
- Мало конкретики Master_005(653 знак., 20.06.2005 11:48, )
- ИАРовский стартап - общий для всех АРМов, а атмеловский учитывает особенности AT91SAM7 Alexandr1(404 знак., 17.06.2005 15:03, )