Anfänger Konzeptfrage



  • Hallo zusammen,

    ich habe mal wieder eine Anfängerfrage. Ich habe einen Flashspeicher. Diesen möchte ich verwalten über eine Art Bufferpool. Vom Bufferpool Richtung Flash soll, so denk ich mal, am besten die Geschichte als Feld von int oder byte verwalten. Nach außen will ich jedoch char Buffer, int Buffer, struct bla bla Buffer holen können. Also ne Art dynamische Verwaltung des Flashes. Um mich vielleicht nochmal klarer auszudrücken: Ich habe z.B. einen 1GB Flash und will eine Funktion, welche mir dann zB. nen 100 elementigen Buffer vom Typ struct A liefert. Wie macht man das?

    Ich vermute mal sowas wie:

    struct A* getStructABuffer(size_t elem){
    
     //berechne größe des buffers
     //hole buffer
     return (struct A*) getBuffer(groesse);
    
    }
    
    void* getBuffer(size_t size){
    
    //start adresse berechnen
    //end adresse berechnen
    //merken das ich den bereich verkauft habe
    
    return (void*)start_addresse;
    
    }
    

    Kann man sowas machen, oder ist das totaler Quatsch????

    mfg
    uwe



  • size_t groesse = elem * sizeof(struct A);
    

    Wie sieht es mit dem Alignment aus? Normalerweise dürfen primitive Datentypen, die größer als 1 Byte sind, nicht an beliebigen Adresse liegen, sondern beispielsweise nur an Adressen, die durch die Größe des Typs teilbar sind (von der Architektur abhängig). malloc&co. kümmern sich darum, indem sie Speicher immer am größtmöglichen Typ ausrichten. Macht dein getBuffer das auch?



  • Hi Bashar,

    achso, das hätte ich vielleicht sagen sollen. Ich bin in einem Umfeld, wo es keine malloc & co gibt. Daher ist der Versuch über den Buffer soetwas nun ja zu emulieren. Ich bin gerade am überlegen was ich beachten muß und wie ich es lösen könnte. Daher:

    List der Dinge die ich bedenken muß:

    1. Alignment

    😉

    Da kenne ich mich nicht aus. Gibt es nen Link wo kurz drin steht, was ma da beachten muß? Ich fände es halt super, wenn ich es intern z.b als int[] verwalten kann, nach extern aber jedes beliebige Elem drauflegen kann, wobei ich dann halt nur die entsprechenden Wrappermethode anpassen muß. Also in meinen oberen Beispiel, dass getStructABuffer weiß, dass struct A viermal größer als ein int ist und somit sowas wie:

    size_t size = elem * sizeof(struct A);
    

    bzw

    size_t size = elem * 4 * sizeof(int);
    

    macht.

    vielen Dank schonmal
    uwe



  • uwerothfeld schrieb:

    Ich habe einen Flashspeicher. Diesen möchte ich verwalten über eine Art Bufferpool.

    nimm doch ein flash file system. z.b. sowas: http://www.mikrocontroller.net/attachment/19668/uFS.zip
    🙂



  • uwerothfeld schrieb:

    List der Dinge die ich bedenken muß:

    1. Alignment

    Ein Vielfaches von sizeof(int) ist afaik auf den meisten Maschinen unproblematisch.
    Was ist denn das für eine Maschine, und wie groß ist den ein int?

    Prinzipiell mußt du nur herausfinden, ob das auch für deine Maschine gilt.

    Bashar schrieb:

    malloc&co. kümmern sich darum, indem sie Speicher immer am größtmöglichen Typ ausrichten. Macht dein getBuffer das auch?

    Das kann man zum Beispiel mit unions machen:

    typedef int groesstmoeglich_t;    // wenn's für die Maschine stimmt
    
    typedef union ein_block {
        short die_daten;
        groesstmoeglich_t foo;    // erzwingt die Ausrichtung wie Bashar beschrieben hat
    } block_t;
    


  • ~fricky schrieb:

    nimm doch ein flash file system. z.b. sowas: http://www.mikrocontroller.net/attachment/19668/uFS.zip
    🙂

    Für 'nen aufgelöteten Chip OK, aber bei SD/MMC habe ich ganz gerne die Option, das mittem PC- Reader schreiben und lesen zu können.
    Das da funzt recht gut und ist FAT/VFAT- kompatibel http://sourceforge.net/projects/efsl/



  • pointercrash() schrieb:

    ...aber bei SD/MMC habe ich ganz gerne die Option, das mittem PC- Reader schreiben und lesen zu können.

    dafür benutze ich das hier: http://elm-chan.org/fsw/ff/00index_e.html.
    da ist sogar der physical layer mit dabei (mmc im SPI-mode).
    🙂



  • Hi,

    es freut mich erst einmal so viele Antworten zu erhalten. Vielen Dank Jungs. Was habe ich:

    - MSP430 (10kRAM, 48k Flash --> wird später auf ca. 1GB aufgebohrt)
    - Power by 2AA
    - Wireless 802.15.4 kompatibel (2,4Ghz, 250kbps)
    - TinyOS Runtime
    - ne dicke Middelwar obendrauf (ca. 70% des Speichers, ich weiß ... aber nicht von mir)

    Das gute Stück bekommt Daten per Funk. Die sollen so bissl addiert und multipliziert werden. Heißt ich reduziere die Daten so um 95%. Um dies zu tun, muß ich allerdings die Sachen irgendwo zwischenspeichern. Daher die Idee den Flash als Temp zu nutzen. Ich muß weder Dateien noch Directories verwalten, noch ineressiert es mich, ob Windows das Ding lesen kann.

    Was will ich:
    - Speicher aus dem BufferPool anfordern
    - drauf schreiben und lesen
    - wenn ich es nicht mehr brauche, dem BufferPool zurückgeben
    - der soll sich um das löschen fürs wiederbeschreiben kümmern
    - da malloc & co nicht gehen, soll der BufferPool sowas irgendwie annähernd simulieren

    Das uFS lese ich gerade. Die SourceForge Geschichte klingt zwar nett, ist aber viel zu fett. Mit dem letzten Link konnte ich leider nix anfangen.

    Schon mal vielen Dank.

    uwe



  • uwerothfeld schrieb:

    Daher die Idee den Flash als Temp zu nutzen.

    das hört sich nach vielen schreibzugriffen an. wenn ja, dann ist es keine gute idee. dann ist dein flash schnell hinüber. für sowas schliess dir besser 'nen RAM baustein an.

    uwerothfeld schrieb:

    Mit dem letzten Link konnte ich leider nix anfangen.

    da ist ein FAT16/FAT32 filesystem.
    🙂



  • Hallo,

    also wie gesagt, ein richtiges Dateisystem brauch ich nicht, da ich keine Datein habe. Die Schreibzugriffe. Tja, also der große Flash kommt so oder so, da auch Daten dauerhaft gespeichert werden sollen (die Basisdaten, nur die aggregierten werden weitergesendet). Ich weiß das es nicht ideal ist. Allerdings kann man keinen Rambaustein anschließen an das Ding und ich selbst habe von HW keine Ahnung. Auch wird diese "warten auf Daten und dann aggregieren", also viel schreiben auf dem Flash, nicht so oft vorkommen. Wenn es aber vorkommt, dann habe ich viele Daten, welche halt meinen Ram sprengen. Von daher wo sonst hin??? Ich bekomme Daten und Anfragen. Die Datenlänge lokal (Basisdaten) und die Empfangenen sind variabel. Die Anfrage erzeugt immer anders Aggregate. Heißt auch hier variable Ergebnisse. Wenn du ne andere Idee hast, immer her damit 😉

    uwe



  • uwerothfeld schrieb:

    Allerdings kann man keinen Rambaustein anschließen an das Ding und ich selbst habe von HW keine Ahnung.

    es gibt welche mit SPI oder IIC interface. die kann jedes kind anschliessen.

    uwerothfeld schrieb:

    Ich bekomme Daten und Anfragen. Die Datenlänge lokal (Basisdaten) und die Empfangenen sind variabel. Die Anfrage erzeugt immer anders Aggregate. Heißt auch hier variable Ergebnisse. Wenn du ne andere Idee hast, immer her damit

    du solltest dir vielleicht irgendwas überlegen, damit du deine daten häppchenweise verarbeiten kannst. wieviel RAM darfst du denn benutzen?
    🙂



  • Wenn es nur darum geht, empfangene Daten zwischenzuspeichern, die dann in der selben Reihenfolge verarbeitetet und freigegeben werden sollen, könntest du den Speicher einfach als Ringpuffer verwalten.

    Ansonsten könntest du versuchen, mit gleichgroßen Buffern zurechtzukommen, z.B. indem du für größere Anfragen mehrere Buffer reservierst. Dann könntest du die reservierbaren Buffer einfach hintereinander speichern und die gerade unbenutzten in eine verkettete Liste auffädeln.

    Wenn das auch nicht geht kommst du um eine echte dynamische Speicherverwaltung nicht herum, also so etwas malloc. Das ordentlich zu implementieren ist aber nicht so einfach, da man irgendwie verhindern muss, dass der Speicher zu stark fragmentiert.


Anmelden zum Antworten