GCC komischer fehler

Gast #752771
Lesenswert?

Hallo Jungs ich habe folgendes Problem beim ansteuern einer mmc-karte:

wenn ich folgenden befehl an meine karte schicke, kommt alles nach 
wunsch zurück:


mmc_commandss(0x51,1,26,0xFF);  //command17 read block

wenn ich das ganze jedoch so, also etwas komfortabler in eine funktion 
eingebettet habe, funktioniert´s nicht mehr:

mmc_commandss(0x51,(adr>>16),adr,0xFF);   //command17 read block

nochmal im zusammenhang;


char mmc_commandss(char befF,short AdrH,short AdrL,char befH ){
spi0_sendbyte(0xFF);
spi0_sendbyte(befF);
spi0_sendbyte(AdrH>>8);
spi0_sendbyte(AdrH);
spi0_sendbyte(AdrL>>8);
spi0_sendbyte(AdrL);
spi0_sendbyte(befH);
spi0_sendbyte(0xFF);
return (spi0_sendnget(0xFF));    // Response als Rückgabewert
}


void mmc_readblock(unsigned long adr,unsigned long length ){

mmc_commandss(0x50,0,length,0xFF);        //block size einstellen

mmc_commandss(0x51,(adr>>16),adr,0xFF);   //block anfordern

while(spi0_sendnget(0xFF) != 0xFE);

}
#752783
Lesenswert?

...Und ganz unabhängig davon, auf welchem Zielsystem Du arbeitest (und 
welche breite dementsprechend short hat), solltest Du Dir im Klaren 
sein, was es bedeutet, eine vorzeichenbehaftete Zahl zu schieben. Da 
kommt vermutlich nicht das raus, was Du willst. Schiebeoperationen sind 
in den meisten Fällen nur bei vorzeichenlosen Werten wirklich sinnvoll, 
es sei denn, man weiß genau was man tut und auch, dass das Schieben 
zumindest beim GCC in Zweierkomplement-Darstellung erfolgt, also das 
Vorzeichenbit berücksichtigt wird.

Also entweder lässt Du Dir für die Schieberei was anderes einfallen oder 
Du bekämpfst Deine Schreibfaulheit und spendierst dem short noch ein 
unsigned...;-) Es ist übrigens zumindest bei absoluten Adressen i.d.R. 
sowieso völlig sinnfrei, vorzeichenbehaftete Typen zu verwenden.
Persönliche Seite #752813
Lesenswert?

ist nicht der default bei compilern für microcontrollern immer der 
unsigned? Oder kocht da auch jeder sein eigenes süppchen?
Ok, ich leg das auch grundsätzlich fest, wenn es gebraucht wird, und 
verlass mich nicht auf ndefaults, aber ...

Beim gcc weiss ich's gerade nicht, beim Keil (ARM) compiler kann man das 
extra einschalten: "[ ] Plain char is signed".

Greetz,
/r.
Moderator Persönliche Seite #752834
Lesenswert?

Random ... wrote:

> ist nicht der default bei compilern für microcontrollern immer der
> unsigned? Oder kocht da auch jeder sein eigenes süppchen?

Was für ein default, der für "short"?  Das ist immer signed,
sonst müsste unsigned short stehen.

> Beim gcc weiss ich's gerade nicht, beim Keil (ARM) compiler kann man das
> extra einschalten: "[ ] Plain char is signed".

Ach über "char" redest du.  Der default ist compilerabhängig, bei den
meisten Compilern kann man es umschalten, und ein portables Programm
muss die drei Typen "char", "signed char" und "unsigned char" streng
auseinander halten, da sie nicht portabel zueinander kompatibel sind.

Aber da stand "short" oben.

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