Übergabe von Arrayeinträgen

Gast #3455969
Lesenswert?

Hallo,

ich hoffe jemand kann mir so kurz vor Weihnachten noch bei einem Problem 
helfen:)

Und zwar ist mein Ziel über ein Grafikdisplay die Slave-Adresse für I2C 
einstellen. Ich benutze den MSP430F5310. Diese muss als Hex-Wert ins 
passende Register eingetragen werden. Dabei handelt es sich eigentlich 
um 7 Bit.
1
char *slaveAdr_ausgabe[92] = { "08", "09", "0A", "0B", "0C", "0D", "0E", "0F",
2
    "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1A", "1B",
3
    "1C", "1D", "1E", "1F", "20", "21", "22", "23", "24", "25", "26", "27",
4
    "28", "29", "2A", "2B", "2C", "2D", "2E", "2F", "30", "31", "32", "33",
5
    "34", "35", "36", "37", "38", "39", "3A", "3B", "3C", "3D", "3E", "3F",
6
    "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4A", "4B",
7
    "4C", "4D", "4E", "4F", "50", "51", "52", "53", "54", "55", "56", "57",
8
    "58", "59", "5A", "5B", "5C", "5D", "5E", "5F", "60", "61", "62", "63"};

Allerdings habe ich hier schon probleme. Wenn das Array zu groß ist, 
also 128 Einträge hat, dann hab ich ein ganz seltsames Phänomen beim 
builden. Ich benutze Code Composer Studio und wenn ich auf debuggen 
gehe, compiliert er, aber ich bekomme den Resume-Butten nicht 
freigegeben. Nur der Pausen und Stopp Button sind da. Es entstehen 
keinerlei Fehlermeldungen.

In einer Methode will ich nun I2C mit der Slave Adresse initialisieren. 
Dazu habe ich ein zweites Array mit den passenden Hex-Werten. 
Kommentiere ich die zweite Zeile in meinem Code aus, kompiliert er ganz 
normal. Sonst bekomme ich den resume-Button nicht.
1
uint8_t slaveAdrer = slaveAdr_array1[array_index_receive];
2
    i2c_init(slaveAdrer, speicher_twi_receive[0], 1, 5, 5);

Das Array sieht so aus:
1
unsigned int slaveAdr_array1[128] = { 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF,
2
    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
3
    0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
4
    0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33,
5
    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
6
    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B,
7
    0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
8
    0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63};

Ich wünsche euch schonmal ein frohes Fest und hoffe, dass mir jemand 
helfen kann.
Gast #3455983
Lesenswert?

Hab ich auch schon dran gedacht. Insgesamt habe ich ja 34 KB. Er zeigt 
mir beim kompilieren knapp 30 KB an. Mit einem etwas kleineren Array 
geht es, wenn ich es ein bisschen größer mache nicht mehr. Sollte er 
dann keine Fehlermeldung geben?

Was verbraucht so ein Array mit int-Werten?

128*16Bit= 2048 Bit = 256 Byte. Sollte doch eigentlich bei noch 
verbleibenden 4 KB ausreichen, oder übersehe ich was?
Gast #3455989
Lesenswert?

Hi,

warum brauchst Du dafür überhaupt ein Array?
So wie ich das sehe, sind die im Array hinterlegen Indices fortlaufend, 
also würde es reichen
1
slaveAdrer = array_index_receive + 8;
zu benutzen.
Ich vermute mal, dass das eigentliche Programm etwas anders aussieht, 
als das, was Du hier verrätst...

Weiters ist mir aufgefallen, dass Du slaveAdr_array1[128] mit nur 92 
Werten initialisierst, warum?

--jmp
Gast #3455992
Lesenswert?

Ja, das eigentliche Programm sieht anders aus nur viel zu lang, um 
dieses hier zu posten. Naja ich übergebe der Initialisierungsroutine den 
Wert aus dem Array, der vorher auf dem Display eingestellt wurde. Also 
ist da nichts fortlaufend.

Ja habe 92 Werte, weil es damit grad gepasst hat. Aber ich probiere das 
jetzt wirklich mal aus, ob der Programmspeicher einfach voll ist, indem 
ich einfach mal paar c dateien auskommentiere.
Gast #3455999
Lesenswert?

char *slaveAdr_ausgabe[92]

das ist für mich ein array von Zeigern. Es liegt im RAM und benötigt 
92*2 Byte.



unsigned int slaveAdr_array1[128]

Das liegt auch im RAM, wird aber aus dem Flash initialisiert. Und genau 
da kann es haken. RAM zu klein? Initialisierung zu langsam, Watchdog 
schlägt zu?

Wie schon beschrieben, kannst du das erste Feld streichen. Die Werte 
sind fortlaufend.
Das zweite Feld kann mit sonst ins Flash geschickt werden. Oder 
beschreibst du es zur Laufzeit?
#3456003
Lesenswert?

Die beiden Arrays sind doch völlig überflüssig.

Das mit den Strings verbraucht 5 Byte pro Eintrag (zwei Zeichen + 
Stringendezeichen + zwei für den Zeiger). Das könnte man schon mal recht 
einfach auf drei Byte reduzieren, indem man als Typ nimmt:
1
char slaveAdr_ausgabe[3][92];
Wobei der Compiler die Anzahl der Einträge auch selber zählen kann:
1
char slaveAdr_ausgabe[3][];

Zahlen als Strings zu speichern ist aber ohnehin unnnötig, da Du diese 
Strings jederzeit (z.B. mit utoa() oder sprintf()) berechnen kannst:
1
char slaveAdr_str[3];
2
sprintf(slaveAdr_str, "%02X", slaveAdr[x]);

Schon mal ein Array gespart. Aber auch das zweite ist überflüssig, da es 
ja nur eine Reihe aufsteigender Zahlen beinhaltet. Die kann der 
Mikrocontroller sogar noch besser berechnen:
1
char slaveAdr_str[3];
2
unsigned int slaveAdr = x + 0x08;
3
sprintf(slaveAdr_str, "%02X", slaveAdr);
Gast #3456008
Lesenswert?

Ich würde ja gerne das erste Array streichen. Nur das Problem ist, dass 
meine Ausgabemethode am Display Char-Werte oder Strings erwartet. Der 
kann ich keine Hexwerte übergeben. Daher die beiden Arrays.

Nochmal zusammengefasst:

Meine Displayausgabemethode erwartet char oder String
Die Initialisierung des I2C Intwerte in Hexformat.

Meine Überlegung waren da die beiden Arrays. SIe verbrauchen nur 
unglaublich viel Speicherplatz. Gibt es da vll ne andere Möglichkeit?

Ne ich initialisiere schon beim Compilieren, nicht zur Laufzeit.
Gast #3456011
Lesenswert?

Ah perfekt Fabian O. Sowas hab ich gesucht und ist viel elleganter. Ja 
das stimmt, die Arrays verbrauchen viel zu viel Speicher. Werde ich 
nachher gleich mal umsetzen. Melde mich dann nochmal:) Erstmal ganz 
großen Dank!!
#3456044
Lesenswert?

Weils mir gerade noch auffällt: Für 8-Bit-Werte ist der Datentyp 
unsigned char angemessener als unsigned int, denn letzterer braucht 
(mindestens) 16 Bit. Das würde bei dem Array die Hälfte an Speicher 
sparen. Wenn sich die Daten zur Laufzeit nicht ändern, gehört außerdem 
noch ein "const" dazu.

Falls im richtigen Programm in dem Array also doch keine fortlaufenden 
Werte stehen sollten, besser statt
1
unsigned int slaveAdr_array1[128] = {...}
das hier nehmen:
1
const unsigned char slaveAdr_array1[] = {...}
Persönliche Seite #3456090
Lesenswert?

ho ho ho schrieb:
> meine Ausgabemethode am Display Char-Werte oder Strings erwartet. Der
> kann ich keine Hexwerte übergeben.

Andere Leute schreiben sich in dieser Situation eine kleine Funktion, 
die aus einem "Hexwert" einen String erzeugt.

Oder sie schauen in die Dokumentation ihres Compilers, ob es nicht 
möglicherweise in der C-Runtime-Library eine Funktion gibt, die genau 
das erledigt.
Gast #3456135
Lesenswert?

Rufus Τ. Firefly schrieb:
> ho ho ho schrieb:
>> meine Ausgabemethode am Display Char-Werte oder Strings erwartet. Der
>> kann ich keine Hexwerte übergeben.
>
> Andere Leute schreiben sich in dieser Situation eine kleine Funktion,
> die aus einem "Hexwert" einen String erzeugt.

Man, man, man, du musst schon dem Faden folgen: Der Spruch war *nicht 
von mir, sondern vom TE*. Ich gab ihm den Tipp, in seinem Buch zu lesen.

Also mehr Ruhe zu den Feiertagen! ;-)

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