www.mikrocontroller.net

Forum: Compiler & IDEs array volatile, elemente nicht?


Autor: Jörg M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuche es mal mit einem typedef.

typedef volatile unsingned long vuint32_t;

vuint32_t  FREQUENCY[4];

...

Ist aber nur so eine Idee.

Autor: SuperUser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie ist den *freq deklariert?

Autor: Jörg M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: SuperUser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha!

Ein gutes Beispiel dafür, dass

uint32_t a[]

nicht das gleiche ist wie ein

uint32_t *a

Autor: Jörg M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und was sagt mir das?



es grüsst
der_auf_dem_schlauch_steht

Jörg

Autor: SuperUser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich muss gestehen, ich habe etwas oberflächlich gelesen, du übergibst ja
nur einen einzigen Wert und nicht das array...

Dann versuch doch mal

uint32_t * volatile a

Autor: SuperUser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ähm ohne garantie, ohne C-Buch schwimme ich hier auch ein wenig...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> uint32_t * volatile a

Das ist garantiert keine Abhilfe.
Hier waere der Pointer selbst volatile und nicht
das worauf er zeigt.

Allerdings: ich weiss auch keine Abhilfe für Jörg

Autor: hans dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Prost

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.