Cortex-M0 gcc problem
Miroslav Mraz
mraz na seznam.cz
Sobota Březen 30 16:12:38 CET 2013
Když si o to říkáte, prosím. Domníval jsem se, že je to poměrně známý
problém. Takže minimální main.c:
/* Jen pro demostraci problemu, nefukcni, bez inicializace chipu */
int main (void);
void Reset_Handler (void) {
main();
}
int main (void) {
volatile int a,b,c;
a = 123000;
b = 456;
c = a / b;
return c;
}
Překlad (+ je nutné i sestavení) pomocí:
arm-none-eabi-gcc -c -Os -Wall -g -mthumb -mcpu=cortex-m0
-mno-thumb-interwork -ffunction-sections -fdata-sections
-fmessage-length=0 -Wa,-adhlns=main.lst -o main.o main.c
arm-none-eabi-gcc -mthumb -mcpu=cortex-m0 -nostartfiles
-mno-thumb-interwork -Wl,--gc-sections -Wl,-Map=firmware.map,--cref -o
firmware.elf main.o -L . -T stm32_flash.ld
Výsledek:
Disassembly of section .text:
08000000 <__aeabi_idiv>:
8000000: e3510000 cmp r1, #0
8000004: 0a000043 beq 8000118 <.divsi3_skip_div0_test+0x110>
08000008 <.divsi3_skip_div0_test>:
8000008: e020c001 eor ip, r0, r1
800000c: 42611000 rsbmi r1, r1, #0
8000010: e2512001 subs r2, r1, #1
8000014: 0a000027 beq 80000b8 <.divsi3_skip_div0_test+0xb0>
8000018: e1b03000 movs r3, r0
800001c: 42603000 rsbmi r3, r0, #0
8000020: e1530001 cmp r3, r1
8000024: 9a000026 bls 80000c4 <.divsi3_skip_div0_test+0xbc>
8000028: e1110002 tst r1, r2
800002c: 0a000028 beq 80000d4 <.divsi3_skip_div0_test+0xcc>
8000030: e311020e tst r1, #-536870912 ; 0xe0000000
8000034: 01a01181 lsleq r1, r1, #3
8000038: 03a02008 moveq r2, #8
800003c: 13a02001 movne r2, #1
8000040: e3510201 cmp r1, #268435456 ; 0x10000000
8000044: 31510003 cmpcc r1, r3
8000048: 31a01201 lslcc r1, r1, #4
800004c: 31a02202 lslcc r2, r2, #4
8000050: 3afffffa bcc 8000040 <.divsi3_skip_div0_test+0x38>
8000054: e3510102 cmp r1, #-2147483648 ; 0x80000000
8000058: 31510003 cmpcc r1, r3
800005c: 31a01081 lslcc r1, r1, #1
8000060: 31a02082 lslcc r2, r2, #1
8000064: 3afffffa bcc 8000054 <.divsi3_skip_div0_test+0x4c>
8000068: e3a00000 mov r0, #0
800006c: e1530001 cmp r3, r1
8000070: 20433001 subcs r3, r3, r1
8000074: 21800002 orrcs r0, r0, r2
8000078: e15300a1 cmp r3, r1, lsr #1
800007c: 204330a1 subcs r3, r3, r1, lsr #1
8000080: 218000a2 orrcs r0, r0, r2, lsr #1
8000084: e1530121 cmp r3, r1, lsr #2
8000088: 20433121 subcs r3, r3, r1, lsr #2
800008c: 21800122 orrcs r0, r0, r2, lsr #2
8000090: e15301a1 cmp r3, r1, lsr #3
8000094: 204331a1 subcs r3, r3, r1, lsr #3
8000098: 218001a2 orrcs r0, r0, r2, lsr #3
800009c: e3530000 cmp r3, #0
80000a0: 11b02222 lsrsne r2, r2, #4
80000a4: 11a01221 lsrne r1, r1, #4
80000a8: 1affffef bne 800006c <.divsi3_skip_div0_test+0x64>
80000ac: e35c0000 cmp ip, #0
80000b0: 42600000 rsbmi r0, r0, #0
80000b4: e12fff1e bx lr
80000b8: e13c0000 teq ip, r0
80000bc: 42600000 rsbmi r0, r0, #0
80000c0: e12fff1e bx lr
80000c4: 33a00000 movcc r0, #0
80000c8: 01a00fcc asreq r0, ip, #31
80000cc: 03800001 orreq r0, r0, #1
80000d0: e12fff1e bx lr
80000d4: e3510801 cmp r1, #65536 ; 0x10000
80000d8: 21a01821 lsrcs r1, r1, #16
80000dc: 23a02010 movcs r2, #16
80000e0: 33a02000 movcc r2, #0
80000e4: e3510c01 cmp r1, #256 ; 0x100
80000e8: 21a01421 lsrcs r1, r1, #8
80000ec: 22822008 addcs r2, r2, #8
80000f0: e3510010 cmp r1, #16
80000f4: 21a01221 lsrcs r1, r1, #4
80000f8: 22822004 addcs r2, r2, #4
80000fc: e3510004 cmp r1, #4
8000100: 82822003 addhi r2, r2, #3
8000104: 908220a1 addls r2, r2, r1, lsr #1
8000108: e35c0000 cmp ip, #0
800010c: e1a00233 lsr r0, r3, r2
8000110: 42600000 rsbmi r0, r0, #0
8000114: e12fff1e bx lr
8000118: e12fff1f bx pc
800011c: e1a00000 nop ; (mov r0, r0)
8000120: e3500000 cmp r0, #0
8000124: c3e00102 mvngt r0, #-2147483648 ; 0x80000000
8000128: b3a00102 movlt r0, #-2147483648 ; 0x80000000
800012c: ea000013 b 8000180 <____aeabi_idiv0_from_arm>
08000130 <__aeabi_idivmod>:
8000130: e3510000 cmp r1, #0
8000134: 0afffff7 beq 8000118 <.divsi3_skip_div0_test+0x110>
8000138: e92d4003 push {r0, r1, lr}
800013c: ebffffb1 bl 8000008 <.divsi3_skip_div0_test>
8000140: e8bd4006 pop {r1, r2, lr}
8000144: e0030092 mul r3, r2, r0
8000148: e0411003 sub r1, r1, r3
800014c: e12fff1e bx lr
08000150 <__aeabi_idiv0>:
8000150: 4770 bx lr
8000152: 46c0 nop ; (mov r8, r8)
08000154 <main>:
void Reset_Handler (void) {
main();
}
int main (void) {
8000154: b51f push {r0, r1, r2, r3, r4, lr}
volatile int a,b,c;
a = 123000;
8000156: 4b06 ldr r3, [pc, #24] ; (8000170 <main+0x1c>)
8000158: 9301 str r3, [sp, #4]
b = 456;
800015a: 23e4 movs r3, #228 ; 0xe4
800015c: 005b lsls r3, r3, #1
800015e: 9302 str r3, [sp, #8]
c = a / b;
8000160: 9801 ldr r0, [sp, #4]
8000162: 9902 ldr r1, [sp, #8]
8000164: f000 f812 bl 800018c <____aeabi_idiv_from_thumb>
8000168: 9003 str r0, [sp, #12]
return c;
800016a: 9803 ldr r0, [sp, #12]
800016c: b005 add sp, #20
800016e: bd00 pop {pc}
8000170: 0001e078 .word 0x0001e078
08000174 <Reset_Handler>:
/* Jen pro demostraci problemu, nefukcni, bez inicializace chipu */
int main (void);
void Reset_Handler (void) {
8000174: b508 push {r3, lr}
main();
8000176: f7ff ffed bl 8000154 <main>
}
800017a: bd08 pop {r3, pc}
800017c: 0000 movs r0, r0
...
08000180 <____aeabi_idiv0_from_arm>:
8000180: e59fc000 ldr ip, [pc] ; 8000188 <____aeabi_idiv0_from_arm
+0x8>
8000184: e12fff1c bx ip
8000188: 08000151 .word 0x08000151
0800018c <____aeabi_idiv_from_thumb>:
800018c: 4778 bx pc
800018e: 46c0 nop ; (mov r8, r8)
8000190: eaffff9a b 8000000 <__aeabi_idiv>
8000194: 00000000 andeq r0, r0, r0
Gcc je 4.7.2 kompilováno (final, Ubuntu) s parametry:
../$GCC/configure --target=arm-none-eabi --prefix=$PREFIX
--enable-interwork --enable-multilib --enable-languages="c,c++"
--with-newlib --disable-shared --with-float=soft --with-gnu-as
--with-gnu-ld
Problém je, že __aeabi_idiv není v thumb, ale arm módu. Pro CM3 problém
není, protože má hardwarovou násobičku, takže se tt. funkce nevolá.
Jak říkám, dovedu se problému zbavit, ale chtěl bych vědět, zda
neexistuje nějaká lepší cesta.
Mrazík
Milan B. píše v So 30. 03. 2013 v 10:41 +0100:
> On 30. 3. 2013 9:32, Miroslav Mraz wrote:
>
> Na zaklade takychto informacii asi tazko povedat.
>
> Kusok kodu a prislusny kusok vygenerovaneho asm, prepinace komkpilatora,
> verzia a povod toho "standardneho" gcc by urcite napomohli.
>
> -m-
>
Další informace o konferenci Hw-list