Übergabe von Arrayeinträgen

Gast #3455969
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
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
florian2840 schrieb:
> 128*16Bit= 2048 Bit = 256 Byte. Sollte doch eigentlich bei noch
> verbleibenden 4 KB ausreichen, oder übersehe ich was?

hast du RAM oder Flash betrachtet? Beim Ram braucht man ja auch noch 
Platz für den Stack, diesen kann man nicht ablesen.
Gast
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
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
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?
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
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
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!!
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
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
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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.