Pointer auf feste Adressen

OP #1143144
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:
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 #1143923
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.
Gast #1144049
Lesenswert?
• ▲
▼
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 #1146176
Lesenswert?
• ▲
▼
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

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.