mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik M16C Pointer Problem


Autor: Thomas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
// Deklaration der Variablen (global)
unsigned char far *data;
...
// Zuweisung der Adresse der Variable im Flash
data = (Adresse 0xF1234);
...
// Funktion 1
void func1 (void)
{
  ... 
  // Hier hat data noch Adresse 0xF1234
  func2(data);
  ...
}

void func2 (unsigned char far *newdata)
{
  ...
  // newdata hat jetzt Adresse 0x1234
  ...
}


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

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ..

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus (Gast)
Datum:

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

Autor: LC-HC (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus (Gast)
Datum:

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

bye

klaus

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Müller (chillymu)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
noch ein Bild des unterschiedlichen Speichers

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.