Cortex-M0 gcc problem
Milan B.
milan na bastl.sk
Sobota Březen 30 16:56:25 CET 2013
On 30. 3. 2013 16:12, Miroslav Mraz wrote:
> 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:
U mna - po skompilovani a zlinkovani, vyzera disassemblovany zaciatok
prilinkovanej funkcie asi takto (tu adresu si netreba vsimat, mapu som
neriesil):
00008020 <__aeabi_idiv>:
8020: 2900 cmp r1, #0
8022: d041 beq.n 80a8 <.divsi3_skip_div0_test+0x84>
00008024 <.divsi3_skip_div0_test>:
8024: b410 push {r4}
8026: 1c04 adds r4, r0, #0
Takze thumb. Kompilovane v 4.7.2 + patch z Yagarto, vlastna kompilacia
pod Linuxom. Podobny vysledok aj u GCC ARM Embedded.
Problem nevidim ani tak v kompilatore, ako skor v nespravnom vybere
vhodnej verzie libgcc pri linkovani. Skontrolujte, ci sa pouzije spravna
multilib kniznica (parameter -v pomoze) - u mna je to kniznica z
adresara ...../lib/gcc/arm-none-eabi/4.7.2/thumb/v6m , co je pre M0 spravne.
Kompilator pochadza odkial? Vlastna kompilacia? Su vygenerovane spravne
varianty kniznic?
-m-
> /* 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-
>>
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list