Hallo,
bei meinem LPC1768 Cortex-M3 in Kombination mit meiner GCC 4.4.1
Toolchain (Linux) habe ich heute ein komisches Verhalten entdeckt, wenn
Fließkommazahlen in Modulen auftauchen. Es geht dabei um folgende
Beispielfunktion:
1 | void demo_fail(unsigned long p1, unsigned long p2) {
|
2 | log("STEP 1");
|
3 | double f = 0.0, d = 1.0;
|
4 |
|
5 | log("STEP 2");
|
6 | f = (double)p1/(16.0*(double)p2*d);
|
7 |
|
8 | log("STEP 3");
|
9 | if (f <= 1.1 || f >= 1.9) {
|
10 |
|
11 | log("STEP 4");
|
12 | for (f = 1.1; f <= 1.9; f += 0.1)
|
13 | d++;
|
14 | }
|
15 |
|
16 | log("STEP 5");
|
17 | }
|
Ist diese Funktion innerhalb meiner main.c, funktioniert deren Aufruf
"demo_fail(1,1)" komplett. Ist sie hingegen in ein Modul ausgelagert,
ist "STEP 2" die letzte Ausgabe, die ich sehe (also hängt die
double-Berechnung).
Übersetzt wird das Ganze fehlerfrei mit:
1 | arm-none-eabi-gcc -marm -mcpu=cortex-m3 -mthumb -msoft-float
|
2 | -ffreestanding -Wall -std=gnu99 -Wno-parentheses
|
3 | -fomit-frame-pointer -fshort-wchar -O3 -g -c -o mod.o mod.c
|
4 | arm-none-eabi-gcc -marm -mcpu=cortex-m3 -mthumb -msoft-float
|
5 | -ffreestanding -Wall -std=gnu99 -Wno-parentheses
|
6 | -fomit-frame-pointer -fshort-wchar -O3 -g -c -o main.o main.c
|
7 | arm-none-eabi-ld --no-wchar-size-warning -T lpc1768.x -o main.elf
|
8 | main.o mod.o
|
Die folgenden beiden Varianten der Funktion (1 ohne Funktionsparameter,
2 ohne Fließkommazahlen) funktionieren auch in einem Modul einwandfrei:
1 | void demo_ok1() {
|
2 | log("STEP 1");
|
3 | unsigned long p1 = 1, p2 = 1;
|
4 | double f = 0.0, d = 1.0;
|
5 |
|
6 | log("STEP 2");
|
7 | f = (double)p1/(16.0*(double)p2*d);
|
8 |
|
9 | log("STEP 3");
|
10 | if (f <= 1.1 || f >= 1.9) {
|
11 |
|
12 | log("STEP 4");
|
13 | for (f = 1.1; f <= 1.9; f += 0.1)
|
14 | d++;
|
15 | }
|
16 |
|
17 | log("STEP 5");
|
18 | }
|
19 |
|
20 | void demo_ok2(unsigned long p1, unsigned long p2) {
|
21 | log("STEP 1");
|
22 | int f = 0, d = 1;
|
23 |
|
24 | log("STEP 2");
|
25 | f = p1/(16*p2*d);
|
26 |
|
27 | log("STEP 3");
|
28 | if (f <= 1 || f >= 2) {
|
29 |
|
30 | log("STEP 4");
|
31 | for (f = 1; f <= 2; f += 1)
|
32 | d++;
|
33 | }
|
34 |
|
35 | log("STEP 5");
|
36 | }
|
Hat jemand eine Idee, woran das liegen könnte?! Danke vorab.