mikrocontroller.net

Forum: Compiler & IDEs Buffer im RAM anlegen


Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

erstmal mein Vorhaben:
Ich möchte einen ADC-Logger programmieren. Dieser soll jede Sekunde die 
Spannung an ADC0 messen und ans Dataflash übergeben und dieses auch 
wieder auslesen und an den UART übergeben.

Nun zu meinem(n) Problem(en):
Ich habe da so eine tolle Libary mit der das Ansteuern des Dataflashes 
schon wunderbar funktioniert.
In dieser Libary gibt es einen Befehl mit dem ich mehrere Bytes auf 
einmal in den Buffer des Dataflashes übetragen kann.
Allerdings möchte dieser Befehl einen Pointer auf einen AVR internen 
Buffer haben.
Dazu muss ich sowas erstmal anlegen (glaub ich) nur wie?

Und da eröffnet sich auch gleich noch ein Problem.
Wenn ich die Daten nach z.B. einem Reset wieder auslesen möchte muss er 
ja noch wissen wieviele Messungen im Dataflash gespeichert sind.
Aber wie und wo lege ich diese Information ab?

Ich könnte jetzt meine bisher geschriebenen Sachen mit anhängen. Ich 
glaube nur dass das nicht helfen würde.


Bin für jede Hilfe dankbar.

Robin T.

Autor: WichtigPoPichtig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da gibt es mehrere Möglichkeiten. Du solltest aber immer im Hinterkopf 
behalten, dass die Flashspeicher nicht unendlich viele Schreibzyklen 
vertragen.

Die einfachste Möglichkeit ist die, das du deine Daten nach dem Auslesen 
löscht. Bei einem Neustart suchst du dir deinen Anfangslesepunk und 
Anfangsschreibpunkt und verwaltest den Speicher als Ringpuffer.

Wenn du die Daten Seitenweise an die UART ausgibst, dann ist das auch 
sehr schonen die den Flashspeicher und es treten so wenig wie möglich 
unnütze Schreibzyklen auf.

Einen Puffer legt man im einfachsten Fall so an:

static uint8_t puffer[10];

puffer ist dann dein Zeiger auf 10 Bytes RAM.

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WichtigPoPichtig wrote:
> Da gibt es mehrere Möglichkeiten. Du solltest aber immer im Hinterkopf
> behalten, dass die Flashspeicher nicht unendlich viele Schreibzyklen
> vertragen.
Ja. Aber sooo oft benutze ich das Ding ja nu' auch nicht ;)

> Die einfachste Möglichkeit ist die, das du deine Daten nach dem Auslesen
> löscht. Bei einem Neustart suchst du dir deinen Anfangslesepunk und
> Anfangsschreibpunkt und verwaltest den Speicher als Ringpuffer.
Das hatte ich sowieso vor.

> Wenn du die Daten Seitenweise an die UART ausgibst, dann ist das auch
> sehr schonen die den Flashspeicher und es treten so wenig wie möglich
> unnütze Schreibzyklen auf.
Würde ich dann so machen.

> Einen Puffer legt man im einfachsten Fall so an:
>
> static uint8_t puffer[10];
>
> puffer ist dann dein Zeiger auf 10 Bytes RAM.
Hab ich jetzt mal gemacht.

Aber wie kann ich jetzt einen Pointer auf diesen Puffer machen? Also 
dass auf jedes Array im puffer ein pointer zeigt. Damit der Befehl aus 
der Dataflash Libary auch den Inhalt von jedem Array von dem puffer ins 
Dataflash schreiben kann?

Die Befehlsbeschreibung sieht übrigens so aus:
/*****************************************************************************
*
*  Function name : Buffer_Write_Str
*
*  Returns :    None
*
*  Parameters :  BufferNo  ->  Decides usage of either buffer 1 or 2
*          IntPageAdr  ->  Internal page address
*          No_of_bytes  ->  Number of bytes to be written
*          *BufferPtr  ->  address of buffer to be used for copy of bytes
*                  from AVR buffer to dataflash buffer 1 (or 2)
*
*  Purpose :    Copies one or more bytes to one of the dataflash
*          internal SRAM buffers from AVR SRAM buffer
*          pointed to by *BufferPtr
*
******************************************************************************/

Robin T.

Autor: WichtigPoPichtig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach die AT45-Teile von Atmel, nehme ich mal an. Mit der Funktion 
schreibst du nur ins FLASH-SRAM. Die Daten müssen dann noch ins 
eigentliche Flash. Wenn z.B. deine Flash-Page noch etwas Speicher frei 
hat, kannst du die ins FLASH-SRAM lesen, deine Daten vom AVR-SRAM in das 
FLASH-SRAM schreiben (diese Funktion) und dann das FLASH-SRAM ins 
eigentliche FLASH schreiben. In der DOKU zu den ICs gibt es eine Grafik 
die das etwas besser erklärt. Der Vorteil der FLASH-Speicher ist ganz 
klar der nicht benötigte Speicher in der CPU.

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WichtigPoPichtig wrote:
> Ach die AT45-Teile von Atmel, nehme ich mal an. Mit der Funktion
> schreibst du nur ins FLASH-SRAM. Die Daten müssen dann noch ins
> eigentliche Flash. Wenn z.B. deine Flash-Page noch etwas Speicher frei
> hat, kannst du die ins FLASH-SRAM lesen, deine Daten vom AVR-SRAM in das
> FLASH-SRAM schreiben (diese Funktion) und dann das FLASH-SRAM ins
> eigentliche FLASH schreiben. In der DOKU zu den ICs gibt es eine Grafik
> die das etwas besser erklärt. Der Vorteil der FLASH-Speicher ist ganz
> klar der nicht benötigte Speicher in der CPU.

Ich weiß :)
Da ist noch eine Funktion mit der der Buffer ans richtige Flash 
übergeben wird. Aber da das tadellos funktioniert hab ichs nicht 
erwähnt.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Aber wie kann ich jetzt einen Pointer auf diesen Puffer machen?

puffer ist der Pointer.

> Also dass auf jedes Array im puffer ein pointer zeigt.

Hä? Der Puffer ist ein einziges Array. Was meinst du also mit "jedes 
Array im puffer"?

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst wrote:
>> Also dass auf jedes Array im puffer ein pointer zeigt.
>
> Hä? Der Puffer ist ein einziges Array. Was meinst du also mit "jedes
> Array im puffer"?

Sry. Blöd artikuliert ;)
Ich meine auf jede Stelle im Array also Puffer[0], Puffer[1],...

Robin T.

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich hänge jetzt mal meinen Quelltext an. Er funktioniert zwar kein 
bisschen aber dann ist es leicher über die Fehler zu diskutieren. Habe 
ihn auch etwas Kommentiert.

Robin T.

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Troetoe wrote:
> Lern doch erstmal, einen PC zu programmieren.
Will aber keine PC's programmieren ;)
Mal davon abgesehen beherrsche ich die meisten Grundlagen nur eben noch 
nicht alle. Habe noch nie etwas mit Pointern gemacht. Was aber nicht 
heißt dass ich nicht programmieren kann oder überhaupt keine Grundlagen 
kann.

> Du kannst es natürlich auch bleiben lassen. Ich glaube nur dass das
> nicht helfen würde. Bin aber auch nicht sonderlich interessiert, auf
> solche unqualifizierten Fragen weitere Antworten zu geben.
Hmm. Ok. Deiner Meinung nach also unqualifizierte Fragen. Aber "weitere 
Antorten"?
Habe noch keine "qualifizierte" Antwort von dir bekommen!

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich meine auf jede Stelle im Array also Puffer[0], Puffer[1],...

Welchen Puffer meinst du jetzt?
Den im Flash oder den im internen SRAM?

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
STK500-Besitzer wrote:
> Welchen Puffer meinst du jetzt?
> Den im Flash oder den im internen SRAM?

Den im internen SRAM.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Robin Tönniges wrote:

> Ich meine auf jede Stelle im Array also Puffer[0], Puffer[1],...

Ein Pointer auf Puffer[0] ist "&Puffer[0]" (alternativ "Puffer"),
auf Puffer[1] ist "&Puffer[1]" (alternativ "Puffer + 1"),
...

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Etwas C-Lektüre zum Kapitel Arrays und Pointer würden nicht schaden, 
würde ich behaupten.

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon K. wrote:
> Etwas C-Lektüre zum Kapitel Arrays und Pointer würden nicht schaden,
> würde ich behaupten.

Da hast du wohl recht.
Bzw. Arrays verstehe ich. Nur mit dem Pointern haperts noch ;)
Und ich glaube ich muss die Features von meinem ADC-Logger etwas 
runterschraiben. Sonst wirds nichts. Einen ganz einfachen hab ich schon 
gemacht. Der hat einfach die Spannung gelesen und direkt auf den UART 
ausgegeben. Aber diesmal sollte es ein Logger sein. Und weil da so ein 
nettes Dataflash aufm Board ist dachte ich mir das nehme ich. Aber ich 
werd das schon irgendwie hinbekommen. War mit den vorherigen Sachen auch 
so.

Danke für eure Mühen.

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Toeroe Toeroe wrote:
> Also wirklich: lern erstmal programmieren und kümmere dich später um
> AVRs. In deinem eigenen Interesse und im Interesse aller Forumsleser,
> die nicht weiter an deinen Fragen interessiert sind.

Wenn du und andere nicht an meinen Fragen interresiert sind brauchen sie 
sie ja nicht zu lesen Augenroll.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Toeroe Toeroe wrote:
> ...

So hart würde ich es jetzt nicht ausdrücken. Er sollte sich halt nur 
noch mal etwas zu Pointern in C durchlesen. Glücklicherweise findet man 
dazu genug im Internetz, sodass er jetzt nicht blöd dasteht und nix mehr 
zu tun hat, bis er an ein C-Buch gekommen ist o.ä.

Trotzdem stimmt es aber: Auf dem PC lässt sich so etwas um einiges 
leichter ausprobieren und debuggen.

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Troeteroetoetoe wrote:
>"Ich bin supertoller Programmierprofi.
Immer dieses "Fliege zum Elefanten" gemache *Augenroll(tut schon langsam 
weh)*

Autor: WichtigPoPichtig (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier haben am WE wohl einige keine/(n) abbekommen ...


static uint16_t pBuffer[60];

pBuffer ist der Pointer. Indexieren kannst du den über pBuffer[x] wobei 
x deine Indexnummer ist.

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan wrote:
> Bei Robin ist das aber ein Dauerzustand.

Mal im Ernst woher willst du das wissen?
Ich schreibe so selten mal eine Frage hier auf weil ich das wirklich nur 
im äußersten Notfall mache wenn ich auch nach längerem Probieren und 
suchen nicht weiterkomme. Das hat nicht zuletzt mit meiner 
Schreibfaulheit zu tun. Und wenn ich etwas weniger schreiben würde heißt 
es nur: "Nenn Details sonst kann man dir nicht helfen...".

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.