Hallo zusammen
Auf dem Communication Manager eines TMS320F28388D führe ich den lwIP
Stack um TCP Packete zu empfangen. Wird ein Packet empfangen kopiert die
entsprechende Callback-Routine die Daten in einen Puffer `buffer` und
signalisiert einer Schleife in `main()` mittels flag `command_available`
dass es Daten zu verarbeiten gibt.
In `main()` wird dann die Routine `processCommand()` aufgerufen welche
sich das erste Byte von `buffer` anschaut. Ich kann nicht nachvollziehen
weshalb der if branch niemals ausgeführt wird, obwohl das erste Byte in
`buffer` 0 ist? (s. dazu auch das angehängte Video einer Debugging
Session).
Hier sind relevante Codeausschnitte:
DenDen schrieb:> kann nicht nachvollziehen weshalb der if branch niemals ausgeführt wird
Das wird der Compiler wegoptimiert haben, denn der Code macht doch beide
Male das selbe. Oder wo müsste ich den Unterschied suchen?
DenDen schrieb:> Ich kann nicht nachvollziehen> weshalb der if branch niemals ausgeführt wird, obwohl das erste Byte in> `buffer` 0 ist?
Warum sollte das gemacht werden? Der Programmcode ist in beiden Fällen
der gleiche. Einmal reicht. Im Zweifelsfall schau dir mal den erzeugten
Assembercode an...
DenDen schrieb:> uint8_t buffer[512];
Geht das auf der CPU? Die kleineren Piccolo-Brüder, die ja den gleichen
(ähnlichen?) CPU-Kern haben, können als kleinste Einheit nur 16 Bit
adressieren, da gibt es kein uint8_t.
Lothar M. schrieb:> DenDen schrieb:>> kann nicht nachvollziehen weshalb der if branch niemals ausgeführt wird> Das wird der Compiler wegoptimiert haben, denn der Code macht doch beide> Male das selbe. Oder wo müsste ich den Unterschied suchen?
Sorry, die Routine müsste eigtl. folgendermassen lauten (die beiden
branches sind nicht gleich):
Ich weiß nicht inwiefern dein Chip Ähnlichkeiten zum TMS320F2808 hat,
mit dem hab ich damals in der Diplomarbeit gearbeitet.
Schau dir bitte mal sizeof(char) an. Beim 2808er sind das nämlich 16
Bit, d.h. der Chip kann keine kleineren Dateneinheiten verarbeiten
(evtl. Bits einzeln noch)
bei
1
uint8_t command_code=buffer[0];
könnte es also sein, dass du in Wirklichkeit 16 Bits deines Datenstromes
in command_code speicherst (wobei ich mich dann frage, weshalb es
überhaupt ein uint8_t gibt, das solle dann nämlich nicht definiert sein
um solche Fehler zu vermeiden)
Ok, wenn ich via TCP '0000' sende befinden sich im Speicher tatsächlich
die falschen Werte (vier mal b'00110000' stat b'00000000'), siehe auch
Bild im Anhang.
Die Variablenvorschau in CCS zeigt allerdings 'unsigned char 0' an.
0x0011000 = 0x30 = 48 ist der ASCII-Code von '0'.
Du sendest also "0000" als Text.
Die Variablenvorschau interpretiert wohl char als einen .. Char. Das ist
das Zeichen '0', nicht die Zahl 0.
Christian E. schrieb:> 0x0011000 = 0x30 = 48 ist der ASCII-Code von '0'.> Du sendest also "0000" als Text.>> Die Variablenvorschau interpretiert wohl char als einen .. Char. Das ist> das Zeichen '0', nicht die Zahl 0.
Das ist es, vielen Dank!
Der `uint8_t` wird als `unsigned char` definiert weshalb mir die
Variablenvorschau `0` anzeigt:
Falk B. schrieb:> DenDen B. schrieb:>> unsigned char 0'>> char ist aber auf dieser CPU-Familie 16 Bit breit!
Der Communication Manager besitzt eine ARM Cortex M4 Architektur (der
Chip besitzt einen ARM CM und zwei C28 CPUs).