Chyba optimalizace, nebo moje?

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


> Asi bych kouknul, jak to vypada po prekladu v assembleru.

void cekej(unsigned int n) { // ==========================================
 10e:	9c 01       	movw	r18, r24
	__asm__("cli");
 110:	f8 94       	cli
	ms=0;
 112:	10 92 01 02 	sts	0x0201, r1
 116:	10 92 00 02 	sts	0x0200, r1
	__asm__("sei");
 11a:	78 94       	sei
	
	while(1) {
		__asm__("cli");
 11c:	f8 94       	cli
		if (ms>=n) break;
 11e:	80 91 00 02 	lds	r24, 0x0200
 122:	90 91 01 02 	lds	r25, 0x0201
 126:	82 17       	cp	r24, r18
 128:	93 07       	cpc	r25, r19
 12a:	48 f4       	brcc	.+18     	; 0x13e <cekej+0x30>
		__asm__("sei");
 12c:	78 94       	sei
	__asm__("cli");
	ms=0;
	__asm__("sei");
	
	while(1) {
		__asm__("cli");
 12e:	f8 94       	cli
		if (ms>=n) break;
 130:	80 91 00 02 	lds	r24, 0x0200
 134:	90 91 01 02 	lds	r25, 0x0201
 138:	82 17       	cp	r24, r18
 13a:	93 07       	cpc	r25, r19
 13c:	b8 f3       	brcs	.-18     	; 0x12c <cekej+0x1e>
		__asm__("sei");
	}
	__asm__("sei");
 13e:	78 94       	sei
}
 140:	08 95       	ret


Kedze instrukcia po sei sa zarucene vykona pred volanim prerusenia (vid AVR
Instruction Set Manual, DS40002198A-page 124) a vsade tam je cli okamzite
po sei, ISR sa nikdy nevykona.

JW


Další informace o konferenci Hw-list