Hallo,
Als Einsteiger bin ich inzwischen soweit gekommen, mir die Toolchain von
CodeSourcery einzubinden und die Beispielprojekte von Olimex mal zu
kompilieren. Das Verbinden per OpenOCD funktioniert auch soweit, aber am
Flashen scheitert es nun und ich komme nicht so recht weiter, andere
Beiträge haben leider auch nicht geholfen....
Anbei mein cfg fürs Flashen, die Fehlermeldung ist folgende:
1
Info: options.c:50 configuration_output_handler(): #127: 0x0001fc00 (0x400 1kB) not protected
2
Info: options.c:50 configuration_output_handler(): stm32x flash driver info
3
Error: flash.c:890 get_flash_bank_by_addr(): No flash at address 0x00000000
4
5
Info: options.c:50 configuration_output_handler(): wrote 0 byte from file main.bin in 0.000074s (0.000000 kb/s)
Erstmal besten Dank für den Hinweis, ich werde es mal mit dem GDB
versuchen zu flashen. Dafür brauche ich aber offensichtlich erstmal ein
gelinktes ELF. Um das zu erstellen habe ich mein Makefile entsprechend
des Templates von Martin Thomas angepasst, komme damit jetzt aber nicht
weiter. Direkt das Template wollte ich nicht unbedingt nehmen, da ich da
wenig Lerneffekt habe und ich mir auch nicht sicher bin, ob es
entsprechend für den STM32 anpassbar ist...
Meine Versuche haben bisher zu dieser Fehlermeldung geführt:
Was hat es mit dem gdwarf2 auf sich? Hab irgendwie gelesen dass das ein
Fileformat für AVR-GCC ist? Ist das dann hier relevant?
Ist das direkte verwenden von as (aus der CodeSourcery Toolchain)
anstelle dem gcc mit assembler Parameter günstig?
Achja, und jetzt zum Flashen mit GDB: Prinzipiell hat es erstmal
funktioniert :)
Aber: die Definition der memory-packet-size wurde bemerket, dass das
Gerät das eventuell nicht unterstützen würde und ob man die Größe ändern
möchte. Da habe ich dieses Befehle dann einfach weggelassen. Beim
schreiben habe ich den offset auf 0 gesetzt, da das imho bereits in dem
Linkerscript enthalten ist:
1
MEMORY
2
{
3
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
4
rom (rx) : ORIGIN = 0x00000000, LENGTH = 128K
5
}
6
SECTIONS
7
{
8
. = 0x0; /* From 0x00000000 */
9
.text : {
10
*(vectors) /* Vector table */
11
*(.text) /* Program code */
12
*(.rodata) /* Read only data */
13
} >ram
14
. = 0x20000000; /* From 0x20000000 */
15
.data : {
16
*(.data) /* Data memory */
17
} >ram
18
.cs3.rom :
19
{
20
__cs3_region_start_rom = .;
21
*(.cs3.region-head.rom)
22
*(.rom)
23
. = ALIGN (8);
24
} >rom
25
.cs3.rom.bss :
26
{
27
*(.rom.b)
28
. = ALIGN (8);
29
} >rom
30
.bss : {
31
*(.bss) /* Zero-filled run time allocate data memory */
32
} >ram
33
}
34
/*========== end of file ==========*/
Und der unschönste Fehler: ich kann nicht nochmal flashen, bzw.
zugreifen zum debuggen:
1
Remote debugging using localhost:3333
2
Cannot access memory at address 0xb2ab6a3e
Openocd gibt offensichtlich einen Fehler bzgl. Zugriff aus:
Prinzipiell kann der OpenOCD auch ein bin oder hex file flashen, siehe
Doku von OpenOCD.
Was es mit dem -gdwarf-2 auf sich hat steht in der Doku von
www.gnuarm.org >> Support.
Ich denke mit dieser Doku studieren ist der Lerneffekt am größten, und
die Doku lügt nicht.
Ok da werde ich dort mal demnächst reinschauen wegen diese Punkten.
Und hättest du noch event. Hinweise für mich wegen dem Problem mit "set
remote memory-write-packet-size 1024" und "set remote
memory-read-packet-size 1024"?
Aber was noch ärgerlicher ist: Wieso kann ich nicht mehr flashen? Der
Zugriff ist doch jetzt auf einen völlig unsinnigen Bereich (Cannot
access memory at address 0xb2ab6a3e) obwohl ich sonst nichts weiter
geändert habe?
Die OpenOCD Kommandos (wie auch das Flashen) können direkt über Telnet
(Hyperterminal mit Port 4444) eingegeben werden, dann können Sie auch
ohne GDB flashen und der GDB spuck nicht mit irgend welchen fragwürdigen
Befehlen rein.
Bzw. dann wissen Sie ob es der OpenOCD oder der GDB ist.
Der "set remote memory..." kann auch weg gelassen werden.
Ok Super per Telnet gehts auch wieder mit dem flashen. Da muss ich mir
jetzt nur mit den verschiedenen Speicherbereichen mal klar werden, dann
versteh ich auch die entsprechenden Linker-Skripts und Flashbefehle
besser und kann mir ein entsprechends config-File anlegen....
Besten Dank soweit erstmal!
Eine Frage habe ich aktuell noch: was ist der praktische Unterschied von
den beiden Assemblerbefehlen:
1
< AS = $(TRGT)as
2
---
3
> AS = $(TRGT)gcc -x assembler-with-cpp
Das der gcc mit Präprozessor das auch machen kann, habe ich in der Doku
gefunden, aber ist dann praktisch noch ein Unterschied zur Verwendung
von as und was sollte man nutzen?
Ach und versteh ich folgendes richtig: wenn ich im Linker-Skript
folgende Bereiche definiere:
1
MEMORY
2
{
3
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
4
rom (rx) : ORIGIN = 0x00000000, LENGTH = 128K
5
}
und beim flashen dann mittels
1
flashwrite_imagetest.elf0x08000000elf
einen Offset angebe, wird im Programm mit einem Adressraum beginnend ab
0x0 gearbeitet, aber geflasht wird es im Chip-spezifischen Bereich?
Viele Grüße
Johann
Bitteschön.
Also wenn man vom Flash lesen / schreiben möchte, dann ist der ab
0x0800000. Anhand der BOOT-Pins wird der aber gemappt auf 0x00000000 und
das Programm läuft dann am 0x00000000. (Siehe STM Doku, irgendwo steht
das.)
Unterschiede as gcc weiß ich nicht.
Ahja ok so habe ich mir das auch schon gedacht, habe es eben in der
Application Note von ST "getting started" oder so auch so gelesen.
Ist aber irgendwie etwas verwirrend, wenn ich im Linkerscript den
RAM-Bereich so angebe, wie er im Chip implementiert ist (0x20000000) und
den Flash nicht. Aber beim Flashen gebe ich dann den Offset an. Naja,
aber wenn man weiß, dass der Flash per Boot-Pin gemappt wird, dann
machts schon Sinn....
Viele Grüße
Johann