-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 26

Thema: Array-Alternative

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    06.06.2011
    Beiträge
    16

    Array-Alternative

    Anzeige

    Moin,

    ich habe im Moment ein Array welches so aussieht: uint16_t BitMap[5][200][9]
    Das ganze verbraucht nun 2*5*200*9 Bytes, was ja auf Microcontrollern schon gut spürbar ist. Der springende Punkt ist, dass das Array [200] nur selten voll aufgefüllt wird, häufig gerade mal 1-2 Einträge beinhaltet.

    Gibt es eine Alternative, mit der ich nicht so schnell ans Speicherlimit stoße?

    Viele Grüße

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Das sieht etwas so aus, als ob du das falsche Mittel zum Zweck verwenden wolltest. Was soll es denn eigentlich sein, können und wie ist das Anforderungs/Nutzungsprofil? Evtl. wäre eine dynamische Datenstruktur für dich Interessant, da musst du dich halt selbst mit dem Speichermanagement herumschlagen.

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    06.06.2011
    Beiträge
    16
    Moin,

    es geht um Speicherung von Frames einer 9x14 LED-Matrix. Es soll mehrere verschiedene Animationen, mit jeweils 1-200 Frames geben. In den letzten [9] stehen die jeweiligen Informationen zur Ansteuerung der LEDs drin.

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Naja, "selten" heisst, es kommt ja doch vor. Und dann brauchst du den Platz. d.h. du kannst ihn nicht anderweitig verbraten.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    06.06.2011
    Beiträge
    16
    Zitat Zitat von PicNick Beitrag anzeigen
    Naja, "selten" heisst, es kommt ja doch vor. Und dann brauchst du den Platz. d.h. du kannst ihn nicht anderweitig verbraten.
    Ja es kommt vor. Aber es wird auch bei 1-2 Frames der Platz für 200 Stück verbraucht, das ist das Problem.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Naja, du hast bei Mikrocontrolleranwendungen meist einen recht statischen Speicherverbrauch. Entweder alles was du brauchst passt rein, oder du musst dir was anderes überlegen. Es bringt dir nichts, irgend eine tolle Datenstruktur zu entwerfen und im Worst-Case brauchst du dennoch allen Platz (eher noch viel mehr) und Zeug das vorher funktionierte macht auf einmal Probleme, weil der Speicher nicht mehr länger nur knapp voll, sondern überbelegt ist.

    mfG
    Markus
    Geändert von markusj (02.01.2012 um 15:33 Uhr) Grund: Logikfehler ...
    Tiny ASURO Library: Thread und sf.net Seite

  7. #7
    Erfahrener Benutzer Begeisterter Techniker Avatar von .:Sebastian:.
    Registriert seit
    07.01.2006
    Ort
    Arkon I
    Beiträge
    203
    Moin

    Beschreibe doch mal genauer was du ablegen willst.

    Ich vermute einfach mal :
    5 Animationen mit 200 Frames wobei jedes Frame 9 * 16bit (oder Pixel) hat.

    Jetzt ist die Frage ist das Array hardcoded (also schon zu Compilezeit fest) oder überträgst du es zu Laufzeit z.B. via UART zum uC ?
    Ich vermute mal letzteres weil wenn das Array konstant wäre, konnte man es ja einfach kleiner machen in dem man die unnötigen Frames weglässt.

    Wenn das ganze Laufzeit auf den uC übertragen wird, kannst du das ganze z.B. als verkettete Liste realisieren, musst dich aber selber um das beschaffen und freigeben von Speicher kümmern (siehe dazu malloc http://www.nongnu.org/avr-libc/user-manual/malloc.html und free http://tinyurl.com/7gdvqfc ).
    Allerdings bekommst du damit auch nicht MEHR Speicher.
    Es ist dann wie PicNick angedeutet hat. Da hast zwar freien Speicher, den musst du aber auch frei halten/kannst ihn nicht einfach benutzen, weil ja auch der "seltene" worstcase Fall eintreten kann,
    das du tatsächlich alles brauchst.

    Wenn du tatsächlich immer weniger Speicher benutzen möchtest, musst du deine Frames effizienter ablegen.
    Also die 9*16 bit in weniger als 9*16bit speichern.
    Das klappt aber nur wenn sich Frames wiederholen.
    Als Ansatz würde ich da zu einer Shannon-Fano-Kodierung http://de.wikipedia.org/wiki/Shannon-Fano-Kodierung raten.
    Die Idee dabei ist das einige Symbole (für dich Frames) häufiger auftreten als andere.
    Deshalb bekommen die häufigstem Symbole die kürzesten Codes.
    z.B. ein Frame was einen Smilie enthält bekommt als Code 01.
    Die Codes sind dabei automatisch so gebaut, das in keinem anderen Code die Kombination 01 vorkommt.
    Also kann man die Codewörtern einfach hintereinander in den Speicher knallen 0111001... man brauch keine Trenner zwischen den Codewörtern.
    Irgendwo hast du dann eine Tabelle im Speicher die dir 01 zu einem bestimmten Frame zuordnet.
    Hier liegt halt leider auch der Haken bei 200 unterschiedlichen Frames nützt die das grade mal rein garnichts, weil deine Dekodierungstabelle genauso groß ist,
    weil die Animation (200 Frames).
    Da kann man aber immernoch überlegen ob es sich lohnt einzelne Teile (z.b. 16bit Scheiben) eines Frames so abzulegen.
    Weil wenn die Frames dann auch nur teilweise gleich sind kann man auch wieder Speicher sparen.

    Übrigens Shannon-Fano-Kodierung hat (wenn sie richtig benutzt wird) eine optimale Entropy (gibts einen schönen Beweis dazu) also benutzt es optimal wenig Bits für jedes Codewort.
    Falls du in die Richtung etwas implementieren willst, kann ich dir auch gerne den Trick verraten, wie man solche Kodierungen einfach mit einer Tabelle erzeugen kann (der steht nämlich nicht auf Wikipedia).

    Gruß
    Sebastian

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    06.06.2011
    Beiträge
    16
    Zitat Zitat von .:Sebastian:. Beitrag anzeigen
    Moin

    Beschreibe doch mal genauer was du ablegen willst.

    Ich vermute einfach mal :
    5 Animationen mit 200 Frames wobei jedes Frame 9 * 16bit (oder Pixel) hat.
    5 Animationen, von welchen die längste 200 Frames hat. Jeder Frame 9*16bit, genau.

    Jetzt ist die Frage ist das Array hardcoded (also schon zu Compilezeit fest) oder überträgst du es zu Laufzeit z.B. via UART zum uC ?
    Ich vermute mal letzteres weil wenn das Array konstant wäre, konnte man es ja einfach kleiner machen in dem man die unnötigen Frames weglässt.
    Das ganze ist schon zur Compilezeit fest und wird in den PROGMEM geschrieben. (read-only)

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    16.03.2011
    Ort
    Dresden
    Alter
    30
    Beiträge
    1.937
    Kannst du nicht für jede Animation ein eigenes Array mit der entsprechenden Framezahl erstellen?

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    06.06.2011
    Beiträge
    16
    Nein, weil die Anzahl der Animationen dynamisch ist.

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. LED Array
    Von filth im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 09.12.2008, 13:06
  2. Array
    Von infection im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 26.05.2008, 22:47
  3. Array auf zweidimensionale Array
    Von semicolon im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 25.05.2007, 13:48
  4. globales Array
    Von Baila_me im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 0
    Letzter Beitrag: 15.08.2006, 10:40
  5. Nur Nummern in Array / nur Variablentyp byte als Array?
    Von Crashmichl im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 28.04.2006, 00:15

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •