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