Forum: Mikrocontroller und Digitale Elektronik Pointer auf feste Adressen


von Tim R. (mugen)


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.

von Reinhard B. (brainstorm)


Lesenswert?

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

Und woran scheitert es?

von Tim R. (mugen)


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.

von Robert W. (rweber)


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/

von 12er Dude (Gast)


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

von Gast (Gast)


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
}

von 12er Dude (Gast)


Lesenswert?

Hallo Gast,

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

tschü Dude

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.