Forum: Compiler & IDEs IAR MSP430 "naked" C-Funktion


von Jan M. (jamo)


Lesenswert?

Hallo,

ich haben einen eigenen kleinen Bootloader geschrieben um den MSP in 
eine andere Firmware zu zwingen. Dieser Einsprungpunkt liegt an einer 
fixen Adresse, der C Code schaut folgendermaßen aus:
1
__root __noreturn void call__force_golden_firmware(void) @ "FORCE_GOLDEN"
2
{
3
     /* Note: This segment has a size of 16 bytes. */
4
5
     __asm("MOV.W #SFE(CSTACK),SP          ; initialize stack pointer   \n"
6
           "CALLA #__force_golden_firmware ; initialize hardware        \n"
7
           "CALLA #main                    ; call main function         \n"
8
     );
9
}
10
11
void __force_golden_firmware(void)
12
{
13
     initHardware();
14
15
     /* mimic cstart_init_zero */
16
     #pragma segment = "DATA16_Z"  // Data initialized to zero
17
     memset(__segment_begin("DATA16_Z"),
18
            0,
19
            __segment_size("DATA16_Z"));
20
21
     /* mimic cstart_init_copy */
22
     #pragma segment = "DATA16_I"  // Data initialized by copying from DATA<nn>_ID
23
     #pragma segment = "DATA16_ID" // Initializers for DATA<nn>_I
24
     memcpy(__segment_begin("DATA16_I"),
25
            __segment_begin("DATA16_ID"),
26
            __segment_size("DATA16_I"));
27
28
     /* TODO: also initialize DATA20 segments if needed */
29
}

Das Disassembly der Section "FORCE_GOLDEN" sieht so aus:
1
00AE00: mov.w #0x5B80,SP
2
00AE04: calla #__force_golden_firmware
3
00AE08: calla #main
4
00AE0C: reta
5
00AE0E: -1
6
00AE0F: -1

Ich möchte verhindern, dass der Compiler eine "reta" Instruktion 
erzeugt.
Im GCC gibt es dazu das Attribut "naked". Wie kann ich das mit dem IAR 
Compiler machen?
"__noreturn" oder "__task" machen das leider nicht.

Jan :)

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jan M. schrieb:
> Ich möchte verhindern, dass der Compiler eine "reta" Instruktion
> erzeugt.

Stören Dich die zwei Bytes Code? Da in einem auch nur halbwegs 
sinnvollen µC-Programm die Funktion main() nie beendet wird, wird 
folglich auch dieses reta niemals aufgerufen.

von Jan M. (jamo)


Lesenswert?

Rufus Τ. F. schrieb:
> Jan M. schrieb:
>> Ich möchte verhindern, dass der Compiler eine "reta" Instruktion
>> erzeugt.
>
> Stören Dich die zwei Bytes Code? Da in einem auch nur halbwegs
> sinnvollen µC-Programm die Funktion main() nie beendet wird, wird
> folglich auch dieses reta niemals aufgerufen.

Das ist mehr oder weniger nur kosmetischer Natur, ich weiß. Es wäre 
trotzdem schön zu wissen wie ich das reta verhindern kann.

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.