strtoul problem

OP #3257520
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!
Gast #3257542
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?
Gast #3257548
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.
OP #3257552
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren