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