Forum: Compiler & IDEs newlib und VFP (vector floating point), FPU Problematik !


von Zero V. (Firma: Angestellter/Freelancer) (gnd)


Lesenswert?

Sehr geehrte Experten,

ich habe folgendes Problem und bitte um Hilfe !
1
main.elf uses VFP register arguments, 
2
?/arm-none-eabi/lib/libc.a(lib_a-memset.o) 
3
does not 
4
?/arm-none-eabi/bin/ld: 
5
failed to merge target specific data of file 
6
?/arm-none-eabi/lib/libc.a(lib_a-memset.o)
? = gekürzter Pfad
1
arm-none-eabi-gcc -T$(LINKERSCRIPT) -nostartfiles startup.o main.o ...
2
-mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -lgcc -o main.elf

Ich verwende das STM32F4-Discovery Board mit FPU, Linux und bin dabei 
FreeRTOS darauf zu verwenden, jedoch ruft xTaskCreate unter anderem die 
Funktion memset() auf und blockiert.
In meinem newlib Ordner in dem libc.a Archiv befindet sich diese 
Funktion.

Der Fehler entsteht wohl dadurch das die newlib mit falschen Optionen 
erstellt wurde.


Zur Frage:
Wie kann ich die Newlib 'neucompilieren' ohne "großen Schaden" 
anzurichten?
Wie kriege ich mehr Informationen über die jetzige newlib mittels 
Shell(Optionen, ...)?

Danke für jede Antwort!

von Michael F. (startrekmichi)


Lesenswert?

Die quick&dirty-Lösung unter Windows:
Im Bibliotheks-Verzeichnis des Compilers sollte es noch einen 
Unterordner "fpu" geben. Dorthin gehen und alle dateien eine Ebene höher 
kopieren (die vorhandenen Dateien einfach ersezten, ev vorher backup 
machen). Mit CoIDE funktioniert das jetzt einwandfrei. Alternativ hätte 
man auch einfach dem Linker per "-L" das korrekte Verzeichnis mitgeben 
können.

Dass das mit deiner Konfiguration jetzt so gut wie gar nichts zu tun 
hat, ist mir auch klar ;-) Allerdings sollte bei dir eine ähnliche 
Vorgehensweise möglich sein. Sprich schau mal, ob die korrekte libc 
nicht sogar schon irgendwo rumliegt, dann kannst du sie einfach 
rüberkopieren oder entsprechend per Pfad dazulinken.

von Zero V. (Firma: Angestellter/Freelancer) (gnd)


Lesenswert?

Danke das beseitigt zumindest die obere Fehlermeldung!

Aber beim Aufruf von memset in xTaskCreateGeneric (tasks.c)
1
memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) usStackDepth * sizeof( portSTACK_TYPE ) );

Tritt immernoch ein HardFault auf !

Hier das Disassembly von memset
main.lst:
1
/home/.../main.elf:     file format elf32-littlearm
2
3
Disassembly of section .text:
4
5
08000188 <memset-0x14>:
6
 8000188:  08006c4c   .word  0x08006c4c
7
 800018c:  20000000   .word  0x20000000
8
 8000190:  20000034   .word  0x20000034
9
 8000194:  20000038   .word  0x20000038
10
 8000198:  20000be8   .word  0x20000be8
11
12
0800019c <memset>:
13
 800019c:  e3100003   tst  r0, #3
14
 80001a0:  e92d0030   push  {r4, r5}
15
 80001a4:  e1a03000   mov  r3, r0
16
 80001a8:  0a000035   beq  8000284 <memset+0xe8>
17
 80001ac:  e3520000   cmp  r2, #0
18
 80001b0:  120140ff   andne  r4, r1, #255  ; 0xff
19
 80001b4:  1a000002   bne  80001c4 <memset+0x28>
20
 80001b8:  ea00002f   b  800027c <memset+0xe0>
21
 80001bc:  e3520000   cmp  r2, #0
22
 80001c0:  0a00002d   beq  800027c <memset+0xe0>
23
 80001c4:  e4c34001   strb  r4, [r3], #1
24
 80001c8:  e3130003   tst  r3, #3
25
 80001cc:  e2422001   sub  r2, r2, #1
26
 80001d0:  e1a0c003   mov  ip, r3
27
 80001d4:  1afffff8   bne  80001bc <memset+0x20>
28
 80001d8:  e3520003   cmp  r2, #3
29
 80001dc:  9a000020   bls  8000264 <memset+0xc8>
30
 80001e0:  e20140ff   and  r4, r1, #255  ; 0xff
31
 80001e4:  e352000f   cmp  r2, #15
32
 80001e8:  e1844404   orr  r4, r4, r4, lsl #8
33
 80001ec:  e1844804   orr  r4, r4, r4, lsl #16
34
 80001f0:  81a0300c   movhi  r3, ip
35
 80001f4:  81a05002   movhi  r5, r2
36
 80001f8:  9a00000e   bls  8000238 <memset+0x9c>
37
 80001fc:  e2455010   sub  r5, r5, #16
38
 8000200:  e355000f   cmp  r5, #15
39
 8000204:  e5834000   str  r4, [r3]
40
 8000208:  e5834004   str  r4, [r3, #4]
41
 800020c:  e5834008   str  r4, [r3, #8]
42
 8000210:  e583400c   str  r4, [r3, #12]
43
 8000214:  e2833010   add  r3, r3, #16
44
 8000218:  8afffff7   bhi  80001fc <memset+0x60>
45
 800021c:  e2423010   sub  r3, r2, #16
46
 8000220:  e3c3300f   bic  r3, r3, #15
47
 8000224:  e202200f   and  r2, r2, #15
48
 8000228:  e2833010   add  r3, r3, #16
49
 800022c:  e3520003   cmp  r2, #3
50
 8000230:  e08cc003   add  ip, ip, r3
51
 8000234:  9a00000a   bls  8000264 <memset+0xc8>
52
 8000238:  e1a0500c   mov  r5, ip
53
 800023c:  e1a03002   mov  r3, r2
54
 8000240:  e2433004   sub  r3, r3, #4
55
 8000244:  e3530003   cmp  r3, #3
56
 8000248:  e4854004   str  r4, [r5], #4
57
 800024c:  8afffffb   bhi  8000240 <memset+0xa4>
58
 8000250:  e2423004   sub  r3, r2, #4
59
 8000254:  e3c33003   bic  r3, r3, #3
60
 8000258:  e2833004   add  r3, r3, #4
61
 800025c:  e2022003   and  r2, r2, #3
62
 8000260:  e08cc003   add  ip, ip, r3
63
 8000264:  e3520000   cmp  r2, #0
64
 8000268:  120110ff   andne  r1, r1, #255  ; 0xff
65
 800026c:  0a000002   beq  800027c <memset+0xe0>
66
 8000270:  e2522001   subs  r2, r2, #1
67
 8000274:  e4cc1001   strb  r1, [ip], #1
68
 8000278:  1afffffc   bne  8000270 <memset+0xd4>
69
 800027c:  e8bd0030   pop  {r4, r5}
70
 8000280:  e12fff1e   bx  lr
71
 8000284:  e1a0c000   mov  ip, r0
72
 8000288:  eaffffd2   b  80001d8 <memset+0x3c>
73
74
0800028c <main>:
75
... usw.


Sieht jemand darin einen Fehler bzw. was löst ein HardFault aus?
Hat es vielleicht irgendwas mit privileged Mode oder Thumb zutun?

von Zero V. (Firma: Angestellter/Freelancer) (gnd)


Lesenswert?

Jemand hatte das gleiche Problem:

Zitat aus dem Thread:
Beitrag "Integration der newlib in ein Cortex-M3 Projekt"
1
Hat sich erledigt! Ich muss natürlich gegen die thumb2-Varianten der 
2
Bibliotheken linken! *d'oh*

Was bedeutet das ?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.