Цитата(jcxz @ Aug 20 2012, 18:39)

Где заведомо? Вы что-то путаете

А Вы видите if (i < 2) немного выше и c = shiftMs; ?
Да, действительно, case 0 я и не приметил.
Цитата(jcxz @ Aug 20 2012, 18:39)

А насчёт жуткости - Вы видимо не видели по настоящему жутких исходников

Надеюсь, больше никогда и не увижу :-)
Цитата(jcxz @ Aug 20 2012, 18:39)

Ближе к телу: Вы пробовали скомпилить это на Вашем компиляторе?
Нет сил анализировать этот шедевр, так что наличие бага не могу ни подтвердить, ни опровергнуть.
Если что, вот что нагенерил компилятор у меня:
CODE
1 #define WATCH_BASE_CLK 1000000 //[Hz] дискретность nTIM_watch
2 #define T_ADJ 16 //разрядность фильтра джиттера ISR RTC
3 typedef signed char s8;
4 typedef signed short s16;
5 typedef signed int s32;
6 typedef signed long long s64;
7 typedef unsigned char u8;
8 typedef unsigned short u16;
9 typedef unsigned int u32;
10 typedef unsigned long long u64;
11 enum {
12 SHIFT_STATE_INIT, SHIFT_STATE_IDLE, SHIFT_STATE_REQ, SHIFT_STATE_ACT,
13 SHIFT_STATE_REPORT, SHIFT_STATE_SYNC};
14 u32 volatile shadowRTC;
15 u32 shiftPoint, pointTIM;
16 u16 adjTim;
17 u8 stateTIM = 0;
18 u8 shiftState;
19 s8 shiftSec;
20 s32 shiftMs;
21 typedef struct {
22 u32 IR;
23 u32 TCR;
24 u32 TC;
25 u32 PR;
26 u32 PC;
27 u32 MCR;
28 u32 MR[4];
29 u32 CCR;
30 u32 CR[2];
31 u32 unuse0[2];
32 u32 EMR;
33 u32 unuse1[12];
34 u32 CTCR;
35 } HwRegsTIMER;
36 __no_init extern volatile HwRegsTIMER TIMER_0 @ ".HwRegsTIMER0";
37
\ In section .text, align 2, keep-with-next
38 u32 GetMcsTimer() { return TIMER_0.TC; }
\ _Z11GetMcsTimerv:
\ 00000000 0x.... LDR.N R0,??DataTable1
\ 00000002 0x6880 LDR R0,[R0, #+8]
\ 00000004 0x4770 BX LR ;; return
39
\ In section .text, align 4, keep-with-next
40 extern "C" void TBug()
41 {
\ TBug:
\ 00000000 0xB4F0 PUSH {R4-R7}
42 static s8 secAdd;
43 u32 i, j = GetMcsTimer();
\ 00000002 0x.... LDR.N R1,??DataTable1
\ 00000004 0x688B LDR R3,[R1, #+8]
44 s32 c, cc;
45 volatile HwRegsTIMER *p = &TIMER_0;
46 p->IR = 2;
\ 00000006 0x2002 MOVS R0,#+2
\ 00000008 0x6008 STR R0,[R1, #+0]
47 switch (i = stateTIM) {
\ 0000000A 0x.... LDR.N R0,??DataTable1_1
\ 0000000C 0x7804 LDRB R4,[R0, #+0]
\ 0000000E 0x2C0C CMP R4,#+12
\ 00000010 0xD854 BHI.N ??TBug_1
\ 00000012 0xE8DF 0xF004 TBB [PC, R4]
\ ??TBug_0:
\ 00000016 0x20 0x2F DC8 0x20,0x2F,0x9,0x16
\ 0x09 0x16
\ 0000001A 0x53 0x53 DC8 0x53,0x53,0x53,0x53
\ 0x53 0x53
\ 0000001E 0x53 0x53 DC8 0x53,0x53,0x9,0x14
\ 0x09 0x14
\ 00000022 0x07 0x00 DC8 0x7,0x0
48 case 12: stateTIM = 11; return;
\ ??TBug_2:
\ 00000024 0x210B MOVS R1,#+11
\ 00000026 0xE007 B.N ??TBug_3
49 case 10:
50 case 2:
51 if ((c = p->MR[1] - WATCH_BASE_CLK / 2) < 0) c += WATCH_BASE_CLK;
\ ??TBug_4:
\ 00000028 0x69CA LDR R2,[R1, #+28]
\ 0000002A 0x.... LDR.N R3,??DataTable1_2 ;; 0xfff85ee0
\ 0000002C 0x189A ADDS R2,R3,R2
\ 0000002E 0xBF44 ITT MI
\ 00000030 0x.... LDRMI.N R3,??DataTable1_3 ;; 0xf4240
\ 00000032 0x189A ADDMI R2,R3,R2
52 p->MR[1] = c;
\ 00000034 0x61CA STR R2,[R1, #+28]
53 stateTIM = i + 1;
\ 00000036 0x1C61 ADDS R1,R4,#+1
\ ??TBug_3:
\ 00000038 0x7001 STRB R1,[R0, #+0]
54 return;
\ 0000003A 0xBCF0 POP {R4-R7}
\ 0000003C 0x4770 BX LR
55 case 11:
56 shiftState = SHIFT_STATE_REPORT;
\ ??TBug_5:
\ 0000003E 0x2604 MOVS R6,#+4
\ 00000040 0x7046 STRB R6,[R0, #+1]
57 // PingWatch();
58 case 3:
59 shadowRTC += secAdd;
\ ??TBug_6:
\ 00000042 0x6886 LDR R6,[R0, #+8]
\ 00000044 0xF990 0x7002 LDRSB R7,[R0, #+2]
\ 00000048 0x19BE ADDS R6,R7,R6
\ 0000004A 0x6086 STR R6,[R0, #+8]
60 if (stateTIM = i >>= 3) break;
\ 0000004C 0x08E4 LSRS R4,R4,#+3
\ 0000004E 0x7004 STRB R4,[R0, #+0]
\ 00000050 0x7806 LDRB R6,[R0, #+0]
\ 00000052 0x2E00 CMP R6,#+0
\ 00000054 0xD132 BNE.N ??TBug_1
61 case 0:
62 if (shiftPoint == shadowRTC + 1 && shiftState == SHIFT_STATE_REQ) {
\ ??TBug_7:
\ 00000056 0x68C6 LDR R6,[R0, #+12]
\ 00000058 0x6887 LDR R7,[R0, #+8]
\ 0000005A 0x1C7F ADDS R7,R7,#+1
\ 0000005C 0x42BE CMP R6,R7
\ 0000005E 0xBF04 ITT EQ
\ 00000060 0x7846 LDRBEQ R6,[R0, #+1]
\ 00000062 0x2E02 CMPEQ R6,#+2
\ 00000064 0xD106 BNE.N ??TBug_8
63 shiftState = SHIFT_STATE_ACT;
\ 00000066 0x2203 MOVS R2,#+3
\ 00000068 0x7042 STRB R2,[R0, #+1]
64 c = shiftMs;
\ 0000006A 0x6942 LDR R2,[R0, #+20]
65 cc = shiftSec;
\ 0000006C 0xF990 0x5006 LDRSB R5,[R0, #+6]
66 i = 10;
\ 00000070 0x240A MOVS R4,#+10
\ 00000072 0xE009 B.N ??TBug_9
67 }
68 case 1:
69 if (i < 2) {
\ ??TBug_8:
\ 00000074 0x2C02 CMP R4,#+2
\ 00000076 0xD207 BCS.N ??TBug_9
70 stateTIM = 0;
\ 00000078 0x2200 MOVS R2,#+0
\ 0000007A 0x7002 STRB R2,[R0, #+0]
71 if (adjTim & (1 << T_ADJ - 1) - 1) {
\ 0000007C 0x8882 LDRH R2,[R0, #+4]
\ 0000007E 0x0454 LSLS R4,R2,#+17
\ 00000080 0xD01C BEQ.N ??TBug_1
72 c = adjTim;
73 adjTim = cc = 0;
\ 00000082 0x2500 MOVS R5,#+0
\ 00000084 0x8085 STRH R5,[R0, #+4]
74 i = 2;
\ 00000086 0x2402 MOVS R4,#+2
75 } else break;
76 }
77 secAdd = cc;
\ ??TBug_9:
\ 00000088 0x7085 STRB R5,[R0, #+2]
78 if ((u32)c < WATCH_BASE_CLK / 10) {
\ 0000008A 0x.... LDR.N R5,??DataTable1_4 ;; 0x186a0
\ 0000008C 0x42AA CMP R2,R5
\ 0000008E 0xD208 BCS.N ??TBug_10
79 if ((c += p->MR[1] - WATCH_BASE_CLK / 2) < 0) c += WATCH_BASE_CLK;
\ 00000090 0x69CD LDR R5,[R1, #+28]
\ 00000092 0x18AA ADDS R2,R5,R2
\ 00000094 0x.... LDR.N R5,??DataTable1_2 ;; 0xfff85ee0
\ 00000096 0x18AA ADDS R2,R5,R2
\ 00000098 0xBF44 ITT MI
\ 0000009A 0x.... LDRMI.N R5,??DataTable1_3 ;; 0xf4240
\ 0000009C 0x18AA ADDMI R2,R5,R2
80 p->MR[1] = c;
\ 0000009E 0x61CA STR R2,[R1, #+28]
\ 000000A0 0xE00B B.N ??TBug_11
81 } else {
82 if (c >= 0) i += 1;
\ ??TBug_10:
\ 000000A2 0x1C64 ADDS R4,R4,#+1
83 if ((c += p->MR[1]) < 0) c += WATCH_BASE_CLK;
\ 000000A4 0x69CD LDR R5,[R1, #+28]
\ 000000A6 0x18AA ADDS R2,R5,R2
\ 000000A8 0x.... LDR.N R5,??DataTable1_3 ;; 0xf4240
\ 000000AA 0xBF48 IT MI
\ 000000AC 0x18AA ADDMI R2,R5,R2
84 if (c >= WATCH_BASE_CLK) c -= WATCH_BASE_CLK;
\ 000000AE 0x42AA CMP R2,R5
\ 000000B0 0xBFA4 ITT GE
\ 000000B2 0x.... LDRGE.N R5,??DataTable1_5 ;; 0xfff0bdc0
\ 000000B4 0x18AA ADDGE R2,R5,R2
85 p->MR[1] = c;
\ 000000B6 0x61CA STR R2,[R1, #+28]
86 i += 1;
\ 000000B8 0x1C64 ADDS R4,R4,#+1
87 }
88 stateTIM = i;
\ ??TBug_11:
\ 000000BA 0x7004 STRB R4,[R0, #+0]
89 }
90 pointTIM = j;
\ ??TBug_1:
\ 000000BC 0x6103 STR R3,[R0, #+16]
91 shadowRTC++;
\ 000000BE 0x6881 LDR R1,[R0, #+8]
\ 000000C0 0x1C49 ADDS R1,R1,#+1
\ 000000C2 0x6081 STR R1,[R0, #+8]
92 /// PostEventRTC();
93 }
\ 000000C4 0xBCF0 POP {R4-R7}
\ 000000C6 0x4770 BX LR ;; return
\ In section .bss, align 4
\ stateTIM:
\ 00000000 DS8 1
\ shiftState:
\ 00000001 DS8 1
\ 00000002 DS8 1
\ 00000003 DS8 1
\ adjTim:
\ 00000004 DS8 2
\ shiftSec:
\ 00000006 DS8 1
\ 00000007 DS8 1
\ shadowRTC:
\ 00000008 DS8 4
\ shiftPoint:
\ 0000000C DS8 4
\ pointTIM:
\ 00000010 DS8 4
\ shiftMs:
\ 00000014 DS8 4
94
\ In section .text, align 2, keep-with-next
95 int main() {}
\ main:
\ 00000000 0x2000 MOVS R0,#+0
\ 00000002 0x4770 BX LR ;; return
\ In section .text, align 4, keep-with-next
\ ??DataTable1:
\ 00000000 0x........ DC32 TIMER_0
\ In section .text, align 4, keep-with-next
\ ??DataTable1_1:
\ 00000000 0x........ DC32 stateTIM
\ In section .text, align 4, keep-with-next
\ ??DataTable1_2:
\ 00000000 0xFFF85EE0 DC32 0xfff85ee0
\ In section .text, align 4, keep-with-next
\ ??DataTable1_3:
\ 00000000 0x000F4240 DC32 0xf4240
\ In section .text, align 4, keep-with-next
\ ??DataTable1_4:
\ 00000000 0x000186A0 DC32 0x186a0
\ In section .text, align 4, keep-with-next
\ ??DataTable1_5:
\ 00000000 0xFFF0BDC0 DC32 0xfff0bdc0