STM32 uint16_t problem

Gast #4309709
Hallo,

ich habe das Problem, dass beim Zuweisen eines Wertes kleiner 0xFF nur 
die letzten 8bit der uint16_t gesetzt werden.

Ursächlich scheint der ASM befehl MOVS anstatt MOVW.
Hat jemand eine Idee warum das schief geht?
(auch ein (uint16_t) wie auf dem screenshot zu sehen bringt nichts.


Ich benutze IAR 7.40 und einen STM32F4
Angehängte Dateien:
Moderator Persönliche Seite
stm32_progger schrieb:

> ich habe das Problem, dass beim Zuweisen eines Wertes kleiner 0xFF nur
> die letzten 8bit der uint16_t gesetzt werden.

Woran erkennst du das?

> Ursächlich scheint der ASM befehl MOVS anstatt MOVW.

Nö.

Der von dir hervorgehobene Befehl lädt eine 0 ins Register R0, in
der nächsten Zeile wird der Inhalt dieses Registers in die lokale
Variable (auf dem Stack) geschrieben.

Zwei Zeilen darunter dasselbe nochmal mit 0xFFFF (65536), zuerst
als Wortladebefehl ins R0, danach wieder in die Stackvariable.

Das H in STRH bedeutet dabei, dass das Speichern als vorzeichenloses
Halbwort, also eben uint16_t erfolgt.

> Hat jemand eine Idee warum das schief geht?

Es geht nichts schief. :)

p.s.: Das „S“ in „MOVS“ bedeutet “update condition flags”.
Gast
danke schon mal;

ich probiere schon eine weile herum

wenn ich eine uint16_t variable habe und diese auf z.B. 0x0155 setzte 
habe ich im Watchfenster 0x0055
stm32_progger schrieb:
> wenn ich eine uint16_t variable habe und diese auf z.B. 0x0155 setzte
> habe ich im Watchfenster 0x0055

das klingt interessant, zeig doch dazu mal das disassembly.

Walter T. schrieb:
> Und was passiert, wenn Du es auf 0x0155UL setzt?

mich würde wundern, wenn der compiler so doof ist. warum sollte er da 
was wegkürzen?
Der Prozessor sollte damit auch kein problem haben, da mit MOV bis zu 
16bit als Literal geladen werden kann.
Moderator Persönliche Seite
stm32_progger schrieb:

> wenn ich eine uint16_t variable habe und diese auf z.B. 0x0155 setzte
> habe ich im Watchfenster 0x0055

Davon steht allerdings nichts in deinem Code da oben.

Entweder compiliert der Compiler die andere Variante wirklich falsch,
oder aber (halte ich für wahrscheinlicher) dein Debugger zeigt was
Falsches an.  Sieh dir doch mal den Speicher direkt an: schau, welcher
Wert in SP drinsteht und dann schau an dieser Stelle auf den Speicher.

So unüberschaubar viel isses ja hier nicht.
Gast
Es passt doch alles:
R0 wird mit 0 (32 Bit) geladen und dann mit Store Register Half Word (16 
Bit) kopiert. Danach das Gleiche mit 0xFFFF.

Ich denke die Darstellungsoption im Debugger passt nicht.
Gast
stm32_progger schrieb:
> wenn ich eine uint16_t variable habe und diese auf z.B. 0x0155 setzte
> habe ich im Watchfenster 0x0055

Also, nach Lesen deines Screenshots habe ich den starken Verdacht, daß 
das Problem nicht beim Compiler liegt, sondern an anderer Stelle:

- Problem mit deiner Typdeklaration, die vom Debugger womöglich anders 
gelesen wurde als vom Compiler?

- Problem mit deiner Architektur-Deklaration, (sowas wie M4 statt M3 
oder M0 und dergleichen), was ebenfalls zu Diskrepanzen zwischen 
Compiler und Debugger führen könnte

- sonstiges Problem zwischen Compiler und Debugger

Lies in deinem Programm doch mal die besagte Variable aus und schicke 
ihren Inhalt (nach Konvertierung zu Text) über ne serielle 
Schnittstelle.

W.S.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.