diff --git a/Compiler b/Compiler index 48bdd09..5717e0a 100644 Binary files a/Compiler and b/Compiler differ diff --git a/Compiler.exe b/Compiler.exe index 1a0e6f4..14d8afc 100644 Binary files a/Compiler.exe and b/Compiler.exe differ diff --git a/doc/STM32.txt b/doc/STM32.txt index 97045bb..54fcc9f 100644 --- a/doc/STM32.txt +++ b/doc/STM32.txt @@ -323,16 +323,16 @@ TYPE Обработка прерываний При возникновении прерывания, будет вызван пользовательский обработчик -(если он назначен). Обработчик получает смещение вектора прерывания в таблице +(если он назначен). Обработчик получает номер вектора прерывания в таблице векторов: -смещение вектор ----------------------- - 0H начальное значение SP - 4H сброс + 0 начальное значение SP + 1 сброс ... - 0ECH TIM6 - 0F0H TIM7 + 15 SysTick + ... + 59 TIM6 + 50 TIM7 ... По этому параметру обработчик должен определить источник прерывания и @@ -341,15 +341,15 @@ TYPE Пользовательский обработчик должен иметь вид: PROCEDURE handler (iv: INTEGER) - где iv - смещение вектора возникшего прерывания. + где iv - номер вектора возникшего прерывания. Например: PROCEDURE handler (iv: INTEGER); BEGIN - IF iv = 0ECH THEN + IF iv = 59 THEN (* TIM6 *) - ELSIF iv = 0F0H THEN + ELSIF iv = 60 THEN (* TIM7 *) ELSIF .... .... diff --git a/samples/STM32/Button.ob07 b/samples/STM32/Button.ob07 index 7640103..cb010e7 100644 --- a/samples/STM32/Button.ob07 +++ b/samples/STM32/Button.ob07 @@ -76,9 +76,9 @@ VAR (* обработчик прерываний *) -PROCEDURE handler (ivoffs: INTEGER); +PROCEDURE handler (iv: INTEGER); BEGIN - IF ivoffs = 058H THEN (* прерывание от EXTI0 *) + IF iv = 22 THEN (* прерывание от EXTI0 *) state := (state + 1) MOD 4; (* изменить состояние светодиодов *) CASE state OF diff --git a/samples/STM32/SysTick.ob07 b/samples/STM32/SysTick.ob07 index 7e9c613..3f8b392 100644 --- a/samples/STM32/SysTick.ob07 +++ b/samples/STM32/SysTick.ob07 @@ -53,9 +53,9 @@ VAR (* обработчик прерываний *) -PROCEDURE handler (ivoffs: INTEGER); +PROCEDURE handler (iv: INTEGER); BEGIN - IF ivoffs = 3CH THEN (* прерывание от System tick timer *) + IF iv = 15 THEN (* прерывание от System tick timer *) state := ~state; (* включить или выключить светодиоды *) SYSTEM.PUT(GPIOBBSRR, {Blue + 16 * ORD(state)}); diff --git a/samples/STM32/TIM67.ob07 b/samples/STM32/TIM67.ob07 index e61a1b6..62b2f4a 100644 --- a/samples/STM32/TIM67.ob07 +++ b/samples/STM32/TIM67.ob07 @@ -88,14 +88,14 @@ VAR (* обработчик прерываний *) -PROCEDURE handler (ivoffs: INTEGER); +PROCEDURE handler (iv: INTEGER); BEGIN - IF ivoffs = 0ECH THEN (* прерывание от TIM6 *) + IF iv = 59 THEN (* прерывание от TIM6 *) state1 := ~state1; (* включить или выключить синий светодиод *) SYSTEM.PUT(GPIOBBSRR, {BLUELED + 16 * ORD(state1)}); SYSTEM.PUT(TIM6_SR, 0) (* сбросить флаг прерывания *) - ELSIF ivoffs = 0F0H THEN (* прерывание от TIM7 *) + ELSIF iv = 60 THEN (* прерывание от TIM7 *) state2 := ~state2; (* включить или выключить зеленый светодиод *) SYSTEM.PUT(GPIOBBSRR, {GREENLED + 16 * ORD(state2)}); diff --git a/source/THUMB.ob07 b/source/THUMB.ob07 index 28a6b10..2638e26 100644 --- a/source/THUMB.ob07 +++ b/source/THUMB.ob07 @@ -93,7 +93,7 @@ VAR thumb2: BOOLEAN; - sdivProc, intProc: INTEGER; + sdivProc: INTEGER; PROCEDURE Code (code: INTEGER); @@ -2016,25 +2016,26 @@ BEGIN END translate; -PROCEDURE prolog (GlobSize, tcount, pic, FlashAdr, sp, ivt_len: INTEGER); +PROCEDURE prolog (GlobSize, tcount, pic, FlashAdr, sp, ivt_len, sram: INTEGER); VAR - r1, r2, i, dcount, entry, L1: INTEGER; - IV: ARRAY 256 OF INTEGER; + r1, r2, i, dcount, entry, L1, reset: INTEGER; BEGIN - IV[0] := sp; - IV[1] := FlashAdr + ivt_len * 4 + 1; + reset := FlashAdr + ivt_len * 4 + 1; + + Code(low(sp)); + Code(high(sp)); + + Code(low(reset)); + Code(high(reset)); + + INC(reset, 4); FOR i := 2 TO ivt_len - 1 DO - IV[i] := IV[1] + 4 + 4*2 * (i - 2) + Code(low(reset)); + Code(high(reset)) END; - FOR i := 0 TO ivt_len - 1 DO - Code(low(IV[i])); - Code(high(IV[i])) - END; - - intProc := NewLabel(); sdivProc := NewLabel(); IL.set_rtl(IL._divmod, sdivProc); @@ -2043,11 +2044,13 @@ BEGIN Label(entry); call(L1); - FOR i := 2 TO ivt_len - 1 DO - MovImm8(R1, i); - gen14(FALSE, TRUE, {}); (* push {LR} *) - call(intProc) - END; + gen14(FALSE, TRUE, {}); (* push {LR} *) + MovConst(R0, sram); + Ldr32(R0, R0); + Code(0F3EFH); Code(08105H); (* mrs r1, ipsr *) + push(R1); + gen5(3, TRUE, FALSE, R0, 0); (* blx R0 *) + gen14(TRUE, TRUE, {R1}); (* pop {PC, R1} *) Label(L1); r1 := GetAnyReg(); @@ -2071,7 +2074,7 @@ BEGIN drop; r1 := GetAnyReg(); - MovConst(r1, IV[0]); + MovConst(r1, sp); mov(SP, r1); reloc(r1, BIN.RDATA + pic, 0); push(r1); @@ -2089,19 +2092,11 @@ BEGIN END prolog; -PROCEDURE epilog (sram: INTEGER); +PROCEDURE epilog; BEGIN Code(0BF30H); (* L2: wfi *) Code(0E7FDH); (* b L2 *) - Label(intProc); - MovConst(R0, sram); - Ldr32(R0, R0); - LslImm(R1, 2); - push(R1); - gen5(3, TRUE, FALSE, R0, 0); (* blx R0 *) - gen14(TRUE, TRUE, {R1}); (* pop {PC, R1} *) - Label(sdivProc); Code(09800H); (* ldr r0, [sp + #0] *) Code(09901H); (* ldr r1, [sp + #4] *) @@ -2166,9 +2161,9 @@ BEGIN BssSize := IL.codes.bss; ASSERT(UTILS.Align(BssSize, 4)); - prolog(BssSize, tcount, ORD(opt.pic), FlashAdr, SRAMAdr + ram, IVTLen); + prolog(BssSize, tcount, ORD(opt.pic), FlashAdr, SRAMAdr + ram, IVTLen, SRAMAdr); translate(ORD(opt.pic), tcount * 4); - epilog(SRAMAdr); + epilog; fixup(FlashAdr, DataAdr, BssAdr);