Hallo!
Ich arbeite auf einem ARM uC mit dem GCC. Es gibt auf dem uC einige
Register die nur word-accessible sind, d.h. es müssen immer 32-bit
gelesen/geschrieben werden (nur LDR Instruktionen). Ich suche nun einen
Weg dies dem GCC klar zu machen. Leider generiert er teilweise
byte-weise Zugriffe (LDRB Instruktionen) wodurch sich das Programm
abschießt...
Kennt jemand eine Lösung?
Klaus schrieb:
Leider generiert er teilweise
> byte-weise Zugriffe (LDRB Instruktionen) wodurch sich das Programm> abschießt...
Zeig doch mal den Code, der die Byte Zugriffe erzeugt !
1) Mach eine lokale Variable reg vom Typ PT_CTRL_U (nicht volatile).
2) Lies das SFR über PT_CTRL.all nach reg.all.
3) Mach deine Modifikationen.
4) Schreib das Register ebenso zurück.
Nich für jede Maschine/SFR ist es adäquat, nach Schema F über Strukturen
auf SFRs zuzugreifen, weil manch SFRs speziell behandelt werden müssen
(zB müssen manche Password-Bits für geschützte Zugriffe gleichzeitig
geändert werden). Daher muss man dann etwas Handarbeit einbringen.
Johann L. schrieb:> 1) Mach eine lokale Variable reg vom Typ PT_CTRL_U (nicht volatile).> 2) Lies das SFR über PT_CTRL.all nach reg.all.> 3) Mach deine Modifikationen.> 4) Schreib das Register ebenso zurück.>> Nich für jede Maschine/SFR ist es adäquat, nach Schema F über Strukturen> auf SFRs zuzugreifen, weil manch SFRs speziell behandelt werden müssen> (zB müssen manche Password-Bits für geschützte Zugriffe gleichzeitig> geändert werden). Daher muss man dann etwas Handarbeit einbringen.
Gibt es evtl. auch ein Compiler Flag oder Type Attribute dafür
byte-weisen Zugriff auf ein Element zu unterbinden?
Hm, es gibt tausende Compiler Schalter für jeden Mist, nur dafür gibts
keinen. Naja so wie Johann es beschrieben hat gehts jedenfalls. Die
lokale Variable brauchte ich nicht, der Zugriff über all hat
ausgereicht:
Klaus schrieb:> Hm, es gibt tausende Compiler Schalter für jeden Mist, nur dafür gibts> keinen.
Stimmt nicht ganz. Das ARM ABI verlangt von einem Compiler, dass
Zugriffe auf volatile Bitfelder auf jeden Fall in der Größe des
Containers zu erfolgen haben. GCC hatte aber bis vor kurzem den Fehler,
dies eben nicht zwangsläufig zu tun. Man kann das bei älteren GCC
Versionen über einen Schalter, dessen Name mir gerade entfallen ist,
erzwingen. Bei neueren GCC ist diese option für ARM Targets automatisch
aktiv. Einfach mal im Manual nachschlagen.
Gruß
Marcus
Klaus schrieb:> nach etwas suchen habe ich "-fstrict-volatile-bitfields" gefunden. Meist> du vielleicht das?
Ja, genau. Wann diese Option eingeführt wurde, weiß ich aber nicht.
--
Marcus