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 :)