Цитата(aaarrr @ Oct 20 2015, 16:25)

Можно все же увидеть листинг? Как-то уж очень чудесато это выглядит.
Целиком функция, в первом случае работает корректно (это с заплаткой в виде чтения), во втором - нет.
Код
\ In section .text, align 4, keep-with-next
127 void ForceReprogramming(bool Monopoly)
128 {
\ ForceReprogramming:
\ 00000000 0xE24DD004 SUB SP,SP,#+4
129 ForceReprogrammingSignature = FORCE_REPROGRAMMING_SIGNATURE;
\ 00000004 0xE3A01440 MOV R1,#+1073741824
\ 00000008 0xE3811C80 ORR R1,R1,#0x8000
\ 0000000C 0x........ LDR R2,??DataTable8_1 ;; 0x85d0b75
\ 00000010 0xE5812000 STR R2,[R1, #+0]
130 volatile unsigned long x = ForceReprogrammingSignature; // заплатка от непонятного бага с возвращением старого значения после сброса по WDT, см. http://electronix.ru/forum/index.php?showtopic=131171
\ 00000014 0xE5911000 LDR R1,[R1, #+0]
\ 00000018 0xE58D1000 STR R1,[SP, #+0]
131
132 if (Monopoly)
\ 0000001C 0xE3500000 CMP R0,#+0
\ 00000020 0x0A000002 BEQ ??ForceReprogramming_0
133 __disable_interrupt();
\ 00000024 0xE10F1000 MRS R1,CPSR
\ 00000028 0xE38110C0 ORR R1,R1,#0xC0
\ 0000002C 0xE121F001 MSR CPSR_c,R1
134
135 PCLKSEL0_bit.PCLK_WDT = 1;
\ ??ForceReprogramming_0:
\ 00000030 0x........ LDR R1,??DataTable8_2 ;; 0xe01fc1a8
\ 00000034 0xE5912000 LDR R2,[R1, #+0]
\ 00000038 0xE3C22003 BIC R2,R2,#0x3
\ 0000003C 0xE3822001 ORR R2,R2,#0x1
\ 00000040 0xE5812000 STR R2,[R1, #+0]
136 WDTC = CCLK / 4 * 5; // на 2 секунды
\ 00000044 0xE3A014E0 MOV R1,#-536870912
\ 00000048 0x........ LDR R2,??DataTable8_3 ;; 0x55d4a80
\ 0000004C 0xE5812004 STR R2,[R1, #+4]
137 WDMOD_bit.WDEN = 1;
\ 00000050 0xE5912000 LDR R2,[R1, #+0]
\ 00000054 0xE3822001 ORR R2,R2,#0x1
\ 00000058 0xE5812000 STR R2,[R1, #+0]
138 WDMOD_bit.WDRESET = 1;
\ 0000005C 0xE5912000 LDR R2,[R1, #+0]
\ 00000060 0xE3822002 ORR R2,R2,#0x2
\ 00000064 0xE5812000 STR R2,[R1, #+0]
139 WDCLKSEL_bit.WDSEL = 1;
\ 00000068 0xE5912010 LDR R2,[R1, #+16]
\ 0000006C 0xE3C22003 BIC R2,R2,#0x3
\ 00000070 0xE3822001 ORR R2,R2,#0x1
\ 00000074 0xE5812010 STR R2,[R1, #+16]
140 WDFEED = 0xAA;
\ 00000078 0xE3A020AA MOV R2,#+170
\ 0000007C 0xE5812008 STR R2,[R1, #+8]
141 WDFEED = 0x55;
\ 00000080 0xE3A02055 MOV R2,#+85
\ 00000084 0xE5812008 STR R2,[R1, #+8]
142
143 if (Monopoly)
\ 00000088 0xE3500000 CMP R0,#+0
\ 0000008C 0x0A000000 BEQ ??ForceReprogramming_1
144 while (1);
\ ??ForceReprogramming_2:
\ 00000090 0xEAFFFFFE B ??ForceReprogramming_2
145 }
\ ??ForceReprogramming_1:
\ 00000094 0xE28DD004 ADD SP,SP,#+4 ;; stack cleaning
\ 00000098 0xE12FFF1E BX LR ;; return
\ 0000009C REQUIRE ForceReprogrammingSignature
\ 0000009C REQUIRE _A_PCLKSEL0
\ 0000009C REQUIRE WDTC
\ 0000009C REQUIRE _A_WDMOD
\ 0000009C REQUIRE _A_WDCLKSEL
\ 0000009C REQUIRE _A_WDFEED
Код
\ In section .text, align 4, keep-with-next
127 void ForceReprogramming(bool Monopoly)
128 {
129 ForceReprogrammingSignature = FORCE_REPROGRAMMING_SIGNATURE;
\ ForceReprogramming:
\ 00000000 0xE3A01440 MOV R1,#+1073741824
\ 00000004 0xE3811C80 ORR R1,R1,#0x8000
\ 00000008 0x........ LDR R2,??DataTable8_1 ;; 0x85d0b75
\ 0000000C 0xE5812000 STR R2,[R1, #+0]
130 // volatile unsigned long x = ForceReprogrammingSignature; // заплатка от непонятного бага с возвращением старого значения после сброса по WDT, см. http://electronix.ru/forum/index.php?showtopic=131171
131
132 if (Monopoly)
\ 00000010 0xE3500000 CMP R0,#+0
\ 00000014 0x0A000002 BEQ ??ForceReprogramming_0
133 __disable_interrupt();
\ 00000018 0xE10F1000 MRS R1,CPSR
\ 0000001C 0xE38110C0 ORR R1,R1,#0xC0
\ 00000020 0xE121F001 MSR CPSR_c,R1
134
135 PCLKSEL0_bit.PCLK_WDT = 1;
\ ??ForceReprogramming_0:
\ 00000024 0x........ LDR R1,??DataTable8_2 ;; 0xe01fc1a8
\ 00000028 0xE5912000 LDR R2,[R1, #+0]
\ 0000002C 0xE3C22003 BIC R2,R2,#0x3
\ 00000030 0xE3822001 ORR R2,R2,#0x1
\ 00000034 0xE5812000 STR R2,[R1, #+0]
136 WDTC = CCLK / 4 * 5; // на 2 секунды
\ 00000038 0xE3A014E0 MOV R1,#-536870912
\ 0000003C 0x........ LDR R2,??DataTable8_3 ;; 0x55d4a80
\ 00000040 0xE5812004 STR R2,[R1, #+4]
137 WDMOD_bit.WDEN = 1;
\ 00000044 0xE5912000 LDR R2,[R1, #+0]
\ 00000048 0xE3822001 ORR R2,R2,#0x1
\ 0000004C 0xE5812000 STR R2,[R1, #+0]
138 WDMOD_bit.WDRESET = 1;
\ 00000050 0xE5912000 LDR R2,[R1, #+0]
\ 00000054 0xE3822002 ORR R2,R2,#0x2
\ 00000058 0xE5812000 STR R2,[R1, #+0]
139 WDCLKSEL_bit.WDSEL = 1;
\ 0000005C 0xE5912010 LDR R2,[R1, #+16]
\ 00000060 0xE3C22003 BIC R2,R2,#0x3
\ 00000064 0xE3822001 ORR R2,R2,#0x1
\ 00000068 0xE5812010 STR R2,[R1, #+16]
140 WDFEED = 0xAA;
\ 0000006C 0xE3A020AA MOV R2,#+170
\ 00000070 0xE5812008 STR R2,[R1, #+8]
141 WDFEED = 0x55;
\ 00000074 0xE3A02055 MOV R2,#+85
\ 00000078 0xE5812008 STR R2,[R1, #+8]
142
143 if (Monopoly)
\ 0000007C 0xE3500000 CMP R0,#+0
\ 00000080 0x0A000000 BEQ ??ForceReprogramming_1
144 while (1);
\ ??ForceReprogramming_2:
\ 00000084 0xEAFFFFFE B ??ForceReprogramming_2
145 }
\ ??ForceReprogramming_1:
\ 00000088 0xE12FFF1E BX LR ;; return
\ 0000008C REQUIRE ForceReprogrammingSignature
\ 0000008C REQUIRE _A_PCLKSEL0
\ 0000008C REQUIRE WDTC
\ 0000008C REQUIRE _A_WDMOD
\ 0000008C REQUIRE _A_WDCLKSEL
\ 0000008C REQUIRE _A_WDFEED