Forum: Mikrocontroller und Digitale Elektronik M16C Pointer Problem


von Thomas B. (Gast)


Lesenswert?

Hallo!

Hab ein kleines Problem beim Programmierem mit dem M16C/62P Controller.
Dieser verfügt ja über zwei verschiedene Pointer"größen" near und far
(near Adressbereich 64kB, far-Bereich 1Mb).

Habe jetzt eine Funktion welche die Adresse einer (const)Variablen im
Flash (also im far Bereich) an eine andere Funktion übergibt. Dabei
wird aber anscheinend nur ein near Pointer übergeben, obwohl der
Parameter der Funktion als far deklariert ist.

Hier zur Verdeutlichung:
1
// Deklaration der Variablen (global)
2
unsigned char far *data;
3
...
4
// Zuweisung der Adresse der Variable im Flash
5
data = (Adresse 0xF1234);
6
...
7
// Funktion 1
8
void func1 (void)
9
{
10
  ... 
11
  // Hier hat data noch Adresse 0xF1234
12
  func2(data);
13
  ...
14
}
15
16
void func2 (unsigned char far *newdata)
17
{
18
  ...
19
  // newdata hat jetzt Adresse 0x1234
20
  ...
21
}

Hab auch schon probier den Pointer selber im far Bereich zu definieren
(void func2 (unsigned char far * far newdata)), aber auch das brachte
nichts.
Was mache ich falsch ?

Schöne Grüße,
Thomas

von thkais (Gast)


Lesenswert?

Hm - ich habe noch nicht allzuviel mit Pointern auf dem M16C gemacht,
bei mir hats bislang immer geklappt.
Versuchs mal mit einem Type-casting beim Funktionsaufruf von func2.

von Thomas B. (Gast)


Lesenswert?

Hi!

Den Parameter der an func2 übergeben zu casten hab ich schon probiert;
in den verschiedensten Ausprägungen ;)

func2((unsigned char far *)data);
func2((unsigned char far * far)data);

Bringt aber beides nichts. Eigentlich arbeite ich auch schon länger mit
dem M16C und hatte mit Pointern bis jetzt kein Problem. Deswegen
verwundert mich das Verhalten ja etwas.

Mit der Compileroption "fFP", mit der dann alle Pointer automatisch
auf far gestellt werden, funktioniert es dann so wie gewünscht. Das
will ich aber nicht einstellen, da mir das doch einiges an Leistung
abknabbert, wenn überall far Pointer verwendet werden.

von Thomas B. (Gast)


Lesenswert?

Hab mir den Assembler Code angeschaut:

Compiliert mit der Option "-fFP" (alle Pointer far):

func2(data) entspricht
[asm]

lde.w  _data,R0
lde.w  _data+2,R2
pushm  R2,R0
jsr  $func2

[/asm]

und das macht er mir bei deaktivierter Option daraus:

func2((unsigned char far*)data) entspricht
[asm]

push.w  #0000H
push.w  _data
jsr  $func2

[/asm]

D.h. scheinbar liegt das Problem nicht an der Funktion func2 selber,
sondern schon am Aufruf von dieser ..

von Klaus (Gast)


Lesenswert?

Hi,
ich arbeite mit dem IAR Compiler "M16C/6x C-Compiler V1.32A/W32".
Ich mache es immer so:


#pragma memory=constseg (TABLE) :far
   ...
   const char Test_Texte[2][6+1] ={
             {"TEST 1"},  /* Text Testfkt 1 */
             {"TEST 2"}    /* Text Testfkt 2 */
          };
   ...´
#pragma memory=default


void func2(char far *pString);

void func1 (void){

  char far *pText;   // Adresse fuer Anzeigetexte
        ...
  pText = (char far*)(Test_Texte[Test_Id]);
        func2(pText);
        ...
}

Vielleicht hilft es Dir.

Die Anweisung
 "data = (Adresse 0xF1234);"
kenne ich leider nicht.

Welchen Compiler nimmst Du ?

Bye Klaus

von Thomas B. (Gast)


Lesenswert?

Hallo Klaus !

Konnte mein Problem inzwischen eh schon identifizieren. Die
angesprochene Variable war im Headerfile mit extern anders definiert
als im C-File selber. (eben nur mit near statt mit far). Schade daß der
NC30 Compiler sowas nicht erkennt.
Das kommt davon wenn man fremden Sourcecode verwendet (uIP is zudem
auch noch etwas unübersichtlich) ;)

Was das "data = (Adresse 0xF1234)" betrifft. Das sollte nur
verdeutlichen, daß der Pointer dann auf eine Variable an Adresse
0xF1234 zeigt. Sollte ja nur so nen Art Pseude-Code darstellen.

Schöne Grüße,
Thomas

von Klaus (Gast)


Lesenswert?

Hi Thomas,
das mit "fremden Sourcecode" kennen ich (leider) auch.
Willkommen im Club,
:-)) Klaus

von LC-HC (Gast)


Lesenswert?

Hi, ich hab hier grade mitgelesen. Kann mir jemand das mit NEAR und FAR
genauer erklären ? Im moment arbeite ich (Werkstudent) an einem M16C (
SIO3 über DMAC)mit IAR Compiler und hab da auch so meine Probleme mit
der Zieladdresse des DMA.

mfg

LC

von Klaus (Gast)


Lesenswert?

hi,
vielleicht hilft dir die folgen den Artikel:
http://de.wikipedia.org/wiki/X86-Prozessor
        -> Real Mode

http://www.tfh-berlin.de/~msr/pdf-files/Einfuehrung
Mikrocomputer/EMC_Vorlesung Teil 01.pdf

Sie sind zwar nicht für den M16C, aber die Idee ist dieselbe.

bye
klaus

von Klaus (Gast)


Lesenswert?

Hi,
hier ist noch ein Artikel
http://www.netzmafia.de/skripten/ad/thomas-c/zeiger.html#8.9

bye

klaus

von Andreas (Gast)


Lesenswert?

Hallo Jungs,

ich habe an einem R32C/111 Starterkit und habe ein LCD angeschlossen. 
Nun möchte ich Text darauf ausgeben.

Folgendes Problem habe ich.
Ich wollte an eine Funktion einen Text schicken.

f_LCDPrint("Test");

Die Funktion hat als Input einen Pointer der auf den Anfang des Textes 
zeigen soll.

void f_LCDPrint(char *str){
  char i = 0;

  while(str[i]) f_WriteData((char)str[i++]);
  return;
}

Sobald ich den Funktionsaufruf in den Code einsetze zeigt der Linker 
einen neuen Bereich Speicher an: rom_far.

Wenn ich die Funktion über ein Feld aufrufe dann funktioniert es schon:

char chrfeld2[] = "Wie gehts?";

f_LCDPrint(chrfeld2);

Kann mir einer Sagen was das ist und wie ich das ändern kann.

Danke schon mal für die Hilfe.

Andreas

von Andreas M. (chillymu)


Angehängte Dateien:

Lesenswert?

noch ein Bild des unterschiedlichen Speichers

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.