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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.