Чтобы воспроизвести, нужно запустить какой нибудь таймер с
прерываниями почаще и REPEAT взять не самый короткий (20...30) и
после цикла проверить следующий за массивом адрес. Ставим там бряк
и зацикливаем все вместе. При удачной интерференции или подобранном
периоде таймера ошибка возникает практически мгновенно. Тестовый
код:
;========================= .include "p24FJ256GA702.inc" ;========================= config __FSEC,BSEN_OFF & GSS_DISABLED & GWRP_OFF & CSS_DISABLED config __FOSCSEL,IESO_ON & FNOSC_PRIPLL & PLLMODE_PLL4X config __FOSC,POSCMD_XT & SOSCSEL_OFF config __FWDT,FWDTEN_ON_SWDTEN & WINDIS_OFF & WDTCMX_LPRC & FWPSA_PR128 & WDTPS_PS32768 config __FPOR,BOREN_ON config __FICD,JTAGEN_OFF & ICS_PGD1 config __FDEVOPT1, ALTI2C1_ALTI2CDIS ;========================= .global __reset .global __T2Interrupt ;========================= .section buf1,near,bss array: .space 128 test: .space 2 ;========================= .text __reset: mov #__SP_init, W15 mov #__SPLIM_init, W0 mov W0, SPLIM nop ;========================= ; clear [array] & test mov #array, W0 repeat #63 clr [W0++] clr test ;========================= ; init TMR2 & interrupt from TMR2 enable clr TMR2 clr T2CON mov #120, W0 mov W0, PR2 bclr IFS0, #T2IF bset IEC0, #T2IE bset T2CON, #TON ;========================= Loop: mov #array, W1 repeat #63 inc [W1], [W1++] nop cp0 test bra Z, Loop nop nop bra $ ; error (test corrupt) trap ;========================= __T2Interrupt: push.s bclr IFS0, #T2IF nop pop.s retfie ;---------------------------------------------- ; if interrupt disable, no error... .end