mikrocontroller.net

Forum: Compiler & IDEs GCC komischer fehler


Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

}

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas K. (a-k)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.