Hallo zusammen,
Ich versuche gerade, eine Eigenheit vom IAR Compiler (benutze KickStart
5.20) bei der Codeerzeugung für ARM7TDMI / Thumb Code zu verstehen:
Das Konstrukt sieht in etwa so aus:
(Ausschnitt; R1 ist der Wert für read enable/disable im Fast IO
Set/Clear Register)
Ich vermute, dass die LSL/ASR Orgien mit 16 Bit eine Sign Extension
erwirken sollen, welche durch den Half-Word Store gleich wieder
verworfen wird. Achso, der explizite Cast auf signed short * hat keinen
Einfluss auf die Erzeugung der LSL/ASR Befehle, den hatte ich eben nur
mal zum Testen reingemacht.
a) gäbe es LDRSH für die Sign extension
b) wenn er sie eh verwirft, warum macht er sie dann?
Der Code ist mit Optimierung auf High -> "speed" und jeglichen
Optimierungen aktiviert entstanden.
Ein weiterer Punkt: Viele static void Funktionen, welche 2-3 Mal in der
Datei vorkommen und selbst nur 2-3 Instruktionen enthalten, werden nicht
geinlined sondern über 2 branches (bl, bx) angesprungen. Was soll das?
Vom GCC bin ich da inlining gewöhnt und programmiere deswegen auch auf
dem µC sehr modular - solange es nur ein Einzeiler ist, der nicht
allzuoft verwendet wird und in der gleichen Datei vorkommt erwarte ich
mir inlining. Zuviel verlangt?
Kommentare? Hab ich was falsch verstanden?
Okay, den zweiten Teil habe ich mir gerade selbst beantwortet:
Es ging um Code im Interrupt. Scheinbar hält sich der compiler strikt an
die Vorgabe, Thumbcode zu erzeugen. Der Interrupthandler selbst ist ja
ARM Code, daher muss er mit bx nach Thumb umschalten und springt dann
erst die Funktionen an. Gleiches verhalten übrigens bei #pragma
inline=forced wobei es dann noch ne Warnung "could not inline function
<name>" dazu gibt.
Blöd!