Datum:
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
Datum:
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.
Datum:
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.
Datum:
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 ..
Datum:
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
Datum:
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
Datum:
Hi Thomas, das mit "fremden Sourcecode" kennen ich (leider) auch. Willkommen im Club, :-)) Klaus
Datum:
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
Datum:
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
Datum:
Hi, hier ist noch ein Artikel http://www.netzmafia.de/skripten/ad/thomas-c/zeiger.html#8.9 bye klaus
Datum:
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
