array volatile, elemente nicht?

Gast #285247
Lesenswert?
• ▲
▼
Hallo zusammen,

Ich habe folgendes (Compiler optimiert zuviel) Problem.

Ich hab ein globales array deklariert:
  volatile uint32_t  FREQUENCY[4];

Das fülle ich mit Daten (aus dem EEPROM). Alles so fein so weit, dann
hab ich ein paar Funktionen, denen ich z.B. &FREQUENCY[3] übergebe und
die dann sachen machen wie
  *freq = *freq + 10 ;

Das Problem ist, dass der Wert im Array nicht sofort up-to-date ist,
weil das alles in Registern stattfindet. In einer anderen Datei greife
ich auf ein array-element zu (später), und merke, das ist veraltet.

kann ich irgendwie den compiler zwingen, die werte auszulesen und
zurückzuschreiben, also im Prinzip sowas wie:

  volatile uint32_t tmp = FREQUENCY_CHANNEL[channel];
  FREQUENCY_CHANNEL[channel] = tmp;

ich hätte also gerne ein array mit volatile elementen, wenn man das so
sagen kann.

Gibts eine Lösung für mein Problem?

Gruss

Jörg M.
Gast #285250
Lesenswert?
• ▲
▼
Hallo,

Was passiert ist folgendes:

   decrease_value(cursor_position, &(FREQUENCY_CHANNEL[channel]) );

mit definition von decrease_value():
   void decrease_value(uint8_t cursor_position, volatile uint32_t
*frequency);

und in dieser Funktion passiert z.B.:
   *frequency -=10000;

Jetzt starte ich mal den Versuch mit dem typedef

Jörg
Gast #285256
Lesenswert?
• ▲
▼
in einem standard-c array gibt es nur die elemente! D.h. ein Array ist
im Prinzip "nur" ein Zeiger auf das erste Element im Array. Damit der
Compiler weiß, wie viel Platz der für die Elemente reservieren soll ist
auch noch eine Größen-angabe nötig.
Schau mal in den Code, wo dein Array liegt.
volatile uint32_t frequency[4];
solle eigentlich schon im RAM liegen.
Zugriffe mit
uint32_t *ptr = &(frequency[3]);
und
*ptr = 23423424;
sollten eigentlich direkt erfolgen, da ptr nur die adresse des wertes
enthält. (Welche auf den RAM zeigt.)
Stell mal deinen Code rein und welchen Compiler du verwendest.
Gast #285257
Lesenswert?
• ▲
▼
Das ist ziemlich viel Code, ich dachte, ich hätte es schon auf das
wesentliche reduziert.

Ich lass den Compiler (avr-gcc (GCC) 3.4.3) mit -Os laufen, weil ich
sonst insgesamt an die Grenzen des Speichers bei mir laufe.

Ich überlege gerade, ob ich mir das array spare, und statt dessen 4
volatile variablen anlege, dann bin ich auf der sicheren Seite.

Jörg
Gast #285258
Lesenswert?
• ▲
▼
Hallo

Asche auf mein Haupt, ich hab mich an einer andren Stelle meines
Programmes um eins verzählt, und hab immer das falsche array-Element
wieder gelesen, und da alle mit dem selben wert initialisiert waren,
war das natürlich das alte, obwohl das richtige sich geändert hatte...


Runde Bier ausgeb

Jörg

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren