Hallo
Ich habe ein Programm für den LPC2148 mit Codesourcery compiliert.
Im Source ist eine globale Variable PWM_Frequency definiert
1
uint32_tPWM_Frequency=1000;
2
3
4
voidInitPWM(uint32_tInitialFreqency)
5
{
6
SetFrequency(InitialFrequency);
7
...
8
}
Wenn ich das Programm ausführe, dan steht in der Variablen PWM_Frequency
der Wert 0. In SetFrequency wird u.a. das MR0-Registger gesetzt. Meiner
Ansicht nach müsste die Variable mit dem Wert 1000 initialisiert werden.
Übergebe ich allerdings:
1
voidInitPWM(uint32_tInitialFreqency)
2
{
3
SetFrequency(1000);
4
...
5
}
dann funktioniert das Programm.
Habt ihr vielleicht eine Idee wo das Problem liegt? Optimierung ist
ausgeschaltet. Das Problem tritt mit und ohne Debugging auf.
Grüsse
Andy
Nun ist mir noch folgendes aufgefallen, dass alle initalisierenten
Variaben um 8 verschoben im RAM stehen:
Im Map-File steht:
1
.data0x4000024b0x0./obj/lpcextio.o
2
.data0x4000024b0x0./obj/lpc2148_spi.o
3
*fill*0x4000024b0x100
4
.data0x4000024c0x8./obj/lpcspindle.o
5
0x4000024cPWM_Frequency
6
0x40000250PWM_RCFrequency
7
.data0x400002540x0./obj/misc.o
8
.data0x400002540x0./obj/ucmdbuf.o
Bei der Initialisierung im Startup-Code wird die Variable PWM-Frequency
also auf die Adresse 0x40000254 anstatt auf 0x4000024c geschrieben.
Das Problem liegt daran, dass bereits die Adresse von _etext um 8 Byte
verschoben ist. So wird sie zumindest im Startup-File geladen
Abschnitt Kopiere ROM to RAM im Startup-File
1
/* copy .data section (Copy from ROM to RAM) */
2
ldrR1,=_etext
3
ldrR2,=_data
4
ldrR3,=_edata
5
1:cmpR2,R3
6
ldrloR0,[R1],#4
7
strloR0,[R2],#4
8
blo1b
9
10
/* Clear .bss section (Zero init) */
11
movR0,#0
12
ldrR1,=_bss_start
13
ldrR2,=_bss_end
14
2:cmpR1,R2
15
strloR0,[R1],#4
16
blo2b
An welcher Schraube muss man nun drehen damit die Adresse stimmt?
Vielen Dank für eure Tipps.
>Stimmt vielleicht die Adresse im ROM nicht...?
Wo ist dein kompletter Quellcode?
Bei dem ganzen was du da oben von dir gegeben hast
sehe ich überhaupt kein einziges Problem außer das du wohl
einen Knoten im Hirn hast.
> .data 0x4000024c 0x8 ./obj/lpcspindle.o> 0x4000024c PWM_Frequency> 0x40000250 PWM_RCFrequency> .data 0x40000254 0x0 ./obj/misc.o>>Bei der Initialisierung im Startup-Code wird die Variable PWM-Frequency>also auf die Adresse 0x40000254 anstatt auf 0x4000024c geschrieben.
Wie kommst du darauf? Die Adresse ist
0x4000024c PWM_Frequency
Wie kommst du auf 0x40000254?
Den Code habe ich bisher mit WINARM übersetzt und dort hat alles
einwandfrei funktioniert. Das Problem habe ich erst seit Umstieg auf
Codesourcery. "Lediglich" der Compiler hat sich geändert. Startup-File
und Linker-File sind gleich geblieben. Habe noch ein kleineres Projekt
übersetzt und dort tritt das Problem nicht auf.
Wenn folgender Code aus dem Startup-File ausgeführt wird
1
/* copy .data section (Copy from ROM to RAM) */
2
ldrR1,=_etext
3
ldrR2,=_data
4
ldrR3,=_edata
5
1:cmpR2,R3
6
ldrloR0,[R1],#4
7
strloR0,[R2],#4
8
blo1b
dann ist der Registerstatus bei Label 1: folgender:
R1 0x00014358
R2 0x00000420
R3 0x00000690
Nach meiner Ansicht:
R1 Startadresse im Flash
R2 Zieladresse der ersten zu initialisieren Variable im RAM
R3 Endadresse RAM
Nach Ende der Schleife steht dann PWM Frequency
(z.B 0xAABBCCDD) erst achten Stelle weiter hinten im RAM - also
0x4000024C + 8 = 0x40000254 !
0x4000024c: xx xx xx xx xx xx xx xx DD CC BB AA xx xx xx xx
Deshalb komme ich auf 0x40000254
1
*(.data)
2
.data0x400002000x0./obj/crt.o
3
.data0x400002000x0./obj/main.o
4
.data0x400002000x0./obj/manual.o
5
.data0x400002000x0./obj/cal.o
6
.data0x400002000x0./obj/ujo.o
7
.data0x400002000x0./obj/umot.o
8
.data0x400002000x4c./obj/upc.o
9
0x40000200FIRMWARE_VERSION
10
0x40000224CONTROLLER_VERSION
11
0x40000234COMPILAT
12
.data0x4000024c0x0./obj/ujogbuf.o
13
.data0x4000024c0x0./obj/lpcusb.o
14
.data0x4000024c0x0./obj/usbstdreq.o
15
.data0x4000024c0x0./obj/usbcontrol.o
16
.data0x4000024c0x0./obj/usbhw_lpc.o
17
.data0x4000024c0x0./obj/usbinit.o
18
.data0x4000024c0x8./obj/lpcspindle.o
19
0x4000024cPWM_Frequency
20
0x40000250PWM_RCFrequency
21
.data0x400002540x0./obj/armvic.o
22
.data0x400002540x0./obj/console.o
23
.data0x400002540x3./obj/lpchardw.o
Bereits in der Variable FIRMWARE_VERSION sind die ersten 8 Byte falsch
d.h:
Also eine Erkenntnis habe ich nun noch gewonnen:
Programm mit Startup- und Linkerfile von WINARM compiliert läuft stabil.
Allerdings Problem mit der oben beschriebenen Initialisierung von
Variablen.
Programm mit Startup- und Linkerfile eines Codesourcery-Beispiels
compiliert. Programm instabil (nach etwa 2 Minuten). Variablen richtig
initialsiert.
Eine kleine Verbesserung (Programm läuft etwas länger) konnte ich
erreichen indem ich die Stackgrösse auf 1024 Byte erhöht hatte.
Vielleicht hängen die beiden Probleme aber nicht miteinander zusammen.
Anbei das Linkerfile, welches ich im Netz gefunden habe