Skip to content

Commit ce9bdaf

Browse files
authored
Minimal interrupt improvements (#8)
1 parent 14ab71d commit ce9bdaf

File tree

5 files changed

+331
-101
lines changed

5 files changed

+331
-101
lines changed

minimal_interrupt/gcc_arm.ld

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,3 +327,97 @@ SECTIONS
327327
/* Check if data + heap + stack exceeds RAM limit */
328328
ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
329329
}
330+
331+
/* Exceptions */
332+
PROVIDE(NMI = DefaultExceptionHandler);
333+
PROVIDE(HardFault = DefaultExceptionHandler);
334+
PROVIDE(MemManage = DefaultExceptionHandler);
335+
PROVIDE(BusFault = DefaultExceptionHandler);
336+
PROVIDE(UsageFault = DefaultExceptionHandler);
337+
PROVIDE(SVCall = DefaultExceptionHandler);
338+
PROVIDE(PendSV = DefaultExceptionHandler);
339+
PROVIDE(SysTick = DefaultExceptionHandler);
340+
341+
/* Interrupts */
342+
PROVIDE(WWDG_Interrupt_Handler = DefaultExceptionHandler);
343+
PROVIDE(PVD_PVM_Interrupt_Handler = DefaultExceptionHandler);
344+
PROVIDE(RTC_TAMP_STAMP_Interrupt_Handler = DefaultExceptionHandler);
345+
PROVIDE(RTC_WKUP_Interrupt_Handler = DefaultExceptionHandler);
346+
PROVIDE(FLASH_Interrupt_Handler = DefaultExceptionHandler);
347+
PROVIDE(RCC_Interrupt_Handler = DefaultExceptionHandler);
348+
PROVIDE(EXTI0_Interrupt_Handler = DefaultExceptionHandler);
349+
PROVIDE(EXTI1_Interrupt_Handler = DefaultExceptionHandler);
350+
PROVIDE(EXTI2_Interrupt_Handler = DefaultExceptionHandler);
351+
PROVIDE(EXTI3_Interrupt_Handler = DefaultExceptionHandler);
352+
PROVIDE(EXTI4_Interrupt_Handler = DefaultExceptionHandler);
353+
PROVIDE(DMA1_CH1_Interrupt_Handler = DefaultExceptionHandler);
354+
PROVIDE(DMA1_CH2_Interrupt_Handler = DefaultExceptionHandler);
355+
PROVIDE(DMA1_CH3_Interrupt_Handler = DefaultExceptionHandler);
356+
PROVIDE(DMA1_CH4_Interrupt_Handler = DefaultExceptionHandler);
357+
PROVIDE(DMA1_CH5_Interrupt_Handler = DefaultExceptionHandler);
358+
PROVIDE(DMA1_CH6_Interrupt_Handler = DefaultExceptionHandler);
359+
PROVIDE(DMA1_CH7_Interrupt_Handler = DefaultExceptionHandler);
360+
PROVIDE(ADC1_2_Interrupt_Handler = DefaultExceptionHandler);
361+
PROVIDE(CAN1_TX_Interrupt_Handler = DefaultExceptionHandler);
362+
PROVIDE(CAN1_RX0_Interrupt_Handler = DefaultExceptionHandler);
363+
PROVIDE(CAN1_RX1_Interrupt_Handler = DefaultExceptionHandler);
364+
PROVIDE(CAN1_SCE_Interrupt_Handler = DefaultExceptionHandler);
365+
PROVIDE(EXTI9_5_Interrupt_Handler = DefaultExceptionHandler);
366+
PROVIDE(TIM1_BRK_Interrupt_Handler = DefaultExceptionHandler);
367+
PROVIDE(TIM1_UP_Interrupt_Handler = DefaultExceptionHandler);
368+
PROVIDE(TIM1_TRG_COM_Interrupt_Handler = DefaultExceptionHandler);
369+
PROVIDE(TIM1_CC_Interrupt_Handler = DefaultExceptionHandler);
370+
PROVIDE(TIM2_Interrupt_Handler = DefaultExceptionHandler);
371+
PROVIDE(TIM3_Interrupt_Handler = DefaultExceptionHandler);
372+
PROVIDE(TIM4_Interrupt_Handler = DefaultExceptionHandler);
373+
PROVIDE(I2C1_EV_Interrupt_Handler = DefaultExceptionHandler);
374+
PROVIDE(I2C1_ER_Interrupt_Handler = DefaultExceptionHandler);
375+
PROVIDE(I2C2_EV_Interrupt_Handler = DefaultExceptionHandler);
376+
PROVIDE(I2C2_ER_Interrupt_Handler = DefaultExceptionHandler);
377+
PROVIDE(SPI1_Interrupt_Handler = DefaultExceptionHandler);
378+
PROVIDE(SPI2_Interrupt_Handler = DefaultExceptionHandler);
379+
PROVIDE(USART1_Interrupt_Handler = DefaultExceptionHandler);
380+
PROVIDE(USART2_Interrupt_Handler = DefaultExceptionHandler);
381+
PROVIDE(USART3_Interrupt_Handler = DefaultExceptionHandler);
382+
PROVIDE(EXTI15_10_Interrupt_Handler = DefaultExceptionHandler);
383+
PROVIDE(RTC_ALARM_Interrupt_Handler = DefaultExceptionHandler);
384+
PROVIDE(DFSDM1_FLT3_Interrupt_Handler = DefaultExceptionHandler);
385+
PROVIDE(TIM8_BRK_Interrupt_Handler = DefaultExceptionHandler);
386+
PROVIDE(TIM8_UP_Interrupt_Handler = DefaultExceptionHandler);
387+
PROVIDE(TIM8_TRG_COM_Interrupt_Handler = DefaultExceptionHandler);
388+
PROVIDE(TIM8_CC_Interrupt_Handler = DefaultExceptionHandler);
389+
PROVIDE(ADC3_Interrupt_Handler = DefaultExceptionHandler);
390+
PROVIDE(FMC_Interrupt_Handler = DefaultExceptionHandler);
391+
PROVIDE(SDMMC1_Interrupt_Handler = DefaultExceptionHandler);
392+
PROVIDE(TIM5_Interrupt_Handler = DefaultExceptionHandler);
393+
PROVIDE(SPI3_Interrupt_Handler = DefaultExceptionHandler);
394+
PROVIDE(UART4_Interrupt_Handler = DefaultExceptionHandler);
395+
PROVIDE(UART5_Interrupt_Handler = DefaultExceptionHandler);
396+
PROVIDE(TIM6_DAC_Interrupt_Handler = DefaultExceptionHandler);
397+
PROVIDE(TIM7_Interrupt_Handler = DefaultExceptionHandler);
398+
PROVIDE(DMA2_CH1_Interrupt_Handler = DefaultExceptionHandler);
399+
PROVIDE(DMA2_CH2_Interrupt_Handler = DefaultExceptionHandler);
400+
PROVIDE(DMA2_CH3_Interrupt_Handler = DefaultExceptionHandler);
401+
PROVIDE(DMA2_CH4_Interrupt_Handler = DefaultExceptionHandler);
402+
PROVIDE(DMA2_CH5_Interrupt_Handler = DefaultExceptionHandler);
403+
PROVIDE(DFSDM1_FLT0_Interrupt_Handler = DefaultExceptionHandler);
404+
PROVIDE(DFSDM1_FLT1_Interrupt_Handler = DefaultExceptionHandler);
405+
PROVIDE(DFSDM1_FLT2_Interrupt_Handler = DefaultExceptionHandler);
406+
PROVIDE(COMP_Interrupt_Handler = DefaultExceptionHandler);
407+
PROVIDE(LPTIM1_Interrupt_Handler = DefaultExceptionHandler);
408+
PROVIDE(LPTIM2_Interrupt_Handler = DefaultExceptionHandler);
409+
PROVIDE(OTG_FS_Interrupt_Handler = DefaultExceptionHandler);
410+
PROVIDE(DMA2_CH6_Interrupt_Handler = DefaultExceptionHandler);
411+
PROVIDE(DMA2_CH7_Interrupt_Handler = DefaultExceptionHandler);
412+
PROVIDE(LPUART1_Interrupt_Handler = DefaultExceptionHandler);
413+
PROVIDE(QUADSPI_Interrupt_Handler = DefaultExceptionHandler);
414+
PROVIDE(I2C3_EV_Interrupt_Handler = DefaultExceptionHandler);
415+
PROVIDE(I2C3_ER_Interrupt_Handler = DefaultExceptionHandler);
416+
PROVIDE(SAI1_Interrupt_Handler = DefaultExceptionHandler);
417+
PROVIDE(SAI2_Interrupt_Handler = DefaultExceptionHandler);
418+
PROVIDE(SWPMI1_Interrupt_Handler = DefaultExceptionHandler);
419+
PROVIDE(TSC_Interrupt_Handler = DefaultExceptionHandler);
420+
PROVIDE(LCD_Interrupt_Handler = DefaultExceptionHandler);
421+
PROVIDE(AES_Interrupt_Handler = DefaultExceptionHandler);
422+
PROVIDE(RNG_Interrupt_Handler = DefaultExceptionHandler);
423+
PROVIDE(FPU_Interrupt_Handler = DefaultExceptionHandler);

minimal_interrupt/l0/src/stm32l475xx/entry_point.rs

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,15 @@ pub unsafe extern "C" fn Reset() {
4343
}
4444

4545
extern "C" {
46-
fn __StackTop();
46+
fn __StackTop(); // Check `gcc_arm.ld`
47+
fn NMI();
48+
fn HardFault();
49+
fn MemManage();
50+
fn BusFault();
51+
fn UsageFault();
52+
fn SVCall();
53+
fn PendSV();
54+
fn SysTick();
4755
}
4856

4957
#[repr(C)]
@@ -59,38 +67,22 @@ pub static EXCEPTIONS: [Vector; 16] = [
5967
handler: __StackTop,
6068
},
6169
Vector { handler: Reset },
70+
Vector { handler: NMI },
71+
Vector { handler: HardFault },
72+
Vector { handler: MemManage },
73+
Vector { handler: BusFault },
6274
Vector {
63-
handler: DefaultExceptionHandler,
64-
}, // NMI
65-
Vector {
66-
handler: DefaultExceptionHandler,
67-
}, // HardFault
68-
Vector {
69-
handler: DefaultExceptionHandler,
70-
}, // MemManage
71-
Vector {
72-
handler: DefaultExceptionHandler,
73-
}, // BusFault
74-
Vector {
75-
handler: DefaultExceptionHandler,
76-
}, // UsageFault
75+
handler: UsageFault,
76+
},
7777
Vector { reserved: 0 },
7878
Vector { reserved: 0 },
7979
Vector { reserved: 0 },
8080
Vector { reserved: 0 },
81-
Vector {
82-
handler: DefaultExceptionHandler,
83-
}, // SVCall
84-
Vector {
85-
handler: DefaultExceptionHandler,
86-
}, // Debug
81+
Vector { handler: SVCall },
82+
Vector { reserved: 0 }, // Debug Monitor Handler comes here
8783
Vector { reserved: 0 },
88-
Vector {
89-
handler: DefaultExceptionHandler,
90-
}, // PendSV
91-
Vector {
92-
handler: DefaultExceptionHandler,
93-
}, // SysTick
84+
Vector { handler: PendSV },
85+
Vector { handler: SysTick },
9486
];
9587

9688
#[no_mangle]

minimal_interrupt/l0/src/stm32l475xx/interrupt.rs

Lines changed: 167 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use crate::{read_register, SCB_PORT};
2-
31
#[derive(Copy, Clone)]
42
pub enum Interrupt {
53
WWDG,
@@ -86,25 +84,174 @@ pub enum Interrupt {
8684
FPU,
8785
}
8886

89-
static mut MY_INTERRUPTS: [fn(); 82] = [|| loop {}; 82];
90-
pub fn attach_interrupt_handler(interrupt: Interrupt, handler: fn()) {
91-
let index: usize = interrupt as usize;
92-
unsafe {
93-
MY_INTERRUPTS[index] = handler;
94-
}
87+
extern "C" {
88+
fn WWDG_Interrupt_Handler();
89+
fn PVD_PVM_Interrupt_Handler();
90+
fn RTC_TAMP_STAMP_Interrupt_Handler();
91+
fn RTC_WKUP_Interrupt_Handler();
92+
fn FLASH_Interrupt_Handler();
93+
fn RCC_Interrupt_Handler();
94+
fn EXTI0_Interrupt_Handler();
95+
fn EXTI1_Interrupt_Handler();
96+
fn EXTI2_Interrupt_Handler();
97+
fn EXTI3_Interrupt_Handler();
98+
fn EXTI4_Interrupt_Handler();
99+
fn DMA1_CH1_Interrupt_Handler();
100+
fn DMA1_CH2_Interrupt_Handler();
101+
fn DMA1_CH3_Interrupt_Handler();
102+
fn DMA1_CH4_Interrupt_Handler();
103+
fn DMA1_CH5_Interrupt_Handler();
104+
fn DMA1_CH6_Interrupt_Handler();
105+
fn DMA1_CH7_Interrupt_Handler();
106+
fn ADC1_2_Interrupt_Handler();
107+
fn CAN1_TX_Interrupt_Handler();
108+
fn CAN1_RX0_Interrupt_Handler();
109+
fn CAN1_RX1_Interrupt_Handler();
110+
fn CAN1_SCE_Interrupt_Handler();
111+
fn EXTI9_5_Interrupt_Handler();
112+
fn TIM1_BRK_Interrupt_Handler();
113+
fn TIM1_UP_Interrupt_Handler();
114+
fn TIM1_TRG_COM_Interrupt_Handler();
115+
fn TIM1_CC_Interrupt_Handler();
116+
fn TIM2_Interrupt_Handler();
117+
fn TIM3_Interrupt_Handler();
118+
fn TIM4_Interrupt_Handler();
119+
fn I2C1_EV_Interrupt_Handler();
120+
fn I2C1_ER_Interrupt_Handler();
121+
fn I2C2_EV_Interrupt_Handler();
122+
fn I2C2_ER_Interrupt_Handler();
123+
fn SPI1_Interrupt_Handler();
124+
fn SPI2_Interrupt_Handler();
125+
fn USART1_Interrupt_Handler();
126+
fn USART2_Interrupt_Handler();
127+
fn USART3_Interrupt_Handler();
128+
fn EXTI15_10_Interrupt_Handler();
129+
fn RTC_ALARM_Interrupt_Handler();
130+
fn DFSDM1_FLT3_Interrupt_Handler();
131+
fn TIM8_BRK_Interrupt_Handler();
132+
fn TIM8_UP_Interrupt_Handler();
133+
fn TIM8_TRG_COM_Interrupt_Handler();
134+
fn TIM8_CC_Interrupt_Handler();
135+
fn ADC3_Interrupt_Handler();
136+
fn FMC_Interrupt_Handler();
137+
fn SDMMC1_Interrupt_Handler();
138+
fn TIM5_Interrupt_Handler();
139+
fn SPI3_Interrupt_Handler();
140+
fn UART4_Interrupt_Handler();
141+
fn UART5_Interrupt_Handler();
142+
fn TIM6_DAC_Interrupt_Handler();
143+
fn TIM7_Interrupt_Handler();
144+
fn DMA2_CH1_Interrupt_Handler();
145+
fn DMA2_CH2_Interrupt_Handler();
146+
fn DMA2_CH3_Interrupt_Handler();
147+
fn DMA2_CH4_Interrupt_Handler();
148+
fn DMA2_CH5_Interrupt_Handler();
149+
fn DFSDM1_FLT0_Interrupt_Handler();
150+
fn DFSDM1_FLT1_Interrupt_Handler();
151+
fn DFSDM1_FLT2_Interrupt_Handler();
152+
fn COMP_Interrupt_Handler();
153+
fn LPTIM1_Interrupt_Handler();
154+
fn LPTIM2_Interrupt_Handler();
155+
fn OTG_FS_Interrupt_Handler();
156+
fn DMA2_CH6_Interrupt_Handler();
157+
fn DMA2_CH7_Interrupt_Handler();
158+
fn LPUART1_Interrupt_Handler();
159+
fn QUADSPI_Interrupt_Handler();
160+
fn I2C3_EV_Interrupt_Handler();
161+
fn I2C3_ER_Interrupt_Handler();
162+
fn SAI1_Interrupt_Handler();
163+
fn SAI2_Interrupt_Handler();
164+
fn SWPMI1_Interrupt_Handler();
165+
fn TSC_Interrupt_Handler();
166+
fn LCD_Interrupt_Handler();
167+
fn AES_Interrupt_Handler();
168+
fn RNG_Interrupt_Handler();
169+
fn FPU_Interrupt_Handler();
95170
}
96171

97172
#[link_section = ".vector_table.interrupts"]
98173
#[no_mangle]
99-
static INTERRUPTS: [unsafe extern "C" fn(); 82] = [DefaultInterruptHandler; 82];
100-
101-
#[no_mangle]
102-
extern "C" fn DefaultInterruptHandler() {
103-
let scb_port = SCB_PORT::port();
104-
let irq_num = (read_register!(scb_port.ICSR) & 0xFF) - 16;
105-
unsafe {
106-
MY_INTERRUPTS
107-
.get(irq_num as usize)
108-
.expect("No interrupt registered")();
109-
}
110-
}
174+
static INTERRUPTS: [unsafe extern "C" fn(); 82] = [
175+
WWDG_Interrupt_Handler,
176+
PVD_PVM_Interrupt_Handler,
177+
RTC_TAMP_STAMP_Interrupt_Handler,
178+
RTC_WKUP_Interrupt_Handler,
179+
FLASH_Interrupt_Handler,
180+
RCC_Interrupt_Handler,
181+
EXTI0_Interrupt_Handler,
182+
EXTI1_Interrupt_Handler,
183+
EXTI2_Interrupt_Handler,
184+
EXTI3_Interrupt_Handler,
185+
EXTI4_Interrupt_Handler,
186+
DMA1_CH1_Interrupt_Handler,
187+
DMA1_CH2_Interrupt_Handler,
188+
DMA1_CH3_Interrupt_Handler,
189+
DMA1_CH4_Interrupt_Handler,
190+
DMA1_CH5_Interrupt_Handler,
191+
DMA1_CH6_Interrupt_Handler,
192+
DMA1_CH7_Interrupt_Handler,
193+
ADC1_2_Interrupt_Handler,
194+
CAN1_TX_Interrupt_Handler,
195+
CAN1_RX0_Interrupt_Handler,
196+
CAN1_RX1_Interrupt_Handler,
197+
CAN1_SCE_Interrupt_Handler,
198+
EXTI9_5_Interrupt_Handler,
199+
TIM1_BRK_Interrupt_Handler,
200+
TIM1_UP_Interrupt_Handler,
201+
TIM1_TRG_COM_Interrupt_Handler,
202+
TIM1_CC_Interrupt_Handler,
203+
TIM2_Interrupt_Handler,
204+
TIM3_Interrupt_Handler,
205+
TIM4_Interrupt_Handler,
206+
I2C1_EV_Interrupt_Handler,
207+
I2C1_ER_Interrupt_Handler,
208+
I2C2_EV_Interrupt_Handler,
209+
I2C2_ER_Interrupt_Handler,
210+
SPI1_Interrupt_Handler,
211+
SPI2_Interrupt_Handler,
212+
USART1_Interrupt_Handler,
213+
USART2_Interrupt_Handler,
214+
USART3_Interrupt_Handler,
215+
EXTI15_10_Interrupt_Handler,
216+
RTC_ALARM_Interrupt_Handler,
217+
DFSDM1_FLT3_Interrupt_Handler,
218+
TIM8_BRK_Interrupt_Handler,
219+
TIM8_UP_Interrupt_Handler,
220+
TIM8_TRG_COM_Interrupt_Handler,
221+
TIM8_CC_Interrupt_Handler,
222+
ADC3_Interrupt_Handler,
223+
FMC_Interrupt_Handler,
224+
SDMMC1_Interrupt_Handler,
225+
TIM5_Interrupt_Handler,
226+
SPI3_Interrupt_Handler,
227+
UART4_Interrupt_Handler,
228+
UART5_Interrupt_Handler,
229+
TIM6_DAC_Interrupt_Handler,
230+
TIM7_Interrupt_Handler,
231+
DMA2_CH1_Interrupt_Handler,
232+
DMA2_CH2_Interrupt_Handler,
233+
DMA2_CH3_Interrupt_Handler,
234+
DMA2_CH4_Interrupt_Handler,
235+
DMA2_CH5_Interrupt_Handler,
236+
DFSDM1_FLT0_Interrupt_Handler,
237+
DFSDM1_FLT1_Interrupt_Handler,
238+
DFSDM1_FLT2_Interrupt_Handler,
239+
COMP_Interrupt_Handler,
240+
LPTIM1_Interrupt_Handler,
241+
LPTIM2_Interrupt_Handler,
242+
OTG_FS_Interrupt_Handler,
243+
DMA2_CH6_Interrupt_Handler,
244+
DMA2_CH7_Interrupt_Handler,
245+
LPUART1_Interrupt_Handler,
246+
QUADSPI_Interrupt_Handler,
247+
I2C3_EV_Interrupt_Handler,
248+
I2C3_ER_Interrupt_Handler,
249+
SAI1_Interrupt_Handler,
250+
SAI2_Interrupt_Handler,
251+
SWPMI1_Interrupt_Handler,
252+
TSC_Interrupt_Handler,
253+
LCD_Interrupt_Handler,
254+
AES_Interrupt_Handler,
255+
RNG_Interrupt_Handler,
256+
FPU_Interrupt_Handler,
257+
];

0 commit comments

Comments
 (0)