Forum: Mikrocontroller und Digitale Elektronik STM32CubeIDE - kann man dem gdb server einen Schalter mitgeben?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Christoph K. (chriskuku)


Lesenswert?

Ich möchte - experimentweise - dem gdbserver den Schalter
1
set mem inaccessible-by-default off
(den man normalerweie ins .gdbinit schreiben kann) - mitgeben. Geht das, 
z.B. über die Commandline?

: Bearbeitet durch User
von Klaus W. (mfgkw)


Lesenswert?

Der gdbserver läuft auch nicht Lokal auf deinem Rechner, sondern auf dem 
Target.
Was ist dein Target? Wenn es ein PC ist, kannst du ihm das mitgeben was 
der gdbserver dort an Argumenten kennt.
Wenn irgendwo etwas implizit eingebaut ist, was gdbserver-Protokoll 
implementiert (stlink bspw. für STM32), dann musst du dort in der Doku 
schauen.

von Klaus W. (mfgkw)


Lesenswert?

Alles zurück!
Dein Kommando ist doch gar nicht für den gdbserver, sondern für den 
gdb...

von J. S. (jojos)


Lesenswert?

Debug Configurations (Pfeil am Käfersymbol) - Startup Tab - in Init oder 
Run commands eintragen

von Bauform B. (bauformb)


Lesenswert?

Christoph K. schrieb:
> set mem inaccessible-by-default off

Kann man das eigentlich auch genauer einstellen? Also indem man 
bestimmte Adressbereiche für gültig erklärt, z.B. für das RAM 0x20000000 
.. 0x20001fff bis hin zu mehreren Bereichen für verschiedene I/O-Module.

Der Anlass: ein Tippfehler im Linkerscript und schon überschreibt mir 
der gdb mein internes EEPROM.

von Christoph K. (chriskuku)


Lesenswert?

Klaus W. schrieb:
> Der gdbserver läuft auch nicht Lokal auf deinem Rechner, sondern auf dem
> Target.
> Was ist dein Target? Wenn es ein PC ist, kannst du ihm das mitgeben was
> der gdbserver dort an Argumenten kennt.
> Wenn irgendwo etwas implizit eingebaut ist, was gdbserver-Protokoll
> implementiert (stlink bspw. für STM32), dann musst du dort in der Doku
> schauen.

Mein Target ist STLINK-V2 im DISC1 Board (momentan mit der on Board 
MCU).

von Christoph K. (chriskuku)



Lesenswert?

J. S. schrieb:
> Debug Configurations (Pfeil am Käfersymbol) - Startup Tab - in Init oder
> Run commands eintragen

Danke. Habe es so als Kommando SET... in das Initialization Commands 
Feld eingetragen. Sehe zwar keine Fehlermeldung, aber auch keine 
Wirkung.

Seit kurzem kriege ich nämlich immer ein TRACE trap. Zugriff auf Adresse 
(00000000) außerhalb des Programmbereichs, und zwar habe ich jetzt 
festgestellt, daß es am memmap file (Loader map) liegt:
1
MEMORY
2
{
3
        FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 1024K
4
        FLASH_ALIAS (rx)  : ORIGIN = 0x00000000, LENGTH = 1024K
5
        CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K
6
        SRAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 128K
7
}
8
9
SECTIONS
10
{
11
        .text   : {
12
                    flashend = 0x00100000 ;
13
                    ccmbgn   = 0x10000000 ;
14
                    ccmend   = 0x10010000 ;
15
                    srambgn  = 0x20000000 ;
16
                    sramend  = 0x20020000 ;
17
                    *(.text)
18
                  } > FLASH_ALIAS AT > FLASH
19
        .bss    : { *(.bss)  } > CCMRAM
20
        .sram   : { *(.sram) } > SRAM
21
}

Benutze ich den hier, :
1
MEMORY
2
{
3
        FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 1024K
4
        CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K
5
        SRAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 128K
6
}
7
8
SECTIONS
9
{
10
        .text   : {
11
                    flashend = 0x00100000 ;
12
                    ccmbgn   = 0x10000000 ;
13
                    ccmend   = 0x10010000 ;
14
                    srambgn  = 0x20000000 ;
15
                    sramend  = 0x20020000 ;
16
                    *(.text)
17
                  } > FLASH
18
        .bss    : { *(.bss)  } > CCMRAM
19
        .sram   : { *(.sram) } > SRAM
20
}

dann tritt das Problem nicht auf.


EDIT: Kommando zurück. Problem tritt auch im letzteren Fall auf. Liegt 
also nicht an der Loader map. Das Programm läuft nicht auf die 
Einsprungadresse "Reset".

: Bearbeitet durch User
von Bauform B. (bauformb)


Angehängte Dateien:

Lesenswert?

Christoph K. schrieb:
> FLASH_ALIAS (rx)  : ORIGIN = 0x00000000, LENGTH = 1024K

Ist das nützlich? Nach einem Hardware-Reset geht es bei 0x0800'0000 los.

Zur Sache: Es geht um eine Assembler-Programm auf einem F405/407 oder? 
Dabei muss man mit dem Stack-Alignment aufpassen. ARM möchte 8 Byte, das 
müsste man bei jeder Funktion berücksichtigen. Man darf dann z.B. 
Register nur paarweise pushen, ggf. eins unnötigerweise.

Die Einstellung 4-Byte vs. 8-Byte passiert mit STKALIGN im SCB->CCR. 
Default nach Reset ist wahrscheinlich 8. Bei neueren Chips ist das Bit 
read-only auf 8 eingestellt.


> Habe es so als Kommando SET... in das Initialization Commands
> Feld eingetragen. Sehe zwar keine Fehlermeldung, aber auch keine
> Wirkung.

Probier mal "print /x *0x40000000", das müsste je nach Einstellung 
Mecker geben oder nicht.

: Bearbeitet durch User
von Christoph K. (chriskuku)


Lesenswert?

Bauform B. schrieb:
> Christoph K. schrieb:
>> FLASH_ALIAS (rx)  : ORIGIN = 0x00000000, LENGTH = 1024K
>
> Ist das nützlich? Nach einem Hardware-Reset geht es bei 0x0800'0000 los.
>

Ich brauche das Programm (später, nicht unbedingt dieses kleine 
Testprogramm) gelinkt auf 0x00000000, weil die Adressen zu 16bit Token 
werden.

> Zur Sache: Es geht um eine Assembler-Programm auf einem F405/407 oder?

Ja, F407.

> Dabei muss man mit dem Stack-Alignment aufpassen. ARM möchte 8 Byte, das
> müsste man bei jeder Funktion berücksichtigen. Man darf dann z.B.
> Register nur paarweise pushen, ggf. eins unnötigerweise.

Frage: Wenn zu Anfang der Stack richtig aligned ist und ich pushe nur
ein Register (32bit) , dann wird der SP um 4 decrementiert. Und das soll 
dann ein Fehlalignment sein? Dann müßte es ja überall krachen?

Ich finde im Moment das SCB nicht im RM0090 um mal nachzugucken, was die 
Resetwerte sind.

>
> Die Einstellung 4-Byte vs. 8-Byte passiert mit STKALIGN im SCB->CCR.
> Default nach Reset ist wahrscheinlich 8. Bei neueren Chips ist das Bit
> read-only auf 8 eingestellt.
>
>
>> Habe es so als Kommando SET... in das Initialization Commands
>> Feld eingetragen. Sehe zwar keine Fehlermeldung, aber auch keine
>> Wirkung.
>
> Probier mal "print /x *0x40000000", das müsste je nach Einstellung
> Mecker geben oder nicht.

Keine Wirkung, mit oder ohne "set mem inaccessible-by-default off"
print /x *0x40000000
$2 = 0x0

: Bearbeitet durch User
von Bauform B. (bauformb)


Lesenswert?

Christoph K. schrieb:
> Ich finde im Moment das SCB nicht im RM0090 um mal nachzugucken, was die
> Resetwerte sind.

Das ist im Programming Manual versteckt, PM0214 sollte passen.

von Bauform B. (bauformb)


Lesenswert?

Christoph K. schrieb:
> Frage: Wenn zu Anfang der Stack richtig aligned ist und ich pushe nur
> ein Register (32bit) , dann wird der SP um 4 decrementiert. Und das soll
> dann ein Fehlalignment sein? Dann müßte es ja überall krachen?

Keine Ahnung, wann genau es dann kracht, evt. erst bei einem 
Interrupt. Eine kurze/schnelle Funktion, die nur 1 Register pusht und 
poppt, würde dabei sehr selten zum Crash führen.

Aber evt. steht das STKALIGN Bit auch auf 4 und es passiert ein ganz 
anderer Fehler.

von Christoph K. (chriskuku)


Angehängte Dateien:

Lesenswert?

Bauform B. schrieb:
> Christoph K. schrieb:
>> Frage: Wenn zu Anfang der Stack richtig aligned ist und ich pushe nur
>> ein Register (32bit) , dann wird der SP um 4 decrementiert. Und das soll
>> dann ein Fehlalignment sein? Dann müßte es ja überall krachen?
>
> Keine Ahnung, wann genau es dann kracht, evt. erst bei einem
> Interrupt. Eine kurze/schnelle Funktion, die nur 1 Register pusht und
> poppt, würde dabei sehr selten zum Crash führen.
>
> Aber evt. steht das STKALIGN Bit auch auf 4 und es passiert ein ganz
> anderer Fehler.

Wenn ich schrittweise durch die SetupClocks und SetupUART Routinen 
durchsteppe, läuft das Programm (abgesehen davon, daß noch nichts aus 
dem UART rauskommt). Setze ich einen Breakpoint hinter SetupUART, gibt 
es diesen

 Program received signal SIGTRAP, Trace/breakpoint trap.
0x00000000 in ?? ()

Wie kann ich ein komplettes STM32CubeIDE Projekt hier hochladen? Oder 
genügt Source alleine. Ist ja Assembler, also keine sonstigen Libraries. 
Nur ein Makefile.

STKALIGN wird nicht berührt, steht also auf 1 (Reset Value)

: Bearbeitet durch User
von Bauform B. (bauformb)


Lesenswert?

Also, im Moment glaube ich, dass das unmöglich laufen kann. Bei 168MHz 
braucht der Flash-Speicher mindestens 5 wait states und die 
Taktumschaltung besteht aus mehreren Schritten in der richtigen 
Reihenfolge (RM0090 -> Embedded Flash memory interface -> Read 
Interface). Davon sehe ich in deinem Programm nicht viel.

Am einfachsten wäre es, wenn du den Takt vorläufig beim HSI lässt. Sonst 
gibt es so viele zusätzliche und unnötige Fehlerquellen. Immer eins nach 
dem anderen...

Dass es im single step funktioniert, könnte daran liegen, dass du von 
Hand ja ein paar Millionen wait states einfügst. Die CPU ist ja schnell 
genug, nur der Speicher nicht.

Christoph K. schrieb:
> Wie kann ich ein komplettes STM32CubeIDE Projekt hier hochladen? Oder
> genügt Source alleine. Ist ja Assembler, also keine sonstigen Libraries.
> Nur ein Makefile.

Source und Makefile müssen reichen. Wenn es damit nicht läuft, geht's 
mit CubeMX erst recht nicht. Wenn es reines C wäre, mag das anders 
aussehen.

von Christoph K. (chriskuku)


Angehängte Dateien:

Lesenswert?

Hatte die FLASH Parameter Section vergessen hinzuzufügen. Noch mal eine 
aktualisierte Version. Der TRAP 0 ist jetzt weg. Bei der USARTDIV 
Berechnung bin ich mir nicht ganz sicher. Die PCLK1 is 42MHz. Daraus 
berechne ich (OVER8=0) 22.78 => 0x016c als USART_BRR Wert.

: Bearbeitet durch User
von Bauform B. (bauformb)


Lesenswert?

Christoph K. schrieb:
> Bei der USARTDIV Berechnung bin ich mir nicht ganz sicher.
> Die PCLK1 is 42MHz. Daraus berechne ich (OVER8=0) 22.78 => 0x016c
> als USART_BRR Wert.

Die Berechnung ist eigentlich einfacher, die 16 für den fractional Teil 
kürzt sich raus. Dann bleibt: UART_BRR = fck / baud
Oder etwas genauer, weil gerundet: UART_BRR = (fck + baud/2) / baud
Noch einfacher wird's, wenn man nicht auf Hex umrechnet ;)

Bei fck hätte ich mehr Zweifel. Ist der wirklich gleich PCLK1? Ist PCLK1 
wirklich HCLK/4? Ist 42 auch hier die Antwort?


Christoph K. schrieb:
> FLASH_ALIAS (rx)  : ORIGIN = 0x00000000, LENGTH = 1024K
> Ich brauche das Programm (später, nicht unbedingt dieses kleine
> Testprogramm) gelinkt auf 0x00000000, weil die Adressen zu 16bit Token
> werden.

Muss für Forth nicht wenigstens ein Teil im RAM liegen? Da wären die 
Token "nur" ein Offset zu 0x20000000 (oder aber 32 Bit breit). Schau dir 
mal die diversen Maschinenbefehlen an, was mit Basis-Register plus 
Offset möglich ist. Viel ist das nicht, die Entfernungen zwischen 0x0, 
Flash und RAM sind alle zu groß für schön einfache Befehle. Deshalb 
lohnt es sich vielleicht kaum, alles nach 0x0 zu linken.

von Christoph K. (chriskuku)


Lesenswert?

Bauform B. schrieb:
...
 Christoph K. schrieb:
>> FLASH_ALIAS (rx)  : ORIGIN = 0x00000000, LENGTH = 1024K
>> Ich brauche das Programm (später, nicht unbedingt dieses kleine
>> Testprogramm) gelinkt auf 0x00000000, weil die Adressen zu 16bit Token
>> werden.
>
> Muss für Forth nicht wenigstens ein Teil im RAM liegen? Da wären die
> Token "nur" ein Offset zu 0x20000000 (oder aber 32 Bit breit). Schau dir
> mal die diversen Maschinenbefehlen an, was mit Basis-Register plus
> Offset möglich ist. Viel ist das nicht, die Entfernungen zwischen 0x0,
> Flash und RAM sind alle zu groß für schön einfache Befehle. Deshalb
> lohnt es sich vielleicht kaum, alles nach 0x0 zu linken.

Ein großer Teil sind vorkompilierte FORTH Programmteile, die ins Flash 
programmiert werden. Dazu gehört auch der Interpreter. Die "Tokens" sind 
in mir vorliegenden Implementierung so konstruiert, daß die Bits 3-15 
der Offset sind, mit dem die Codeadresse ermittelt wird. Dann gibt es 
ein RAM-Flag, was besagt, daß das Token aus der RAM-Table zu nehmen 
sind. Ein weiteres Bit sagt, daß es sich um eine Primitive handelt. Der 
FORTH-Code ist "headerless", es werden also nicht mehr die Namen der 
FORTH-Worte mitgeschleppt. Spart Platz, macht das Debuggen aber 
schwierig. Lade derzeit die Symboltabelle mit ins System und kann das 
Programm über SWV/ITM Messages tracen. Das System läuft auch bereits im 
DISC1. Ich versuche es auf dieses DIYMORE-Board zu portieren, wobei ich 
es auch erstmalig unter dem Debugger (STM32CubeIDE) laufen lasse. 
Irgendetwas ist anders am DIYMORE, weshalb es derzeit hakt.

Zu der Clock: Es gilt das, was im Assemblerbeispiel gemacht wird:

HPRE=0000 -> /1
HCLK=SYSCLK
PPRE1=5 -> PCLK1=HCLK/4
PPRE2=4 -> PCLK2=HCLK/2

Immer unter der Voraussetzung, ich hab mich nicht vertan. :)

Anm.: der Vorteil, es nach 0 zu linken, ist, daß die Symbole nicht die 
0x08000000 mitschleppen müssen und man dann eben mit 16bit Offsets 
arbeiten kann. Limitiert zwar die Zahl der FORTH Worte bei dieser 
Implementierung auf 8192, aber das ist für die Anwendung vollkommen 
ausreichend.

: Bearbeitet durch User
von Bauform B. (bauformb)


Lesenswert?

Cool, danke!

von Christoph K. (chriskuku)


Angehängte Dateien:

Lesenswert?

Mein Assemblerprogramm in der UARTinitialisierung steckte noch voller 
Fehler. Die Definitionen der Register waren Offsets und ich hatte die 
RCC Base Adresse vergessen. Die Annahmen zur Peripheral Clock waren 
richtig (42MHz) und nach Schreiben des richtigen USARTDIV (42000000 / 
115200 = 364,5833 ~ 365) kam dann auch endlich ein Zeichen ('X') aus dem 
UART.
1
  ldr r1, = USART3_BRR
2
  mov r0, #0
3
  movw r0, #365
4
  str r0, [r1]

Angehängt habe ich auch die Aufzeichnung des "Glitches". Was ist das 
nun? Ein "Idle"-Frame?

: Bearbeitet durch User
von Bauform B. (bauformb)


Lesenswert?

Das sieht ja wie ein echtes Startbit aus. Du triggerst auf die negative 
Flanke und der Cursor steht genau auf der positiven Flanke? Wieviel µs 
sind das, wirklich genau ein Bit @115200 oder Zufall oder ist das Signal 
schon vor T=0 low?

Ein idle frame mit Startbit ist ein schwarzer Schimmel. Aber bei STM 
weiß man ja nie...
Änder mal die Reihenfolge der Initialisierung, die "ruhigste" Methode 
stelle ich mir ungefähr so vor:
1
@ Turn on the clock for USART3
2
@ Set PORTB pin 10 High -> BSR := B10
3
@ Set PORTB pin 10 in output mode
4
@ Enable the USART
5
@ fCLK 42MHz, 115200 baud -> BRR := 365
6
@ Enable the TX, and RX circuit
7
@ Set alternate function 1 to enable USART3 pins on Port B
8
@ Set PORTB pins 10 and 11 in alternate function mode

von Christoph K. (chriskuku)


Angehängte Dateien:

Lesenswert?

Danke, @bauformb, für den Vorschlag. Wollte mich schon drangeben, als 
ich feststellte, daß die Glitches jetzt, mit der Version, die ich 
angehängt habe (168MHz, 42MHz PCLK1, 115200 Bd) verschwunden sind.
macOS, Terminalprogramm pico, bluepill UART)
1
picocom v3.1
2
3
port is        : /dev/cu.usbmodemE1CBBADB1
4
flowcontrol    : none
5
baudrate is    : 115200
6
parity is      : none
7
databits are   : 8
8
stopbits are   : 1
9
escape is      : C-a
10
local echo is  : no
11
noinit is      : no
12
noreset is     : no
13
hangup is      : no
14
nolock is      : no
15
send_cmd is    : sz -vv
16
receive_cmd is : rz -vv -E
17
imap is        : crcrlf,lfcrlf,
18
omap is        : crlf,delbs,
19
emap is        : crcrlf,delbs,
20
logfile is     : none
21
initstring     : none
22
exit_after is  : not set
23
exit is        : no
24
25
Type [C-a] [C-h] to see available commands
26
Terminal ready
27
XXX

--
Grüße
Christoph

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.