Forum: Compiler & IDEs GCC komischer fehler


von Felix (Gast)


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);

}

von Random .. (thorstendb) Benutzerseite


Lesenswert?

16 mal shift right ist ne ganze menge, geteilt durch 64k wenn ich mich 
gerad nicht irre. Ist addr breit genug dass noch was übrig bleibt? :-)

Wie gross sind deine short's? (Also auf dem Compiler, meine ich g)


Greetz,
/r.

von Johannes M. (johnny-m)


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.

von Random .. (thorstendb) Benutzerseite


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.

von Andreas K. (a-k)


Lesenswert?

Würde mich nicht wudnern, wenn tatsächlich addr>>8 gemeint ist.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

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.