Forum: Mikrocontroller und Digitale Elektronik strtoul problem


von Raphael F. (erdbewohner)


Lesenswert?

Hallo Zusammen!
Ich wollte die Funktion strtoul verwenden, aber sie macht probleme. Ich 
habe mal das Disassembley angeschaut und habe den verdacht, dass sie 
eigentlich 32Bit zurückgibt (in R22-R25), der Compiler aber meint, sie 
würde 16 zurückgeben.
Hier mein Testprogramm:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <string.h>
4
5
int main(void)
6
{
7
  char str[] = "66x";
8
  uint32_t t = strtoul(str, NULL, 16);
9
  PORTA_OUT = t;
10
}
Wenn ich bei PORTA_OUT = t; im Debugger (AVRStudio 6) anhalte, hat 
register 22 0x66, R23-25 hat 0.
Wie bringe ich dem Compiler bei, dass die Funktion 32 Bit zurückgibt? 
Ich kann doch nicht einfach die stdlib ändern, oder?
Vielen Dank für eure Hilfe!

von Peter II (Gast)


Lesenswert?

> 66x
was erwartest du von dem x?

von Raphael F. (erdbewohner)


Lesenswert?

0x66, aber x selbst ist in r24/25 und somit 0.

von Peter II (Gast)


Lesenswert?

Raphael F. schrieb:
> 0x66, aber x selbst ist in r24/25 und somit 0.

aber 66x ist nicht 0x66. Lass doch mal das x weg, du sagst der Funktion 
doch das es Basis 16 nehmen soll.

von Hmm (Gast)


Lesenswert?

Das hier in letzter Zeit übliche Problem:

Es fehlen:
1. Angabe des Compilers
2. Angabe der CPU.
3. Fehlersymptom (Meldung, Verhalten)
Insbesondere: Was lässt Dich annehmen, daß
>der Compiler aber meint, sie würde 16 zurückgeben.
?

4. Besonderer Grund warum Du stdlib.h nicht einbindest.
5. Besonderer Grund warum Du uns die Warnung des Compilers über den 
fehlenden Prototyp nicht zeigst?

von Bastler (Gast)


Lesenswert?

String to unsigned long zur Basis 16 liest bis zum ersten Zeichen 
ungleich 0123456789ABCDEF. Korrektes Ergebnis ist 0x00000066.
Schreib mal "FCA86421", probier's aus und versuch den Unterschied zu 
deiner Version zu verstehen.

von Raphael F. (erdbewohner)


Lesenswert?

Also:
1. Compiler ist der aus AVRStudio 6 (ich glaub GNU C Compiler)
2. ATXmega256A3
3. Soviel ich weiss, sind rückgaben von Funktionen immer in den 
registern r25 und abwärts. Ich habe ins Disassembly geschaut und 
gesehen, dass er in PORTA_OUT das register r24 schreibt:
1
00000125  MOVW R24,R28    Copy register pair 
2
00000126  ADIW R24,0x01    Add immediate to word 
3
00000127  LDI R22,0x00    Load immediate 
4
00000128  LDI R23,0x00    Load immediate 
5
00000129  LDI R20,0x10    Load immediate 
6
0000012A  LDI R21,0x00    Load immediate 
7
0000012B  CALL 0x0000013B    Call subroutine 
8
0000012D  CLR R26    Clear Register 
9
0000012E  SBRC R25,7    Skip if bit in register cleared 
10
0000012F  COM R26    One's complement 
11
00000130  MOV R27,R26    Copy register 
12
  PORTA_OUT = t;
13
00000131  STS 0x0604,R24    Store direct to data space
also ist die rückgabe der Funktion für ihn 16 Bit. R24/25 und somit t 
ist aber 0. Dafür ist R22 neu 0x66. Das würde sinn machen, wenn die 
Funktion 32Bit zurückgibt.
4. Oh, das hab ich vergessen. Es ändert aber nichts.
5. Ob mit oder ohne stdlib.h, er gibt keine Fehler/Warnungen aus.

@Peter II: Das hab ich noch reingemacht, um zu testen, ob die Funktion 
wirklich bei einem Zeichen abbricht, das er nicht lesen kann (und nicht 
nur bei '/0')

@Bastler: Das weiss ich schon. Sorry, das x hat verwirrt. Wenn ich 
FCA86421 eingebe, ist t 0xA8, was meine Hypothese stützt.

von Bastler (Gast)


Lesenswert?

Laut AVR Libc Doku ist strtol in stdlib.h
Und der Compiler wird meckern, daß er die Definition von strtol vermißt 
und
Als Default " int strtol()" annehmen. Return in R24/25. Alles klar?!

von Raphael F. (erdbewohner)


Lesenswert?

Ah ok. Es hat jetzt doch funktioniert. Ich war wohl vorher zu hektisch.
Vielen Dank!!

von Bastler (Gast)


Lesenswert?

Ergänzung:
Wenn was nicht klappt, dann müssen erst ALLE Compiler-Warnungen weg. 
Vorher sitzt das Problem vor dem Schirm ;-)

von Malte S. (maltest)


Lesenswert?

Vor allem müssen sie aktiviert sein -Wall und -Werror sind deine 
Freunde.

von Hmm (Gast)


Lesenswert?

>Ah ok. Es hat jetzt doch funktioniert.

Schön. Aber sag uns nicht woran es lag, damit andere wieder von vorne 
anfangen müssen.

von Raphael F. (erdbewohner)


Lesenswert?

Es war doch das mit der nicht eingebundenen stdlib.h. Dann hab ich nur 
gesehen "Ah, r22 hat wieder 0x66, also das gleiche". Aber so soll es ja 
sein. In PORTA_OUT wurde nähmlich jetzt r22 geschrieben.

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.