mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pointer auf feste Adressen


Autor: Tim R. (mugen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir ist schon klar, dass dieses Problem öfters angesprochen wurde. Ich 
habe recht viele Probleme mit dem Umgang mit Pointern, da ich selber mit 
denen noch nicht gearbeitet habe. Also sollte jemand ein Buch kennen, 
dass auf hardwarenahe Programmierung eingeht - immer her damit!

Zu meiner Frage. Ich benutze den DSC TMS320F2808, aber dies tut hier 
nichts zur Sache.

Viel wichtiger ist, dass ich Daten ab einer festen Adresse auslesen 
möchte, die sich dynamisch ändern können! Dies habe ich zunächst so 
gelöst:
int16* auslesen_p = (int16*)0x3F7F00;

void Speichertestlauf(void)
{
  Uint16 l_i;
  for(l_i=0; l_i<=127;l_i++)
  {
    speichertestlauf[l_i] = auslesen_p[l_i];
  }  
}

Normal würde ich volatile benutzen, bekomme dies aber nicht hin. Zurzeit 
lese zu Testzwecken aus dem Flash aus, später soll dies auf µC-Bus 
geschehen.
Für eine Hilfe wäre ich sehr dankbar.

Autor: Reinhard B. (brainstorm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tim R. wrote:
> Normal würde ich volatile benutzen, bekomme dies aber nicht hin.

Und woran scheitert es?

Autor: Tim R. (mugen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Reinhard B. wrote:
> Tim R. wrote:
>> Normal würde ich volatile benutzen, bekomme dies aber nicht hin.
>
> Und woran scheitert es?

Ich wollte nur wissen, ob ich mit meiner kleinen Routine richtig liege 
und man es evtl. besser lösen können. Würde mich auch über eine 
Buchempfehlung sehr freuen. Ich mag die C Bücher nicht mehr, die für PCs 
ausgelegt sind.

Autor: Robert Weber (rweber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tim R. wrote:

> Buchempfehlung sehr freuen. Ich mag die C Bücher nicht mehr, die für PCs
> ausgelegt sind.

Dann lies den Klassiker: http://cm.bell-labs.com/cm/cs/cbook/

Autor: 12er Dude (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Tim,

so würde ich es machen:
typedef unsigned long   uint32;

#define START_ARD       0x0815
#define SIZE            64

void ReadMem (uint32 *iAdresse, uint32 *Array) {
  uint32 *pMem = iAdresse;

  for(int i = 0; i < SIZE; i++) {
    Array[i] = *(pMem++);
  }
}

void main (void) {
  static uint32 iMemArray[SIZE];

  ReadMem ((uint32 *)START_ARD, iMemArray);
}

1. Konstanten ersetzt man durch ein Synomym, das erleichtert später 
Anpassungen.
2. Es handelt sich um eine 32Bit CPU und man sollte mit voller 
BUS-Breite zugreifen. (... wenn nicht zeitkritisch ...)
3. Nach Möglichkeit auf globale Variablen verzichten und Parameter 
nutzen.
4. Pointer-Arithmetik erzeugt kompakteren Code

tschü Dude

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey Dude,

Warum definierst du noch eine neue Pointervariable *pMem? Du hast doch 
schon iAdresse...
void ReadMem (uint32 *iAdresse, uint32 *Array) {
  //uint32 *pMem = iAdresse; weglassen....

  for(int i = 0; i < SIZE; i++) {
    //Array[i] = *(pMem++); ändern...
    Array[i] = *(iAdresse++);
  }
}

Autor: 12er Dude (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gast,

is scho recht, macht so ken Sinn, aber so was jemeint:
void ReadMem (int32* const iAdresse, uint32* Array)

tschü Dude

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.