Код
__arm __irq __nested void Interrupt()
{
.....
}
{
.....
}
при этом код, генеримый IAR 4.20:
Код
\ 00000000 04E04EE2 SUB LR,LR,#+0x4
\ 00000004 00402DE9 STMDB SP!,{LR}
\ 00000008 00E04FE1 MRS LR,SPSR
\ 0000000C 00502DE9 STMDB SP!,{R12,LR}
\ 00000010 00E00FE1 MRS LR,CPSR
\ 00000014 1FE08EE3 ORR LR,LR,#+0x1F
\ 00000018 0EF029E1 MSR CPSR,LR
\ 0000001C FF012DE9 STMDB SP!,{R0-R8} ;; Push
...............
\ 00000134 FF01BDE8 LDMIA SP!,{R0-R8} ;; Pop
\ 00000068 00C00FE1 MRS R12,CPSR
\ 0000006C 92C08CE3 ORR R12,R12,#+0x92
\ 00000070 0DC0CCE3 BIC R12,R12,#+0xD
\ 00000074 0CF029E1 MSR CPSR,R12
\ 00000078 0050BDE8 LDMIA SP!,{R12,LR}
\ 0000007C 0EF069E1 MSR SPSR,LR
\ 00000080 0080FDE8 LDMIA SP!,{PC}^ ;; return
\ 00000004 00402DE9 STMDB SP!,{LR}
\ 00000008 00E04FE1 MRS LR,SPSR
\ 0000000C 00502DE9 STMDB SP!,{R12,LR}
\ 00000010 00E00FE1 MRS LR,CPSR
\ 00000014 1FE08EE3 ORR LR,LR,#+0x1F
\ 00000018 0EF029E1 MSR CPSR,LR
\ 0000001C FF012DE9 STMDB SP!,{R0-R8} ;; Push
...............
\ 00000134 FF01BDE8 LDMIA SP!,{R0-R8} ;; Pop
\ 00000068 00C00FE1 MRS R12,CPSR
\ 0000006C 92C08CE3 ORR R12,R12,#+0x92
\ 00000070 0DC0CCE3 BIC R12,R12,#+0xD
\ 00000074 0CF029E1 MSR CPSR,R12
\ 00000078 0050BDE8 LDMIA SP!,{R12,LR}
\ 0000007C 0EF069E1 MSR SPSR,LR
\ 00000080 0080FDE8 LDMIA SP!,{PC}^ ;; return
теперь код, генеримый IAR 4.30:
Код
\ 00000000 04E04EE2 SUB LR,LR,#+0x4
\ 00000004 04E02DE5 STR LR,[SP, #-4]!
\ 00000008 00E04FE1 MRS LR,SPSR
\ 0000000C 00502DE9 STMDB SP!,{R12,LR}
\ 00000010 00E00FE1 MRS LR,CPSR
\ 00000014 1FE08EE3 ORR LR,LR,#+0x1F
\ 00000018 0EF029E1 MSR CPSR,LR
\ 0000001C FF012DE9 STMDB SP!,{R0-R8} ;; Push
...............
\ 00000144 FF01BDE8 LDMIA SP!,{R0-R8} ;; Pop
\ 00000068 00C00FE1 MRS R12,CPSR
\ 0000006C 92C08CE3 ORR R12,R12,#+0x92
\ 00000070 0DC0CCE3 BIC R12,R12,#+0xD
\ 00000074 0CF029E1 MSR CPSR,R12
\ 00000078 0050BDE8 LDMIA SP!,{R12,LR}
\ 0000007C 0EF069E1 MSR SPSR,LR
\ 00000080 ........ LDR PC,[SP], #+0x4;; return
--следующая строчка взята из прошивки, т.к. в листинге почему-то пропущен код последней операции
\ 00000080 E49DF004 LDR PC, [SP], #+4
\ 00000004 04E02DE5 STR LR,[SP, #-4]!
\ 00000008 00E04FE1 MRS LR,SPSR
\ 0000000C 00502DE9 STMDB SP!,{R12,LR}
\ 00000010 00E00FE1 MRS LR,CPSR
\ 00000014 1FE08EE3 ORR LR,LR,#+0x1F
\ 00000018 0EF029E1 MSR CPSR,LR
\ 0000001C FF012DE9 STMDB SP!,{R0-R8} ;; Push
...............
\ 00000144 FF01BDE8 LDMIA SP!,{R0-R8} ;; Pop
\ 00000068 00C00FE1 MRS R12,CPSR
\ 0000006C 92C08CE3 ORR R12,R12,#+0x92
\ 00000070 0DC0CCE3 BIC R12,R12,#+0xD
\ 00000074 0CF029E1 MSR CPSR,R12
\ 00000078 0050BDE8 LDMIA SP!,{R12,LR}
\ 0000007C 0EF069E1 MSR SPSR,LR
\ 00000080 ........ LDR PC,[SP], #+0x4;; return
--следующая строчка взята из прошивки, т.к. в листинге почему-то пропущен код последней операции
\ 00000080 E49DF004 LDR PC, [SP], #+4
теперь код, генеримый IAR 4.42:
Код
\ 00000000 04E04EE2 SUB LR,LR,#+4
\ 00000004 04E02DE5 STR LR,[SP, #-4]!
\ 00000008 00E04FE1 MRS LR,SPSR
\ 0000000C 00502DE9 STMDB SP!,{R12,LR}
\ 00000010 00E00FE1 MRS LR,CPSR
\ 00000014 1FE08EE3 ORR LR,LR,#0x1F
\ 00000018 0EF029E1 MSR CPSR,LR
\ 0000001C FF012DE9 PUSH {R0-R8}
...............
\ 00000144 FF01BDE8 POP {R0-R8}
\ 00000148 00C00FE1 MRS R12,CPSR
\ 0000014C 92C08CE3 ORR R12,R12,#0x92
\ 00000150 0DC0CCE3 BIC R12,R12,#0xD
\ 00000154 0CF029E1 MSR SPSR,R12
\ 00000158 0050BDE8 LDM SP!,{R12,LR}
\ 0000015C 0EF069E1 MSR SPSR,LR
\ 00000160 0080FDE8 LDM SP!,{PC}^ ;; return
\ 00000004 04E02DE5 STR LR,[SP, #-4]!
\ 00000008 00E04FE1 MRS LR,SPSR
\ 0000000C 00502DE9 STMDB SP!,{R12,LR}
\ 00000010 00E00FE1 MRS LR,CPSR
\ 00000014 1FE08EE3 ORR LR,LR,#0x1F
\ 00000018 0EF029E1 MSR CPSR,LR
\ 0000001C FF012DE9 PUSH {R0-R8}
...............
\ 00000144 FF01BDE8 POP {R0-R8}
\ 00000148 00C00FE1 MRS R12,CPSR
\ 0000014C 92C08CE3 ORR R12,R12,#0x92
\ 00000150 0DC0CCE3 BIC R12,R12,#0xD
\ 00000154 0CF029E1 MSR SPSR,R12
\ 00000158 0050BDE8 LDM SP!,{R12,LR}
\ 0000015C 0EF069E1 MSR SPSR,LR
\ 00000160 0080FDE8 LDM SP!,{PC}^ ;; return
Обратите внимание на последнюю команду от IAR 4.30. По сути нет выхода из прерывания (аппаратного копирования SPSR в CPSR) и проц продолжает работать в режиме прерывания.
Глюк ну очень похожий на описанный в этой теме
http://electronix.ru/forum/index.php?showt...mp;#entry650548
разные разработчики компилеров, но грабли у них стандартные. Каждый уважающий себя разработчик компилеров обязан встать на стандартные грабли

Предлагаю создать тему о багах IARa в шапке "Кросплатформенный компилятор IAR" и постить там только ссылки на другие темы, с конкретным описанием бага и версии IARа. Если кто поддерживает - отпишитесь.