Forum: Mikrocontroller und Digitale Elektronik LPC1768 OpenOCD arm-none-eabi-gcc 5.3.0


von Pascal H. (_pascal_)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche gerade meine eval Board (mini dk2) welches einen lpc1768 
verbaut hat zu flashen.

Das schein auch zu funktionieren:

(openocd)
1
openocd -f lpc1768.cfg 
2
Open On-Chip Debugger 0.9.0 (2015-05-19-13:50)
3
Licensed under GNU GPL v2
4
For bug reports, read
5
        http://openocd.org/doc/doxygen/bugs.html
6
Info : auto-selecting first available session transport "jtag". To override use 'transport select <transport>'.
7
adapter speed: 10 kHz
8
adapter_nsrst_delay: 200
9
jtag_ntrst_delay: 200
10
cortex_m reset_config sysresetreq
11
adapter speed: 500 kHz
12
Info : clock speed 500 kHz
13
Info : JTAG tap: lpc17xx.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
14
Info : lpc17xx.cpu: hardware has 6 breakpoints, 4 watchpoints

(telnet)
1
Trying 127.0.0.1...
2
Connected to localhost.
3
Escape character is '^]'.
4
Open On-Chip Debugger
5
> init
6
> reset halt
7
JTAG tap: lpc17xx.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
8
target state: halted
9
target halted due to debug-request, current mode: Thread 
10
xPSR: 0x01000000 pc: 0x1fff0080 msp: 0x10001ffc
11
> flash probe 0
12
flash 'lpc2000' found at 0x00000000
13
> flash write_image erase /home/pheinrich/workspace/netplug/Test/Debug/Test.elf
14
auto erase enabled
15
wrote 4096 bytes from file /home/pheinrich/workspace/netplug/Test/Debug/Test.elf in 0.448421s (8.920 KiB/s)
16
> reset run
17
JTAG tap: lpc17xx.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
18
Invalid ACK 0x7 in JTAG-DP transaction
19
DP initialisation failed
20
in procedure 'reset' 
21
in procedure 'ocd_bouncer'
22
23
24
JTAG-DP OVERRUN - check clock, memaccess, or reduce jtag speed
25
MEM_AP_CSW 0x23000042, MEM_AP_TAR 0xe000ed00
26
Polling target lpc17xx.cpu failed, trying to reexamine
27
lpc17xx.cpu: hardware has 6 breakpoints, 4 watchpoints

Ich bin mir jetzt nicht sicher wo das problem ist. Funktioniert mein 
Debugger nicht richtig oder ist das erstellte binary fehlerhaft?

Eigentlich habe ich nur eine while(1); in der main. Klar kann es an den 
eclipse build options liegen oder am verwendeten linker file (Anhang).

Vielmehr habe ich aber meine Toolchain "arm-none-eabi-" version 5.3.0 im 
Verdacht. (Arch Linux)

Hat jemand eine Idee?

Gruss,
Pascal

von Robert S. (robert_s68)


Lesenswert?

K.A. was es da hat, sieht nach debugger aus. Was hängt da dran? 
Eventuell Adapter-Speed reduzieren?

Binary liesse sich durch einen Blick ins Disassembly überprüfen.

: Bearbeitet durch User
von Jojo S. (Gast)


Lesenswert?

ich bin kein OOCD Experte, habe das mit einer anderen config gerade zum 
Laufen bekommen. Dein Problem mit 'JTAG-DP OVERRUN' liefert aber massig 
Treffer bei Tante Google.

von Jim M. (turboj)


Lesenswert?

Bei mir hat gdb "load" immer besser funktionert als die "flash ..." 
funktionen im OpenOCD.

Also
1
arm-none-eabi-gdb Test.elf
2
target remote localhost:3333
3
mon reset init
4
load
5
mon reset halt
6
run

LPC17xx braucht "reset init" vorm Flashen.

von Pascal H. (_pascal_)


Lesenswert?

Hey vielen Dank für die Rückmeldungen.

Ja ich weis dass google viele Treffer liefert aber die haben mir nicht 
weitergeholfen :(

Ich habe einen BusBlaster v4 (leider) als Debugger. Da ich eigentlich 
SWD brauche habe ich mir eine KT-Link Buffer Logic auf den Debugger 
geflasht, da die originale JTAGKey kein SWD unterstützt. Leider finde 
ich jetzt nirgendwo im Netz die alte JTAGKey Buffer Logic für den BBv4 
um das rückgängig zu machen. Das BusBlaster Projekt von 
DangerousPrototypes schein schon seit mehreren Jahren tot zu sein :(

Daher bin ich jetzt relativ unsicher ob das binary der Fehler ist oder 
mein Debugger. Ein laufendes Programm anhalten und wieder starten 
funktioniert ja, das flashen scheinbar auch.

Da jetzt noch ein Toolchain update dazukam weis ich gar nicht mehr wo 
ich anfangen soll.

Wie kann ich das binary via Disassable prüfen?

Ich werde mal mit Keil unter windows ein lauffähiges binary erzeugen und 
dieses dann unter linux mit openocd flashen.

: Bearbeitet durch User
von Jojo S. (Gast)


Lesenswert?

ein lauffähiges Programm für das Board findest du hier: 
Beitrag "FFT mit Wasserfall auf dem LPC1768"

Ich habe noch einen abgesägten LPCLink von einem LPCXpresso über, denn 
kannst du haben wenn es dir hilft. Ansonsten würde ich einen LPCLink V2 
nehmen, der kann CMSIS-DAP und kostet knappe 20€ bei Watterott. Dann 
hast du wenigstens ein Stück funktionierende Hardware, die vielen 
offenen Baustellen machen das nicht einfach.

von Pascal H. (_pascal_)


Lesenswert?

Ich habe einen Ulink 2 aus china, mit dem hat Debuggen mit Keil unter 
Windows wunderbar funktioniert. Auch SWD ist damit problemlos möglich.
Nur wollte ich eben das ganze mit Linux und OpenOCD realisieren.

Ich melde mich wenn es was zu erzählen gibt ;)

von Robert S. (robert_s68)


Lesenswert?

arm-none-eabi-objdump -S path-to-image.elf, und schaun ob da was 
vernünftiges daherkommt ;-)

Pascal H. schrieb:
> Da ich eigentlich
> SWD brauche habe ich mir eine KT-Link Buffer Logic auf den Debugger
> geflasht, da die originale JTAGKey kein SWD unterstützt.

Ich hab keine Ahnung vom BusBlaster, aber es sieht so aus als würde JTAG 
verwendet? Warum nicht gleich SWD verwenden wenn die SWD-Firmware auf 
dem Busblaster ist?

Zur Not funktioniert auch ein st-link von einem nucleo mit dem lpc in 
Verbindung mit openocd. Besser ists aber sicher da einen gscheiten 
Debugger zu verwenden, und da eine Unsicherheit wenn was spinnt halbwegs 
sicher ausgeräumt zu haben.

von Jim M. (turboj)


Lesenswert?

Pascal H. schrieb:
> Wie kann ich das binary via Disassable prüfen?

arm-none-eabi-gdb kennt "disassemble". Außerdem gibts noch -objdump.

Pascal H. schrieb:
> Da ich eigentlich
> SWD brauche habe ich mir eine KT-Link Buffer Logic auf den Debugger
> geflasht, da die originale JTAGKey kein SWD unterstützt.

Das ist veraltet. Alle FTDI-basierten Adapter unterstützen neuerdings 
SWD,
als Buffer nimmt man einen 74HC126 oder einfach einen 400Ohm - 1k 
Widerstand. Anleitung müsste bei neuerem OpenOCD dabei sein. Habe ich 
selber mit meinem JTAGKey2 gemacht, funktioniert.


LPC17xx hat gerne mal DP-Overruns bei Änderungen des Takts (PLL 
einschalten), was auch der ROM-Bootloader macht.

Ein direkt mit "flash write" geflashtes Binary hat i.d.R. eine defekte 
Vektor Checksumme (siehe UM10360.pdf) und läuft daher nicht an, es 
läuft dann der Bootloader. Lädt man via gdb (wie oben erwähnt) wird die 
Checksumme automagisch repariert. Allerdings kann dann ein Verify an der 
Stelle fehlschlagen.

von Pascal H. (_pascal_)


Lesenswert?

Hey, ich habe ordentliche Fortschritte gemacht :)

Nachdem ich in Windows mit Keil ein kleines LED Blink example erstellt 
hatte und dies auch wunderbar lief, habe ich das erstellte binary 
versucht mit openocd und meinem Busblaster zu flashen.

Mit dieser openocd config laeuft der Busblaster ohne irgendwelche JTAG 
Fehler:
1
source [find interface/ftdi/dp_busblaster_kt-link.cfg]
2
source [find target/lpc17xx.cfg]
3
4
# Adapter configuration
5
6
adapter_khz 750
7
reset_config trst_and_srst
8
9
# TCP server configuration
10
11
gdb_port 3333
12
telnet_port 4444
13
14
# GDB event handlers
15
16
$_TARGETNAME configure -event gdb-attach {
17
  reset halt
18
}
19
20
$_TARGETNAME configure -event gdb-detach {
21
  resume
22
}

Das flashen funktioniert aber nur mit telnet.

Laeuft wunderbar ...
1
[pheinrich@ARCH Debug]$ telnet localhost 4444
2
Trying ::1...
3
Connection failed: Connection refused
4
Trying 127.0.0.1...
5
Connected to localhost.
6
Escape character is '^]'.
7
Open On-Chip Debugger
8
> reset init
9
JTAG tap: lpc17xx.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
10
target state: halted
11
target halted due to debug-request, current mode: Thread 
12
xPSR: 0x01000000 pc: 0x1fff0080 msp: 0x10001ffc
13
> flash write_image erase /home/pheinrich/workspace/netplug/Test/Debug/lpc_test2.axf
14
auto erase enabled
15
Verification will fail since checksum in image (0x00000000) to be written to flash is different from calculated vector checksum (0xeffff4e6).
16
To remove this warning modify build tools on developer PC to inject correct LPC vector checksum.
17
wrote 4096 bytes from file /home/pheinrich/workspace/netplug/Test/Debug/lpc_test2.axf in 0.309931s (12.906 KiB/s)
18
> reset run
19
JTAG tap: lpc17xx.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)

Mit dem gdb laesst sich zwar das binary flashen aber es laeuft nicht :(
eine led brennt, es sollten aber beide im wechsel leuchten...
1
[pheinrich@ARCH Debug]$ arm-none-eabi-gdb lpc_test2.axf 
2
GNU gdb (GDB) 7.11
3
Copyright (C) 2016 Free Software Foundation, Inc.
4
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
5
This is free software: you are free to change and redistribute it.
6
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
7
and "show warranty" for details.
8
This GDB was configured as "--host=x86_64-pc-linux-gnu --target=arm-none-eabi".
9
Type "show configuration" for configuration details.
10
For bug reporting instructions, please see:
11
<http://www.gnu.org/software/gdb/bugs/>.
12
Find the GDB manual and other documentation resources online at:
13
<http://www.gnu.org/software/gdb/documentation/>.
14
For help, type "help".
15
Type "apropos word" to search for commands related to "word"...
16
Reading symbols from lpc_test2.axf...
17
warning: Loadable section "RW_IRAM1" outside of ELF segments
18
done.
19
(gdb) target remote localhost:3333
20
Remote debugging using localhost:3333
21
warning: Loadable section "RW_IRAM1" outside of ELF segments
22
0x1fff0080 in ?? ()
23
(gdb) mon reset init
24
JTAG tap: lpc17xx.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
25
target state: halted
26
target halted due to debug-request, current mode: Thread 
27
xPSR: 0x01000000 pc: 0x1fff0080 msp: 0x10001ffc
28
(gdb) load
29
Loading section RW_IRAM1, size 0x8 lma 0x10000000
30
Loading section ER_IROM1, size 0x610 lma 0x0
31
Start address 0xcc, load size 1560
32
Transfer rate: 820 bytes/sec, 780 bytes/write.
33
(gdb) mon reset run
34
JTAG tap: lpc17xx.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)

Soweit sogut.
Danach habe ich das kleine Beispielprogramm in eclipse mit der 
arm-none-abi- 5.3.0 gebaut und geflasht. Leider ohne Erfolg. Eine LED 
leuchtet. (Gleiches Bild wie beim GDB Flash des Keil Binaries). Ja ich 
habe mit telnet und gdb versucht zu flashen.

Naja werde morgen weiter testen. Hab so das Gefuehl das koennte klappen 
:)

Gruss

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Pascal H. schrieb:
> Reading symbols from lpc_test2.axf...
> warning: Loadable section "RW_IRAM1" outside of ELF segments
> done.

Das ELF(?) Binary will in den RAM und nicht in den Flash schreiben. Das 
geht so nicht. Vermutlich eine Inkompatibilität der Tools, dann hilft 
oft ein Export nach ihex oder binary (raw ohne ELF Header).

von Pascal H. (_pascal_)


Lesenswert?

Ja die Warning habe ich auch gesehen. Aber warum funktioniert dann das 
flashen über telnet?

Leider weis ich nicht genau was es mit dem ELF Header auf sich hat. Dazu 
muss ich mir erst ein wenig Literatur anschauen.

Das lpc_test2.axf wurde mit der Keil ARM C/C++ Compiler Toolchain 
erstellt.
Ein objdump -S zeigt ELF32.

Die Positionierung im binary wird doch über das lpc17xx.ld also das 
Linker Script gesteuert oder? Ggf. ist dort irgendwas falsch.

: Bearbeitet durch User
von Nils (Gast)


Lesenswert?

Jim M. schrieb:
> Ein direkt mit "flash write" geflashtes Binary hat i.d.R. eine defekte
> Vektor Checksumme (siehe UM10360.pdf) und läuft daher nicht an, es
> läuft dann der Bootloader. Lädt man via gdb (wie oben erwähnt) wird die
> Checksumme automagisch repariert. Allerdings kann dann ein Verify an der
> Stelle fehlschlagen.

Die OpenOCD korregiert die Checksumme schon seit einiger Zeit, wenn man 
via "program" das ELF-file direkt flasht. Verify schlägt aber immer noch 
fehl.

Das hat mich letzte Woche so genervt, das ich mich mal hingesetzt habe 
und ein kleines tool geschrieben habe, welches die Checksumme gleich im 
ELF fixed.

  http://hilbert-space.de/?p=178

Läuft unter Cygwin und Linux.

Vielleicht findet es ja der eine oder andere hilfreich. Ich zumindest 
will den Verify step nach dem Flashen nicht mehr missen. Das hat mir bis 
jetzt schon vor so mancher unnötiger Debug-Session bewahrt.

von Nils (Gast)


Lesenswert?

Pascal H. schrieb:
> Mit dem gdb laesst sich zwar das binary flashen aber es laeuft nicht :(
> eine led brennt, es sollten aber beide im wechsel leuchten...

Hi Pascal,

wenn Du mir sagst, an welchen Pins deine LEDs hängen und wie schnell 
dein Quarz ist, dann kann ich dir schnell ein kleinen Blinker schreiben 
und dir ein getestetes binary senden. Das schließt zumindest schon mal 
eine Fehlerquelle aus.

Gruß,
  Nils

von Pascal H. (_pascal_)


Lesenswert?

Hey Nils,

die LED's hängen an 3,25 und 3,26
Der Quarz hat 12M

Baust du das binary mit dem arm-none-eabi- v5.3.0 ?

Weil das Keil Binary von Windows läuft ja.

Schonmal vielen Dank :)

von Nils (Gast)


Angehängte Dateien:

Lesenswert?

So, HelloWorld ist anbei. Bei mir blinkt das auch mit 150ms 
Periodendauer.

die GCC Version, die ich benutzte ist etwas älter, da ich ein paar alte 
Libs benutze die auch mit dem gebaut wurden.

arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 4.9.3 20150529 
(release) [ARM/embedded-4_9-branch revision 227977]

Gruß,
  Nils

von Pascal H. (_pascal_)


Lesenswert?

Ok vielen Dank, ich werde das binary heute abend mal flashen.

Wenn das problemlos läuft kann es an meiner toolchain, an den eclipse 
build options die ich eingestellt habe oder was ich am meisten vermute 
an meinem linker script liegen.

Nils kannst du mir deins mal anhängen?

von Nils (Gast)


Angehängte Dateien:

Lesenswert?

Klar. Mein Linkerscript ist für C++ da ich mbed benutze. Daher die 
vielen Sections..

Viel Glück.

von Pascal H. (_pascal_)


Lesenswert?

Soooo wunderpraechtig :)

Dein HelloWorld.elf laesst sich wunderbar flashen und laeuft
1
[pheinrich@ARCH Downloads]$ arm-none-eabi-gdb ./HelloWorld.elf 
2
GNU gdb (GDB) 7.11
3
Copyright (C) 2016 Free Software Foundation, Inc.
4
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
5
This is free software: you are free to change and redistribute it.
6
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
7
and "show warranty" for details.
8
This GDB was configured as "--host=x86_64-pc-linux-gnu --target=arm-none-eabi".
9
Type "show configuration" for configuration details.
10
For bug reporting instructions, please see:
11
<http://www.gnu.org/software/gdb/bugs/>.
12
Find the GDB manual and other documentation resources online at:
13
<http://www.gnu.org/software/gdb/documentation/>.
14
For help, type "help".
15
Type "apropos word" to search for commands related to "word"...
16
Reading symbols from ./HelloWorld.elf...(no debugging symbols found)...done.
17
(gdb) target remote localhost:3333                                                              
18
Remote debugging using localhost:3333                                                           
19
0x1fff0080 in ?? ()                                                                             
20
(gdb) mon reset init
21
JTAG tap: lpc17xx.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)         
22
target state: halted                                                                            
23
target halted due to debug-request, current mode: Thread                                        
24
xPSR: 0x01000000 pc: 0x1fff0080 msp: 0x10001ffc                                                 
25
(gdb) mon flash banks                                                                           
26
#0 : lpc17xx.flash (lpc2000) at 0x00000000, size 0x00080000, buswidth 0, chipwidth 0            
27
(gdb) mon flash_probe 0                                                                         
28
invalid command name "flash_probe"                                                              
29
(gdb) mon flash probe 0                                                                         
30
flash 'lpc2000' found at 0x00000000                                                             
31
(gdb) load                                                                                      
32
Loading section .text, size 0x6f90 lma 0x0                                                      
33
Loading section .ARM.exidx, size 0x8 lma 0x6f90                                                 
34
Loading section .data, size 0xb4 lma 0x6f98
35
Start address 0x698, load size 28748
36
Transfer rate: 10 KB/sec, 7187 bytes/write.
37
(gdb) mon reset run
38
JTAG tap: lpc17xx.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
39
(gdb)

Werde jetzt mal mit deinem linker script experimentieren, aber ich 
glaube ich brauche noch das startup Assembler/C++ File weil mir fehlen 
so einige references
1
(.startup+0x0): undefined reference to `__stack_end__'
2
makefile:42: recipe for target 'Test.elf' failed
3
./cmsis/startup_lpc17xx.o: In function `_vectors':
4
(.startup+0x1c): undefined reference to `VectorChecksum'
5
./cmsis/startup_lpc17xx.o: In function `TEXT_END':
6
(.startup+0x120): undefined reference to `__text_end__'
7
./cmsis/startup_lpc17xx.o: In function `DATA_BEG':
8
(.startup+0x124): undefined reference to `__data_beg__'
9
./cmsis/startup_lpc17xx.o: In function `BSS_BEG':
10
(.startup+0x12c): undefined reference to `__bss_beg__'
11
./cmsis/startup_lpc17xx.o: In function `CTORS_BEG':
12
(.startup+0x134): undefined reference to `__ctors_start__'
13
./cmsis/startup_lpc17xx.o: In function `CTORS_END':
14
(.startup+0x138): undefined reference to `__ctors_end__'

: Bearbeitet durch User
von Pascal H. (_pascal_)


Angehängte Dateien:

Lesenswert?

Leider kann ich meinen vorherigen Beitrag nicht mehr bearbeiten.

Ich habe mir mittlerweile das mbed src repo besorgt 
(https://developer.mbed.org/users/mbed_official/code/mbed-src/) und alle 
notwendigen cmsis / linker files in einem testprojekt erstellt. (Anhang)

Das flashen funktioniert ohne Fehlermeldung. Nach einem run wird aber 
nur die erste GPIO conf gesetzt, danach steht das Program.

Ich musste an den compiler settings "--specs=nosys.specs" hinzufuegen, 
sonst sucht er nach "reference _exit".


##########################

Auweia ... ich glaub es liegt daran weil der Systick Handler nicht 
kommt.
Muss ich den mit NVIC freischalten ?!? ... muss ich morgen mal schauen.

##########################
1
(gdb) mon reset init
2
JTAG tap: lpc17xx.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
3
target state: halted
4
target halted due to debug-request, current mode: Thread 
5
xPSR: 0x01000000 pc: 0x1fff0080 msp: 0x10001ffc
6
(gdb) mon flash probe 0
7
flash 'lpc2000' found at 0x00000000
8
(gdb) load
9
Loading section .text, size 0x17bc lma 0x0
10
Loading section .ARM.extab, size 0xc lma 0x17bc
11
Loading section .ARM.exidx, size 0xa0 lma 0x17c8
12
Loading section .data, size 0x440 lma 0x1868
13
Start address 0x3b4, load size 7336
14
Transfer rate: 3 KB/sec, 1834 bytes/write.
15
(gdb) mon reset run
16
JTAG tap: lpc17xx.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Pascal H. schrieb:
> ich glaub es liegt daran weil der Systick Handler nicht
> kommt.
> Muss ich den mit NVIC freischalten ?!?

Nein. Systick ist kein Interrupt vom NVIC und deshalb dort auch nicht 
freischaltbar. Man kann ihm allerdings via NVIC_SetPriority() eine 
Priorität zuweisen.

von Pascal H. (_pascal_)


Lesenswert?

Hmm leider bekomme ich es nicht hin :(

Folgenden code hab ich geschrieben:
1
#include <LPC17xx.h>
2
#include <PIN_LPC17xx.h>
3
#include <GPIO_LPC17xx.h>
4
5
/*-----------------------------------------------------------------------------
6
  SysTick_Handler
7
*----------------------------------------------------------------------------*/
8
void SysTick_Handler (void)  {
9
10
  GPIO_PinWrite(3, 25, !GPIO_PinRead(3, 25));
11
  GPIO_PinWrite(3, 26, !GPIO_PinRead(3, 26));
12
13
}
14
15
void setup() {
16
17
  PIN_Configure(3, 25, PIN_FUNC_0, PIN_PINMODE_PULLDOWN, PIN_PINMODE_NORMAL);
18
  PIN_Configure(3, 26, PIN_FUNC_0, PIN_PINMODE_PULLDOWN, PIN_PINMODE_NORMAL);
19
20
  GPIO_SetDir(3,25,GPIO_DIR_OUTPUT);
21
  GPIO_SetDir(3,26,GPIO_DIR_OUTPUT);
22
23
  GPIO_PinWrite(3, 25, 1);
24
  GPIO_PinWrite(3, 26, 0);
25
26
}
27
28
int main(int argc, char** argv) {
29
30
  SystemInit();
31
  SystemCoreClockUpdate();
32
  SysTick_Config(SystemCoreClock / 100);
33
34
  setup();
35
36
  while(1);
37
38
}

Manchmal steht etwas von einem SIGINT bezogen auf die SysTick definition 
im startupcode
1
Program received signal SIGINT, Interrupt.
2
SysTick_Handler () at ../cmsis/startup_LPC17xx.S:177
3
177      def_default_handler    SysTick_Handler


Ich habe keine Ahnung wie es weiter geht :(

von Nils (Gast)


Lesenswert?

Hallo Pascal,

kannst Du mal das Binary posten, dann werf ich mal ein Blick in das 
Disassembly.

Gruß,
  Nils

von Pascal H. (_pascal_)


Angehängte Dateien:

Lesenswert?

Hallo Nils,

hier das binary. Wenn ich mir das mit objdump anschaue sieht es sehr 
sehr viel anders aus als dein HelloWorld.elf

In deinem ist nur eine grosse .text section
In meinem sind die einzelnen Funktionen zu sehen

Was mir auch aufgefallen ist, in meinem sind die ganzen System 
spezifischen Funktionen wie

_sbrk
_sbrk_r
memcpy
_malloc_r
...

implementiert ... ist das falsch?
Habe ich meine compiler options nicht richtig eingestellt ..

Hmm

von Jojo S. (Gast)


Lesenswert?

irgendwie machst du es dir aber auch schwer. Lade doch mal dieses Paket:
https://github.com/adamgreen/gcc4mbed
Das ist, wie der Name schon sagt, die mbed lib für gcc. Die gcc 
toolchain wird beim Start des OS-install scripts heruntergeladen. Dann 
wird ein BuildShell.cmd erzeugt das man startet und darin kann man das 
make ausführen. Es sind verschiedene Beispiele drin, das Blink ist ganz 
rudimentär ohne c++ Funktionen. Als zweites vielleicht den Ticker 
ansehen, ist eine sehr schöne Timer Implementierung.
Eine Quickstart Beschreibung ist hier:
https://developer.mbed.org/users/AdamGreen/notebook/gcc4mbed/

von Jojo S. (Gast)


Lesenswert?

einen habe ich noch:

dein Systick_Handler wird nicht aufgerufen weil er im C++ file steckt 
und der Linker dann die weak Bindung nicht ersetzt. So sieht es besser 
aus:
1
extern "C"
2
{
3
/*-----------------------------------------------------------------------------
4
  SysTick_Handler
5
*----------------------------------------------------------------------------*/
6
void SysTick_Handler (void)  {
7
8
  GPIO_PinWrite(3, 25, !GPIO_PinRead(3, 25));
9
  GPIO_PinWrite(3, 26, !GPIO_PinRead(3, 26));
10
11
}
12
}

Deine _sbrk & Co. kommen durch die --specs=nosys.specs linker option.

von Nils (Gast)


Lesenswert?

Hi Pascal,

Ich hab mal in dein ELF geschaut und jetzt auf den ersten Blick nichts 
gob falsches gefunden. Sektionen und Adressen sind soweit okay, Stack 
stimmt auch.

Mal eine ganz allgemeine Frage: Unter welchem Betriebssystem willst Du 
das denn zum Laufen bringen?

Unter Linux könnte ich Dir dort mit einem fertigen Paket weiterhelfen.

Und: Bist Du an GCC 5.3 gebunden oder hast Du freie Auswahl im Compiler. 
Ich erinnere mich, das ich mit neueren Versionen auch so meine Probleme 
hatte. Die währen zwar sicher lösbar gewesen, aber es war einfacher auf 
eine alte Version zurückzugehen. Von der Code Qualität macht das beim 
Cortex-M3 eh nicht so den Unterschied.

Gruß,
  Nils

von Jojo S. (Gast)


Lesenswert?

Warum der Systick nicht aufgerufen wird habe ich doch schon geschrieben, 
das liegt nicht am Compiler sondern am fehlenden extern "C".

von Pascal H. (_pascal_)


Lesenswert?

Hey,

@Jojo
also mit extern "C" wird der SysTick_Handler angesprungen :) 
funktioniert jetzt wie gewollt.

War das erste mal dass meine main in einer .cpp steckt ... dachte das 
waere vollkommen egal. Weil den Einsprungpunkt also die main function 
hat er ja auch gefunden. Kann ich dem Linker das iwie sagen dass er auch 
in den .cpp files suchen soll?

Was ist diese MBED Lib eigentlich? Habe mir das angeschaut verstehe aber 
nicht was es mir jetzt bringt.

@Nils:
Mein Build System ist Arch Linux, also immer recht aktuell im repo -> 
was natuerlich auch zu Probleme fuehrt, klar ;)

von Nils (Gast)


Lesenswert?

Pascal H. schrieb:
> Was ist diese MBED Lib eigentlich? Habe mir das angeschaut verstehe aber
> nicht was es mir jetzt bringt.

Das ist ein C++ Abtraktionslayer um die üblichen Standard Peripherals, 
die Cortex-M3 CPUs so haben. Sie ist wirklich einfach zu benutzten und 
auch gut getestet.

Nachteil ist ein höherer Codesize Footprint sowie der übliche Laufzeit 
Overhead, den so ein Abstraktionslayer so mitbringt. Auch sind 
Spezialfeatures vieler Peripherien nicht unterstützt. Deine SPI 
Schnittstellen z.B. können auch TI-SSP. Sowas wird nicht unterstützt 
weil es schon recht speziell ist

Vorteil ist, das der Code - solange Du bei mbed bleibst - auch auf 
vielen anderen CPUs läuft und man schnell mal was zusammencoden kann. 
Ist toll für's Prototyping.

Wenn Du nichts von mbed benutzt, dann kostet es Dich auch nichts. Ist 
alles optional und sehr modular. Einzig Timer0 wird von der API belegt.


Gruß,
  Nils

von Jojo S. (Gast)


Lesenswert?

Pascal H. schrieb:
> Kann ich dem Linker das iwie sagen dass er auch
> in den .cpp files suchen soll?

Da die Funktion SystickHandler nicht static deklariert ist wird sie als 
public exportiert und der Linker findet diese auch. Die Tücke ist nur 
das es in C++ ein 'name mangling' gibt, da werden die Funktionsnamen 
dekoriert damit Funktionen mit gleichem Namen aber unterschiedlichen 
Argumenten unterschieden werden können. Ohne das extern "C" findet der 
Linker ein _SystickHandler und ersetzt damit nicht den default aus dem 
Assembler Startupcode.

mbed ist eine Online Entwicklungsumgebung. Die Website ist nicht gerade 
übersichtlich weil es jetzt eine Weiterentwicklung gibt die aber nicht 
richtig voran kommt. Rechts oben gibt es einen Verweis auf die alte 
'Classic Developer' Umgebung. Da kann man sich registrieren und einen 
Online Compiler nutzen. Das ist besonders einfach für Boards die 'mbed 
enabled' sind, dafür gibt es dann angepasste Libs und die Boards haben 
üblicherweise auch den Programmer on Board dabei und man braucht nur ein 
USB Kabel um loszulegen.
Die Lib ist quelloffen und auf github gehostet, das ist die mbed-master. 
Wenn man mit dem gcc arbeiten möchte gibt es die Variante gcc4mbed, die 
installiert eben die gcc toolchain und man hat mit Null Aufwand die 
Möglichkeit Projekte in der Kommandozeile mit make zu bauen. Das MiniDK2 
ist dem LPC1768 mbed Ur-Board ähnlich (incl. Ethernet), man kann also 
auch ein Projekt in der Online Umgebung starten und das für den gcc 
exportieren. Soweit ich weiss gibt es aber für das MiniDK2 angepasste 
Libs, es ist nur kein offizielles mbed Board und nicht in der mbed 
Platform Liste.
Die mbed API ist C++, intern werden low level Funktionen in C verwendet, 
wie z.B. die GPIO die du verwendet hast. Mit dem genannten gcc4mbed 
benutzt man dann die DigitalIO Objekte:
1
#include "mbed.h"
2
3
DigitalOut myled(LED1);
4
DigitalIn myButton(p5);
5
6
int main() 
7
{
8
    while(1) 
9
    {
10
        myled = myButton;
11
    }
12
}

mbed for Mini-DK2: 
https://developer.mbed.org/users/frankvnk/notebook/lpc1768-mini-dk/

von Pascal H. (_pascal_)


Lesenswert?

Hey Jojo,

danke fuer die ausfuehrliche Erklaerung ;)

Klar finde ich die Idee hinter mbed nicht schlecht, dennoch moechte ich 
gerne so viel wie moeglich zu fuss selber machen um tiefere Einblicke zu 
erhalten.

D.h. ohne extern "C" gibt es nur die _SysTick_Handler, da keine weitere 
"SysTick_Handler" mit anderen Argumenten existiert. Wenn ich jetzt also 
im Assembler Startup Code das Symbol auf _SysTick_Handler aendern wuerde 
dann koennte ich das extern "C" weglassen?

Ich habe irgendwo mal gehoert es gaebe eine LPC17xx_Startup.cpp, damit 
haette ich dann nicht dieses Problem. Leider habe ich im mbed repo keine 
cpp startup Sachen gefunden fuer den GCC. Nur in Code Red oder 
codesourcery.

von Jojo S. (Gast)


Lesenswert?

in deinem Beispiel benutzt du keine C++ Features, du kannst also deine 
.cpp files nach .c umbenennen. Ansonsten ist das extern "C" der übliche 
Weg bei dem Mix aus C/C++, ist also nix ungewöhnliches.
Den Startupcode kann man auch in C schreiben, Assembler ist wohl 
historisch begründet durch die älteren ARM die zwei Befehlssätze hatten.

hier ist ein Startupcode in cpp, für CodeRed Umgebung aber müsste auch 
im gcc laufen: 
https://github.com/mbedmicro/mbed/blob/master/libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC176X/TOOLCHAIN_GCC_CR/startup_LPC17xx.cpp

wenn du nicht mbed benutzt kannst du auch den Offset in der RAM section 
weglassen:
statt
RamLoc32 (rwx) : ORIGIN = 0x100000C8, LENGTH = 0x7F38 /* 32k */
geht
RamLoc32 (rwx) : ORIGIN = 0x10000000, LENGTH = 0x8000 /* 32k */

mbed kopiert die Interrupt Vector Table ins RAM, das ist eine Falle wenn 
man die lib in einer IDE mit automatisch generiertem Linkerfile 
benutzt...

von Nils P. (torus)


Lesenswert?

Hi Pascal,

So, ich hab mir jetzt auch mal einen Account gemacht (bin ex: 
Nils(gast))

Schön das es jetzt alles bei Dir läuft. Gratulation. War ja fast schon 
eine Zangengeburt.

Wenn Du fragen zum LPC1768 hast, dann schreib mich gern an, ich kann 
sicher hier und da tips geben, da ich mittlerweile ein gutes Jahr 
Erfahrung mit dem Teil habe und schon so manche Probleme gelöst habe.

Ich freue mich auch darüber, über weitere Quirks von diesem Chip zu 
erfahren.

/Nils

von Pascal H. (_pascal_)


Lesenswert?

Hey vielen Dank Nils, ich werde darauf zuruekkommen ;)

Ich habe noch eine Frage bezueglich gcc und newlib.

Angenommen ich wuerde newLib nano verwenden wollen um system spezifische 
implementierungen zu haben (File -> printf usw.), dann stelle ich bei 
den linker options --specs=nano.specs ein.

Dann fehlen aber einige references ...
1
arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -O3 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections  -g3 -ggdb -T "/home/pheinrich/workspace/test/TestMBED/LPC1768.ld" -Wl,-Map,"TestMBED.map" --specs=nano.specs -o "TestMBED.elf"  ./lpc/GPIO_LPC17xx.o ./lpc/PIN_LPC17xx.o  ./cmsis/cmsis_nvic.o ./cmsis/startup_LPC17xx.o ./cmsis/system_LPC17xx.o  ./TestClass.o ./main.o   
2
/usr/lib/gcc/arm-none-eabi/5.3.0/../../../../arm-none-eabi/lib/armv7-m/libg_nano.a(lib_a-abort.o): In function `abort':
3
abort.c:(.text.abort+0xa): undefined reference to `_exit'
4
makefile:58: recipe for target 'TestMBED.elf' failed
5
/usr/lib/gcc/arm-none-eabi/5.3.0/../../../../arm-none-eabi/lib/armv7-m/libg_nano.a(lib_a-exit.o): In function `exit':
6
exit.c:(.text.exit+0x1a): undefined reference to `_exit'
7
/usr/lib/gcc/arm-none-eabi/5.3.0/../../../../arm-none-eabi/lib/armv7-m/libg_nano.a(lib_a-sbrkr.o): In function `_sbrk_r':
8
sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'
9
/usr/lib/gcc/arm-none-eabi/5.3.0/../../../../arm-none-eabi/lib/armv7-m/libg_nano.a(lib_a-signalr.o): In function `_kill_r':
10
signalr.c:(.text._kill_r+0xe): undefined reference to `_kill'
11
/usr/lib/gcc/arm-none-eabi/5.3.0/../../../../arm-none-eabi/lib/armv7-m/libg_nano.a(lib_a-signalr.o): In function `_getpid_r':
12
signalr.c:(.text._getpid_r+0x0): undefined reference to `_getpid'
13
collect2: error: ld returned 1 exit status
14
make: *** [TestMBED.elf] Error 1

Diese muss ich dann selbst implementieren oder?
z.B. in einer syscalls.c


#################
EDIT 1

Ok ich habe die sys.cpp aus dem mbed repo TOOLCHAIN_GCC_CS verwendet.
Funktioniert :)
1
#include "cmsis.h"
2
#include <sys/types.h>
3
#include <errno.h>
4
5
extern "C" {
6
7
void exit(int ErrorCode);
8
9
static void *heap_pointer = 0;
10
11
int _kill(int pid, int sig) {
12
    errno = EINVAL;
13
    return -1;
14
}
15
16
void _exit(int status) {
17
    exit(status);
18
}
19
20
int _getpid(void) {
21
  return 1;
22
}
23
24
void *_sbrk(unsigned int incr) {
25
    void *mem;
26
27
    unsigned int next = ((((unsigned int)heap_pointer + incr) + 7) & ~7);
28
    if (next > __get_MSP()) {
29
        mem = 0;
30
    } else {
31
        mem = (void *)heap_pointer;
32
    }
33
    heap_pointer = (void *)next;
34
35
    return mem;
36
}
37
38
}

Ich weis zwar nicht genau was diese syscalls tun aber es geht.

Ich weis nur dass _sbrk fuer malloc benoetigt wird. Dh. malloc will 
Speicher reservieren und fraegt uber _sbrk den naechsten Heap Pointer an 
bzw. wo der Heap steht? Warum + 7 und diese verunden mit 7 nicht?

Was waere wenn ich dieses syscalls nicht habe also --spec=nosys? Dann 
funktioniert malloc nicht, ok, aber es muss doch trotzdem speicher 
reserviert werden. Wer weis denn dann wo der Heap Pointer steht?

: Bearbeitet durch User
von Markus F. (mfro)


Lesenswert?

Pascal H. schrieb:
> Warum + 7 und diese verunden mit 7 nicht?
1
(x +  7) & ~7

richtet eine Adresse x auf die nächst grössere, ohne Rest durch 8 
teilbare solche aus (Alignment: addiere 7 und setze die unteren 3 Bits = 
0).

von Pascal H. (_pascal_)


Lesenswert?

Ok das macht sinn :)

Da ich jetzt sowieso cpp verwende, wollte ich gerade mal schnell ein 
#include <iostream> mit std::string test("test"); in meinem Programm 
schreiben.

Leider laeuft das Programm jetzt nicht mehr los wenn ich es flash.

Und ich glaube ich weis auch warum. Ohne #include <iostream> ist das 
Programm 132K gross.


Mit iostream ist es 928K gross !! so viel Platz hab ich doch gar nicht 
...

Dh. ich sollte mir das mit iostream ganz schnell aus dem Kopf schlagen?

von Jojo S. (Gast)


Lesenswert?

arm-none-eabi-size ${BuildArtifactFileName}

Pascal H. schrieb:
> Dh. ich sollte mir das mit iostream ganz schnell aus dem Kopf schlagen?

ja, definitiv. Ein Zitat von einem Kommentar auf Stackoverflow.com: 
'iostream adds cin, cout and cerr, which pulls in everything but the 
kitchen sink'.

In C++ auf dem µC sollte man ausserdem RTTI und Exceptions nicht 
benutzen, deshalb die Optionen '-fno-rtti -ffunction-sections 
-fdata-sections -fno-exceptions -fno-delete-null-pointer-checks 
-fomit-frame-pointer' hinzufügen.

Um die Codegrösse anzuzeigen (text segment):
arm-none-eabi-size output.elf

> Ohne #include <iostream> ist das
> Programm 132K gross.

Das ist auch schon viel zu gross, meinst du wirklich die text size? Die 
Grösse vom .elf ist uninteressant, da sind auch die Debug Infos drin. 
Mit den Optimierungen komme ich für die Debug Version auf 4388 Bytes, 
ohne Debug werden es nur 1700 Bytes.

von Pascal H. (_pascal_)


Lesenswert?

Hallo jojos,

ja ich hatte einfach mit "du -s TestMBED.elf" die komplette grosse 
genommen.

Ich habe die von dir genannten flags verwendet und komme auf eine grosse 
von 2660 bei der text section im Release mit maximaler Optimierung.
1
make all 
2
Building file: ../lpc/GPIO_LPC17xx.cpp
3
Invoking: Cross ARM C++ Compiler
4
arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -DLPC175x_6x -I"/home/pheinrich/workspace/test/TestSize" -I"/home/pheinrich/workspace/test/TestSize/lpc" -I"/home/pheinrich/workspace/test/TestSize/cmsis" -std=gnu++11 -fabi-version=0 -fno-exceptions -fno-rtti -fno-delete-null-pointer-checks -fomit-frame-pointer -fdata-sections -ffunction-sections -MMD -MP -MF"lpc/GPIO_LPC17xx.d" -MT"lpc/GPIO_LPC17xx.o" -c -o "lpc/GPIO_LPC17xx.o" "../lpc/GPIO_LPC17xx.cpp"
5
Finished building: ../lpc/GPIO_LPC17xx.cpp
6
 
7
Building file: ../lpc/PIN_LPC17xx.cpp
8
Invoking: Cross ARM C++ Compiler
9
arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -DLPC175x_6x -I"/home/pheinrich/workspace/test/TestSize" -I"/home/pheinrich/workspace/test/TestSize/lpc" -I"/home/pheinrich/workspace/test/TestSize/cmsis" -std=gnu++11 -fabi-version=0 -fno-exceptions -fno-rtti -fno-delete-null-pointer-checks -fomit-frame-pointer -fdata-sections -ffunction-sections -MMD -MP -MF"lpc/PIN_LPC17xx.d" -MT"lpc/PIN_LPC17xx.o" -c -o "lpc/PIN_LPC17xx.o" "../lpc/PIN_LPC17xx.cpp"
10
Finished building: ../lpc/PIN_LPC17xx.cpp
11
 
12
Building file: ../lpc/syscalls.cpp
13
Invoking: Cross ARM C++ Compiler
14
arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -DLPC175x_6x -I"/home/pheinrich/workspace/test/TestSize" -I"/home/pheinrich/workspace/test/TestSize/lpc" -I"/home/pheinrich/workspace/test/TestSize/cmsis" -std=gnu++11 -fabi-version=0 -fno-exceptions -fno-rtti -fno-delete-null-pointer-checks -fomit-frame-pointer -fdata-sections -ffunction-sections -MMD -MP -MF"lpc/syscalls.d" -MT"lpc/syscalls.o" -c -o "lpc/syscalls.o" "../lpc/syscalls.cpp"
15
Finished building: ../lpc/syscalls.cpp
16
 
17
Building file: ../cmsis/cmsis_nvic.c
18
Invoking: Cross ARM C Compiler
19
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -DLPC175x_6x -I"/home/pheinrich/workspace/test/TestSize" -I"/home/pheinrich/workspace/test/TestSize/lpc" -I"/home/pheinrich/workspace/test/TestSize/cmsis" -std=gnu11 -MMD -MP -MF"cmsis/cmsis_nvic.d" -MT"cmsis/cmsis_nvic.o" -c -o "cmsis/cmsis_nvic.o" "../cmsis/cmsis_nvic.c"
20
Finished building: ../cmsis/cmsis_nvic.c
21
 
22
Building file: ../cmsis/startup_LPC17xx.S
23
Invoking: Cross ARM GNU Assembler
24
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -x assembler-with-cpp -DLPC175x_6x -MMD -MP -MF"cmsis/startup_LPC17xx.d" -MT"cmsis/startup_LPC17xx.o" -c -o "cmsis/startup_LPC17xx.o" "../cmsis/startup_LPC17xx.S"
25
Finished building: ../cmsis/startup_LPC17xx.S
26
 
27
Building file: ../cmsis/system_LPC17xx.c
28
Invoking: Cross ARM C Compiler
29
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -DLPC175x_6x -I"/home/pheinrich/workspace/test/TestSize" -I"/home/pheinrich/workspace/test/TestSize/lpc" -I"/home/pheinrich/workspace/test/TestSize/cmsis" -std=gnu11 -MMD -MP -MF"cmsis/system_LPC17xx.d" -MT"cmsis/system_LPC17xx.o" -c -o "cmsis/system_LPC17xx.o" "../cmsis/system_LPC17xx.c"
30
Finished building: ../cmsis/system_LPC17xx.c
31
 
32
Building file: ../main.cpp
33
Invoking: Cross ARM C++ Compiler
34
arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -DLPC175x_6x -I"/home/pheinrich/workspace/test/TestSize" -I"/home/pheinrich/workspace/test/TestSize/lpc" -I"/home/pheinrich/workspace/test/TestSize/cmsis" -std=gnu++11 -fabi-version=0 -fno-exceptions -fno-rtti -fno-delete-null-pointer-checks -fomit-frame-pointer -fdata-sections -ffunction-sections -MMD -MP -MF"main.d" -MT"main.o" -c -o "main.o" "../main.cpp"
35
Finished building: ../main.cpp
36
 
37
Building target: TestSize.elf
38
Invoking: Cross ARM C++ Linker
39
arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -T "/home/pheinrich/workspace/test/TestSize/LPC1768.ld" -Xlinker --gc-sections -Wl,-Map,"TestSize.map" --specs=nano.specs -o "TestSize.elf"  ./lpc/GPIO_LPC17xx.o ./lpc/PIN_LPC17xx.o ./lpc/syscalls.o  ./cmsis/cmsis_nvic.o ./cmsis/startup_LPC17xx.o ./cmsis/system_LPC17xx.o  ./main.o   
40
Finished building target: TestSize.elf
41
 
42
Invoking: Cross ARM GNU Create Flash Image
43
arm-none-eabi-objcopy -O ihex "TestSize.elf"  "TestSize.hex"
44
Finished building: TestSize.hex
45
 
46
Invoking: Cross ARM GNU Print Size
47
arm-none-eabi-size --format=berkeley "TestSize.elf"
48
   text     data      bss      dec      hex  filename
49
   2660      108      172     2940      b7c  TestSize.elf
50
Finished building: TestSize.siz

: Bearbeitet durch User
von Jojo S. (Gast)


Lesenswert?

für den Linker gibts ne andere Option für die sections, -flto -Os, dann 
wird es vielleicht noch etwas kleiner. Was bei deinen 512 kB Flash aber 
nicht unbedingt nötig ist :-)
1
arm-none-eabi-c++ -std=c++11 -DLPC175x_6x -D__NEWLIB__ "-IC:\\Users\\sn.DCIMS\\Documents\\lpcxpresso_3.6.3_317\\workspace2\\TestMBED\\cmsis" "-IC:\\Users\\sn.DCIMS\\Documents\\lpcxpresso_3.6.3_317\\workspace2\\TestMBED\\lpc" -Os -fno-rtti -fno-exceptions -fno-delete-null-pointer-checks -Wall -c -fmessage-length=0 -flto -ffat-lto-objects -mcpu=cortex-m3 -mthumb -D__NEWLIB__ -o "lpc\\GPIO_LPC17xx.o" "..\\lpc\\GPIO_LPC17xx.cpp" 
2
arm-none-eabi-c++ -std=c++11 -DLPC175x_6x -D__NEWLIB__ "-IC:\\Users\\sn.DCIMS\\Documents\\lpcxpresso_3.6.3_317\\workspace2\\TestMBED\\cmsis" "-IC:\\Users\\sn.DCIMS\\Documents\\lpcxpresso_3.6.3_317\\workspace2\\TestMBED\\lpc" -Os -fno-rtti -fno-exceptions -fno-delete-null-pointer-checks -Wall -c -fmessage-length=0 -flto -ffat-lto-objects -mcpu=cortex-m3 -mthumb -D__NEWLIB__ -o "lpc\\PIN_LPC17xx.o" "..\\lpc\\PIN_LPC17xx.cpp" 
3
arm-none-eabi-c++ -std=c++11 -DLPC175x_6x -D__NEWLIB__ "-IC:\\Users\\sn.DCIMS\\Documents\\lpcxpresso_3.6.3_317\\workspace2\\TestMBED\\cmsis" "-IC:\\Users\\sn.DCIMS\\Documents\\lpcxpresso_3.6.3_317\\workspace2\\TestMBED\\lpc" -Os -fno-rtti -fno-exceptions -fno-delete-null-pointer-checks -Wall -c -fmessage-length=0 -flto -ffat-lto-objects -mcpu=cortex-m3 -mthumb -D__NEWLIB__ -o main.o "..\\main.cpp" 
4
arm-none-eabi-c++ --specs=nosys.specs -flto -Os -mcpu=cortex-m3 -mthumb -T ../lpc1768.ld -o TestMBED "cmsis\\cmsis_nvic.o" "cmsis\\startup_LPC17xx.o" "cmsis\\system_LPC17xx.o" "lpc\\GPIO_LPC17xx.o" "lpc\\PIN_LPC17xx.o" main.o 
5
arm-none-eabi-size TestMBED 
6
   text     data      bss      dec      hex  filename
7
   1700     1092       28     2820      b04  TestMBED

von Pascal H. (_pascal_)


Lesenswert?

1
...
2
Building file: ../main.cpp
3
Invoking: Cross ARM C++ Compiler
4
arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -flto -DLPC175x_6x -I"/home/pheinrich/workspace/test/TestSize" -I"/home/pheinrich/workspace/test/TestSize/lpc" -I"/home/pheinrich/workspace/test/TestSize/cmsis" -std=gnu++11 -fno-exceptions -fno-rtti -fno-delete-null-pointer-checks -fomit-frame-pointer -fdata-sections -ffunction-sections -MMD -MP -MF"main.d" -MT"main.o" -c -o "main.o" "../main.cpp"
5
Finished building: ../main.cpp
6
 
7
Building target: TestSize.elf
8
Invoking: Cross ARM C++ Linker
9
arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -flto -T "/home/pheinrich/workspace/test/TestSize/LPC1768.ld" -Xlinker --gc-sections -Wl,-Map,"TestSize.map" --specs=nano.specs -o "TestSize.elf"  ./lpc/GPIO_LPC17xx.o ./lpc/PIN_LPC17xx.o ./lpc/syscalls.o  ./cmsis/cmsis_nvic.o ./cmsis/startup_LPC17xx.o ./cmsis/system_LPC17xx.o  ./main.o   
10
Finished building target: TestSize.elf
11
 
12
Invoking: Cross ARM GNU Create Flash Image
13
arm-none-eabi-objcopy -O ihex "TestSize.elf"  "TestSize.hex"
14
Finished building: TestSize.hex
15
 
16
Invoking: Cross ARM GNU Print Size
17
arm-none-eabi-size --format=berkeley "TestSize.elf"
18
   text     data      bss      dec      hex  filename
19
   2448      108      172     2728      aa8  TestSize.elf
20
Finished building: TestSize.siz

Darunter komme ich nicht :(
Naja egal

Auf jedenfall vielen Dank fuer die ausfuehrliche Hilfe :)

: Bearbeitet durch User
Beitrag #5562516 wurde von einem Moderator gelöscht.
Beitrag #5562517 wurde von einem Moderator gelöscht.
Beitrag #5562518 wurde von einem Moderator gelöscht.
Beitrag #5562519 wurde von einem Moderator gelöscht.
Beitrag #5855566 wurde von einem Moderator gelöscht.
Beitrag #5855567 wurde von einem Moderator gelöscht.
Beitrag #5855568 wurde von einem Moderator gelöscht.
Beitrag #5855569 wurde von einem Moderator gelöscht.
Beitrag #5855591 wurde von einem Moderator gelöscht.
Beitrag #5855592 wurde von einem Moderator gelöscht.
Beitrag #5855593 wurde von einem Moderator gelöscht.
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.