Hallo,
ich nutze ein etwas älteres AT91SAM7A3-DK Board von Atmel für die
Portierung einer Firmware auf ARM. Hierfür würde ich gerne
Software-Interrupts verwenden um vom User-Mode in den Supervisor-Mode zu
springen. Eigentlich sollte dieser Aufruf mit den nachfolgenden Code nur
ein paar Zyklen dauern, in Realität benötigt er allerdings etwa 500-700
ms. Die LED, die hier angesteuert wird, blinkt extrem langsam.
Hat jemand eine Idee woran dies liegen könnte?
LG,
jojob
1 | reset_vector:
|
2 | ldr pc, =reset_handler // Reset
|
3 | [...]
|
4 | swi_vector:
|
5 | ldr pc, =swi_handler // Software Interrupt
|
6 | [...]
|
7 | reset_handler:
|
8 | // Enable Main Oscillator, Set PLL to 96 MHz, Set MCK to 48 MHz, Set up default interrupt handler
|
9 | // Memory remap
|
10 | // Stack init
|
11 | // Copy data section
|
12 | // Clear bss section
|
13 | // branch to main
|
14 | [...]
|
15 | swi_handler:
|
16 | movs pc, r14
|
1 | int main(void) {
|
2 | while (1) {
|
3 | asm("swi #1");
|
4 | PIOA->PIO_CODR = LED_A;
|
5 | asm("swi #1");
|
6 | PIOA->PIO_SODR = LED_A;
|
7 | }
|
8 | return 0;
|
9 | }
|