Вот маленькая функция m_getchar и код, скомпиленный IAR'ом.
Если прога попадает внутрь цикла, то из него уже не выходит, т. к. не проверяется условие key_cod == 0xFF 8(
В ассемблерном коде видно, что при попадании на строчку 0000022C, прога крутится в пределах 0000022C - 00000238 и не делает никаких проверок.
Это глюки компилятора или мои?
Код
//-----------------------------------------------------------------
char m_getchar(void)
//-----------------------------------------------------------------
{
char key;
while(key_cod == 0xFF)
{
AT91C_BASE_WDTC -> WDTC_WDCR = 0xA5000001;
AT91C_BASE_PMC -> PMC_SCDR = AT91C_PMC_PCK;
}
key = key_cod;
key_cod = 0xFF;
return key;
}
Код
Next label is a Thumb label
m_getchar:
00000224 4907 LDR R1, [PC,#0x01C] ; [0x244] =v_buf (0x1388)
00000226 7F08 LDRB R0, [R1, #28]
while(key_cod == 0xFF)
00000228 28FF CMP R0, #255
0000022A D106 BNE 0x00023A
AT91C_BASE_WDTC -> WDTC_WDCR = 0xA5000001;
0000022C 4806 LDR R0, [PC,#0x018] ; [0x248] =WDTC_WDCR (0xFFFFFD40)
0000022E 4907 LDR R1, [PC,#0x01C] ; [0x24C] =0xA5000001
00000230 6001 STR R1, [R0, #0]
AT91C_BASE_PMC->PMC_SCDR = AT91C_PMC_PCK;
00000232 4807 LDR R0, [PC,#0x01C] ; [0x250] =PMC_SCDR (0xFFFFFC04)
00000234 2101 MOV R1, #1
00000236 6001 STR R1, [R0, #0]
00000238 E7F8 B 0x00022C
key_cod = 0xFF;
0000023A 22FF MOV R2, #255
0000023C 770A STRB R2, [R1, #28]
return key;
0000023E B000 ADD SP, SP, #0
00000240 4770 BX LR
00000242 0000 LSL R0, R0, #0