Hallo
ich will einige Funktionen (arm-gcc) ins Ram kopieren, um deren
Ausführzeiten zu beschleidnigen. Das Flash ist nur mit 16bit verbunden.
Unter http://www.embeddedrelated.com/groups/lpc2000/show/5031.php habe
ich eine Diskussion über das Thema gefunden. Dort taucht folgender
Abschnitt auf:
So to summarize, to get and use a function in RAM you only need to do
three things:
(1) Have an init in the startup code for the .data section.
(2) Use the __attribute__((section(".data"))) on the functions.
(3) Define function pointer variables for the functions and make
indirect calls using those.
Zu Punkt 1:
In meinem Startup-Code gibt es folgenden Abschnitt:
1 | /* copy initialized variables .data section (Copy from ROM to RAM) */
|
2 | ldr R1, =_etext
|
3 | ldr R2, =_data
|
4 | ldr R3, =_edata
|
5 | 1: cmp R2, R3
|
6 | ldrlo R0, [R1], #4
|
7 | strlo R0, [R2], #4
|
8 | blo 1b
|
9 |
|
10 | /* Clear uninitialized variables .bss section (Zero init) */
|
11 | mov R0, #0
|
12 | ldr R1, =_bss_start
|
13 | ldr R2, =_bss_end
|
14 | 2: cmp R1, R2
|
15 | strlo R0, [R1], #4
|
16 | blo 2b
|
17 |
|
18 | /* Enter the C code */
|
19 | b main
|
Ich hab von Assembler nicht viel Ahnung. Wenn ich den Code richtig
verstehe, wird die data Section hier ins Ram kopiert.
Zu Punkt 2:
Das ganze sollte also so aussehen:
1 | void foo(void) __attribute__ ((section ("data")));
|
Soweit verstehe ich das ganze noch. Mit dem Attribut der der Compiler
angewiesen, die Funktion in dem Bereich abzulegen, in dem die Variablen
im Ram liegen. Im Startup-Code wird dann die Funktion vom Flash ins Ram
kopiert.
Zu Punkt 3:
Es soll ein Pointer verwendet werden, um die Funktion anzusprechen, also
z.B.:
1 | void *foopointer = &foo;
|
2 | foopointer();
|
So, jetzt meine Fragen:
Funktioniert das ganze so wirklich?
Wofür wird der Umweg über den Pointer benötigt?
Vielen Dank,
Tilo