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