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
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.
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.
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
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.
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,...)"
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.
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
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"
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.