Forum: Compiler & IDEs Buffer im RAM anlegen


von Robin T. (rotoe) Benutzerseite


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.

von WichtigPoPichtig (Gast)


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.

von Robin T. (rotoe) Benutzerseite


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:
1
/*****************************************************************************
2
*
3
*  Function name : Buffer_Write_Str
4
*
5
*  Returns :    None
6
*
7
*  Parameters :  BufferNo  ->  Decides usage of either buffer 1 or 2
8
*          IntPageAdr  ->  Internal page address
9
*          No_of_bytes  ->  Number of bytes to be written
10
*          *BufferPtr  ->  address of buffer to be used for copy of bytes
11
*                  from AVR buffer to dataflash buffer 1 (or 2)
12
*
13
*  Purpose :    Copies one or more bytes to one of the dataflash
14
*          internal SRAM buffers from AVR SRAM buffer
15
*          pointed to by *BufferPtr
16
*
17
******************************************************************************/

Robin T.

von WichtigPoPichtig (Gast)


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.

von Robin T. (rotoe) Benutzerseite


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.

von Stefan E. (sternst)


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"?

von Robin T. (rotoe) Benutzerseite


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.

von Robin T. (rotoe) Benutzerseite


Angehängte Dateien:

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.

von Robin T. (rotoe) Benutzerseite


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!

von STK500-Besitzer (Gast)


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?

von Robin T. (rotoe) Benutzerseite


Lesenswert?

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

Den im internen SRAM.

von Stefan E. (sternst)


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"),
...

von Simon K. (simon) Benutzerseite


Lesenswert?

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

von Robin T. (rotoe) Benutzerseite


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.

von Robin T. (rotoe) Benutzerseite


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.

von Simon K. (simon) Benutzerseite


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.

von Robin T. (rotoe) Benutzerseite


Lesenswert?

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

von WichtigPoPichtig (Gast)


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.

von Robin T. (rotoe) Benutzerseite


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...".

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.