Forum: Compiler & IDEs Keil C166, xhuge, huge


von clonephone82 (Gast)


Lesenswert?

Hallo Zusammen,

Ich habe aktuell bei einem alten Projekt mit xc164 wieder ein TFR dummy 
Trap => Memory fault => ich vermute ein xhuge, huge Problem.

Ich muss zugeben das ich bei xhuge, huge und far nicht genau weis was 
ich da mache.

Die Erklärungen von Keil zu diesen Themen naja wann man dann aber 
welches braucht das ist für mich nicht klar.

Ist vielleicht noch jemand in diesem Forum, der sich noch mit dem alten 
Zeugs auskennt mir das vielleicht mal einfach erklären kann?

danke
mathias

von Sindelfingen (Gast)


Lesenswert?

Wo ist das Programm?

Sonst, wie immer, Zeile 911.

von Peter D. (peda)


Lesenswert?

Beschreibe doch erstmal das Problem.
Niemand kann in Deinen Kopf schauen.

Wo tritt der Fehler auf, beim Compilieren, Linken oder Ausführen?
Gibt es eine Fehlermeldung, dann copy&paste sie.
Enthält sie Filenamen, Zeilennummern, dann copy&paste die Zeilen in der 
Nähe.

clonephone82 schrieb:
> naja wann man dann aber
> welches braucht das ist für mich nicht klar.

Allgemein bedeutet huge, Dein Program enthält riesige Daten oder Code. 
Falls doch nicht, dann ist es Quatsch, das Huge Model zu verwenden oder 
Variablen als huge zu deklarieren.
Man nimmt immer das kleinste Model bzw. Datenformat, bei dem der 
Compiler/Linker noch keinen Fehler wirft.

von Steffen R. (steffen_rose)


Lesenswert?

Peter Dannegger schrieb:
> Allgemein bedeutet huge, Dein Program enthält riesige Daten oder Code.

Wenn ich mich recht erinnere, benötigt man dies auch für Pointer, die 
außerhalb definierten 16k Pages zeigen.

von steht da doch so (Gast)


Lesenswert?

Steffen Rose schrieb:
> Wenn ich mich recht erinnere

Falsch erinnert. ;-)

near: 16Bit mit 64k Adressbereich auf max. 16k Daten

far: 32Bit mit 256k Adressbereich auf max. 16k Daten

huge: 32Bit mit 16M Adressbereich auf max. 64k Daten

xhuge: 32Bit mit 16M Adressbereich auf max. 16M Daten

http://www.keil.com/support/man/docs/c166/c166_le_memtypes.htm

von Steffen R. (steffen_rose)


Lesenswert?

far Datenpointer:
Wenn ich mich recht erinnere, wurde bei der Pointerarihtmetik nicht die 
Page erhöht. Genau dies sagt 'max. 16k Daten'.

Sollte im Normalfall nicht vorkommen, weil man ja auf definierte Daten 
zugreift. Und diese sind (bei far model) komplett innerhalb einer Page.


> Falsch erinnert. ;-)
Auch dies nur aus der Erinnerung und ggf. für eine ältere Version des 
C166 Compilers.

von steht da doch so (Gast)


Lesenswert?

Steffen Rose schrieb:
> komplett innerhalb einer Page

Das ist das entscheidende bei far. Die referenzierten Daten dürfen 
nicht über eine Page-Grenze gehen.

aus http://www.keil.com/support/man/docs/c166/c166_le_far.htm
 "objects are limited to 16K and may not cross any n*(16K) page 
boundary, where n= {1,2,3,...)"

von clonephone82 (Gast)


Lesenswert?

Hallo,

Vielen Dank euch allen.

@ Sindelfingen: Es geht nicht um einen Code es geht mir einfach 
allgemein darum es zu verstehen.

@steht da doch so
Das ist das entscheidende bei far. Die referenzierten Daten dürfen
nicht über eine Page-Grenze gehen.
=> ja ok und wie merk ich das ich habe das Gefühl das der Linker da 
überhaupt nicht meckert. Ich habe das schon alles gelesen aber eben 
lesen aber bei const daten habe ich halt Probleme denke ich und wie soll 
man das erkennen wenn der Linker einem nicht hilft? Hast du da ein Tipp?

@Peter: ja genau das dachte ich ja eben auch. Ich habe das Projekt mal 
geerbt als ich in der Firma wo ich bin angefangen habe. Leider musste 
ich auch immer wieder neue Sachen dazu bauen etc. Irgendwann ging dann 
der Speicher aus und dann fing ich an dies genau zu analysieren und 
dabei habe ich dann auch vom XLARGE Model auf HLARGE gewechselt weil ich 
eben auch gedacht habe das ich das nicht brauche. Dennoch habe ich noch 
2-3 xhuge im Code ohne diesen läuft es nicht - aber wieso ich diese 
dennoch brauche sehe ich noch nicht.

Der XC164 hat ja

2K Bytes Dual-port RAM for Register Sets and System Stack,
4K Bytes Data RAM Controlled by DMU,
Internal Instruction Memory Block (IMB) Controlled by PMU,
128K Bytes Program Flash, 4K Bytes RAM,

Kann es sein, dass wenn ich zum Beispiel im Flash ganz oben eine const 
struct abgelegt habe und ich diese irgendwo im Code verwenden möchte das 
ich dann ein xhuge brauche weil es ein kann das ich über die 64k hinaus 
komme? bei 128k flash?

Beim RAM kann ich ja nie Probleme haben weil ich ja nie und nimmer 64k 
habe. :-)


danke euch.

von clonephone82 (Gast)


Lesenswert?

Hallo,

Also aktuell hier mal ein Beispiel wo ich nicht ohne XHUGE auskomme, es 
aber nicht verstehe.
1
#define XHUGE xhuge
2
3
typedef struct
4
{
5
  uint16_t mode; /*!< system info mode */
6
  uint16_t reset; /*!< system info reset */
7
  uint16_t dload; /*!< system info dload */
8
  uint16_t can_baudrate;
9
  uint16_t error;
10
  crc16_t crc; /*!< system info crc */
11
  byte_t infobits1; /*!< bits that can be used in the app */
12
  byte_t infobits2; /*!< bits that can be used in the app */
13
}hwinfo_t ;
14
15
// durch prama renameclass wird die sysinfo an den Anfang des RAM´s gelegt
16
// USER CLASS HWINFO die am anfang von 0xC000 liegt
17
#ifdef _KEIL
18
#pragma renameclass(xdata=hwinfo)
19
#pragma NOINIT
20
static hwinfo_t XHUGE hwinfo;
21
#pragma INIT
22
#endif // #ifdef _KEIL
23
24
err_t hwinfo_get_dload(uint16_t *data)
25
{
26
  memcpy(data, &hwinfo.dload, sizeof(uint16_t));
27
  return(ERROR_OK);
28
}

Wenn ich jezt das xhuge oben weglasse dann bekomme ich beim aufruf von 
hwinfo_get_dload nichts richtiges in data zurück. Aber wieso ich jetzt 
ein xhuge brauche eben kann mir das jemand erklären?

danke
sg
mathias

von clonephone82 (Gast)


Lesenswert?

Hallo,

Kann mir da vielleicht jemand helfen?

sg
mathias

von Peter D. (peda)


Lesenswert?

Siemens war schon immer sehr speziell.
Und daß sie an OTP festgehalten haben, wo andere schon jahrelang 
Flash-MC produzierten, hat nicht gerade zur Verbreitung beigetragen.

Ich kann Dir da nicht helfen. Wir setzen nur Atmel und NXP ein.

Zu meinen Fragen hast Du auch nicht geantwortet:
Beitrag "Re: Keil C166, xhuge, huge"

von wo ist er? (Gast)


Lesenswert?

Dann zeige den Code, der nicht funktioniert.

von Steffen R. (steffen_rose)


Lesenswert?

clonephone82 schrieb:
> memcpy(data, &hwinfo.dload, sizeof(uint16_t));

memcpy() arbeitet meiner Erinnerung nach im aktuellen Memory Modell.
Kommt aber evtl. drauf an, was Du linkst.

Schau mal, ob Dir xmemcpy() weiterhilft.

von Lucifer (Gast)


Lesenswert?

Jedes Speichermodell hat eine passende Lib. Und die wird vom Linker 
eingebunden.

Die Frage ist eher, wie hier der Speicher verteilt wird. Renameclass, da 
sollte man wissen, was man tut.

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.