Одно только в этом коде выглядит подозрительным
Код
// 1737 {
// 1738 //определение амплитуды первого сегмента
// 1739 a = wbCalcDA(wv->ind_new, wv->ind_new, minus, wseg);
MOV R0,R10
MOV R2,R0
MOV R8,#+0
B ??wbWaveBuilder_15
...
??wbWaveBuilder_16:
ADD R3,R5,R2, LSL #+3
LDRSH R3,[R7, +R3]
ADD R8,R3,R8
MOV R8,R8, LSL #+16
MOV R8,R8, ASR #+16
ADD R2,R2,#+1
AND R2,R2,#0xFF
??wbWaveBuilder_15:
CMP R10,R2
BCS ??wbWaveBuilder_16
CMP R6,#+0
RSBNE R8,R8,#+0
MOVNE R8,R8, LSL #+16
MOVNE R8,R8, ASR #+16
При входе в цикл регистры R2 и R10 будут изначально равны и цикл по сути не выполнится ни разу. Видимо из-за первых двух одинаковых параметров на вызове
a = wbCalcDA(wv->ind_new, wv->ind_new, minus, wseg);
Если же есть явное подозрение на порчу R8, то это ещё может быть из-за неправильного сохранения/восстановления регистров в прерывании. Например прерывание обрабатывается в IRQ режиме, а обработчик оформлен с помощью __fiq атрибута. И ещё прикольный баг может быть - если вложенное прерывание некорректно восстанавливает флаги (SPSR->CPSR), например из-за проблем со стеком.
Сообщение отредактировал GetSmart - Nov 23 2009, 15:29