Chyba optimalizace, nebo moje?

Jan Waclawek konfera na efton.sk
Středa Duben 21 09:45:44 CEST 2021


Aha a volatile pri asm() tu nepomoze (rovnako ako "bariery"), z pohladu
prekladaca skok z konca na zaciatok bloku v cykle nie je "instrukcia".

Takto to vyzera bez optimalizacie:

void cekej(unsigned int n) { // ==========================================
 10e:	df 93       	push	r29
 110:	cf 93       	push	r28
 112:	00 d0       	rcall	.+0      	; 0x114 <cekej+0x6>
 114:	cd b7       	in	r28, 0x3d	; 61
 116:	de b7       	in	r29, 0x3e	; 62
 118:	9a 83       	std	Y+2, r25	; 0x02
 11a:	89 83       	std	Y+1, r24	; 0x01
	__asm__("cli");
 11c:	f8 94       	cli
	ms=0;
 11e:	10 92 01 02 	sts	0x0201, r1
 122:	10 92 00 02 	sts	0x0200, r1
	__asm__("sei");
 126:	78 94       	sei
	
	while(1) {
		__asm__("cli");
 128:	f8 94       	cli
		if (ms>=n) break;
 12a:	20 91 00 02 	lds	r18, 0x0200
 12e:	30 91 01 02 	lds	r19, 0x0201
 132:	89 81       	ldd	r24, Y+1	; 0x01
 134:	9a 81       	ldd	r25, Y+2	; 0x02
 136:	28 17       	cp	r18, r24
 138:	39 07       	cpc	r19, r25
 13a:	10 f4       	brcc	.+4      	; 0x140 <cekej+0x32>
		__asm__("sei");
 13c:	78 94       	sei
 13e:	f4 cf       	rjmp	.-24     	; 0x128 <cekej+0x1a>
	}
	__asm__("sei");
 140:	78 94       	sei
}
 142:	0f 90       	pop	r0
 144:	0f 90       	pop	r0
 146:	cf 91       	pop	r28
 148:	df 91       	pop	r29
 14a:	08 95       	ret


Zaver je, ze vyssie programovacie jazyky su fundamentalne nevhodne pre mcu,
pretoze v mcu charakteristicky riesime problemy suvisiace s casovanim a
predpisovanim poradia operacii, co je v priamom protiklade so zakladnou
premisou vyssich programovacich jazykov. Toto a potom riesi obezlickami
typu volatile a inline assembler a atomic (v C11), ktore su obezlickami
znova z principu, kedze tie casovacie/sekvenovaci problemy su daleko
zlozitejsie a pravdepodobne nekonecne variabilne, nez aby sa dali takymi
primitivnymi prostriedkami popisat.

Tu konkretne sa jeden casovaci problem (atomicita voci preruseniam)
nahradil inym...

Toto samozrejme detom nemozeme povedat. Asi je vhodnejsie tam nenapadne ten
nop vsunut.

wek



Další informace o konferenci Hw-list