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