Große Konstante im ROM..

Gast #162219
Lesenswert?

Hi erstmal :)

Ich habe folgendes Problem.. ich will zu Testzwecken eine sehr große
Konstante in den ROM schreiben.. dies mach ich mit

char code daten[] = { .. 40k hexwerte };

der Controller hat 64k Ram, geht sich also Problemlos aus.. sind auch
richtig im ROM.

nun will ich aber auf einzelne Bytes zugreifen.. der erste Versuch war
ein direkter Zugriff also über daten[ziffer].. ein korrekter Zugriff
war so nicht möglich?

genauer: ich verwendete if(daten[1533]==0xFF) ....
das Programm springt trotz richtigem Inhalt nicht in die Schleife

Somit versuchte ich es über einen Pointer

char *test;
test=test+1533;
if(*test==0xFF) ....

das selbe.. springt nicht in die schleife, obwohl eindeutig 0xFF dort
steht.. (zur Kontrolle wurden alle Mittel des Keil debuggers
verwendet).

dann gings weiter..

char *test;
char space;
test=test+1533;
space=*test;      --> in space steht nun definitiv 0xFF laut debugger!
if(space==0xFF) ... --> springt NICHT in diese schleife ?!

Ich hoffe ihr habt ne idee, ich bin echt am verzweifeln.. falls es eine
bessere möglichkeit gibt auf diese Datenmenge zuzugreifen bin ich gerne
offen für Vorschläge..

bei den Daten handelt es sich übrigens um ein MP3-File welches später
über zu Testzwecken über den internen MP3-Dekoder ausgegeben werden
soll (AT89C51SND1C)..

Danke für eure Hilfe
Grüße
Manuel
Gast #162222
Lesenswert?

Hallo Michael

Danke für deine Antwort.. war ein guter Denkanstoss :)

ich weiß zwar ehrlichgesagt den unterschied zwischen signed und
unsigned char nicht.. (vielleicht kann mir das wer erklären :), aber
nachdem ich jetzt den pointer test als unsigned definiert habe,
funktioniert das so.. :)

Danke,
Schöne Grüße
Manuel
Gast #162225
Lesenswert?

:)

@dicky: ist ein Atmel AT89C51SND1C
Kompiliert wurde mit Keil (7.10 compiler).. ohne warnung :(

übrigens ich höre tatsächlich zum ersten mal heute dass es unsigned
char gibt.. find ich auch komisch.. naja wieder was gelernt :)
Gast #162226
Lesenswert?

ja mensch das ist total wichtig ! siehe auch int und unsigned int, long
und unsigned long. wenn man das nicht weiss kommt man schnell in
teufels küche. egal ob globale variable, array usw... nur bei float,
double und bool gibt es die unterscheidung nicht. ein typisches problem
sind z.b. char (signed) in for/next schleifen wenn die variable über 128
kommen kann...wer von (ältere versionen) basic kommt, weiss das manchmal
nicht. auch in asm sieht man zunächst alles wie unsigned char oder
unsigned int, allerdings gibt es wohl keinen asm-anwender der das nicht
zumindest theoretisch weiss.

merken: wenn irgendwo char,int oder long steht, ist immer die
"signed-version" gemeint. die unsigned version muss immer explizit
angegeben werden. wenn irgendwo aber nur "unsigned" steht, ist
stillschweigend "unsigned int" gemeint. ist leider anfangs etwas
verwirrend.
Gast #162227
Lesenswert?

bei integer wars mir immer klar.. da machts ja auch sinn (negative
zahlen..)

aber bei char find ichs etwas seltsam.. natürlich ist ein char auch nur
ein byte, is ja auch ne zahl.. macht also genauso sinn

gut zu wissen auf jedenfall :)
Gast #162230
Lesenswert?

@Manuel: Das der Compiler in dem Fall den (signed) char Wert (der
natürlich maximal 128 groß sein kann) nicht als 0xFF erkennt liegt
daran, das der Wert, der in der char-Variablen gespeichert ist, als -1
angesehen wird, dagegen wird die 0xFF als vorzeichenbehaftete (also
positive) int Zahl interpretiert und (char)-1 == 255 ist nunmal falsch!
;)

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