Pointer auf feste Adressen

OP #1143144
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:
1
int16* auslesen_p = (int16*)0x3F7F00;
2

3
void Speichertestlauf(void)
4
{
5
  Uint16 l_i;
6
  for(l_i=0; l_i<=127;l_i++)
7
  {
8
    speichertestlauf[l_i] = auslesen_p[l_i];
9
  }  
10
}

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.
OP
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.
Gast
Hallo Tim,

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

3
#define START_ARD       0x0815
4
#define SIZE            64
5

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

9
  for(int i = 0; i < SIZE; i++) {
10
    Array[i] = *(pMem++);
11
  }
12
}
13

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

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

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
Gast
hey Dude,

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

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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.