100 volatile uint32_t cfsr = SCB->CFSR;
101 volatile uint32_t hfsr = SCB->HFSR;
102 volatile uint32_t mmfar = SCB->MMFAR;
103 volatile uint32_t bfar = SCB->BFAR;
104 (void)cfsr; (void)hfsr; (void)mmfar; (void)bfar;
108 __asm__
volatile (
"tst lr, #4\n"
113 volatile uint32_t stacked_r0 = sp[0];
114 volatile uint32_t stacked_r1 = sp[1];
115 volatile uint32_t stacked_r2 = sp[2];
116 volatile uint32_t stacked_r3 = sp[3];
117 volatile uint32_t stacked_r12 = sp[4];
118 volatile uint32_t stacked_lr = sp[5];
119 volatile uint32_t stacked_pc = sp[6];
120 volatile uint32_t stacked_psr = sp[7];
121 (void)stacked_r0; (void)stacked_r1; (void)stacked_r2; (void)stacked_r3;
122 (void)stacked_r12; (void)stacked_lr; (void)stacked_pc; (void)stacked_psr;
127 for (
int i = 0; i < 3; i++) {
129 for (
volatile int d = 0; d < 16000000; d++) {}
131 for (
volatile int d = 0; d < 16000000; d++) {}
133 for (
volatile int d = 0; d < 160000000; d++) {}
161 uint32_t cfsr = SCB->CFSR;
167 bool is_daccviol = (cfsr & SCB_CFSR_DACCVIOL_Msk) != 0;
168 bool is_iaccviol = (cfsr & SCB_CFSR_IACCVIOL_Msk) != 0;
172 __asm__
volatile (
"mov %0, lr" :
"=r" (lr_val));
173 bool from_psp = (lr_val & 0x4) != 0;
176 if (is_daccviol && !is_iaccviol && from_psp) {
179 __asm__
volatile (
"mrs %0, psp" :
"=r" (sp));
182 if (cfsr & SCB_CFSR_MMARVALID_Msk) {
192 uint16_t *pc_ptr = (uint16_t *)sp[6];
193 uint16_t instr = *pc_ptr;
194 uint8_t instr_len = ((instr & 0xF800) >= 0xE800) ? 4 : 2;
215 for (
int i = 0; i < 4; i++) {
217 for (
volatile int d = 0; d < 16000000; d++) {}
219 for (
volatile int d = 0; d < 16000000; d++) {}
221 for (
volatile int d = 0; d < 160000000; d++) {}
234 volatile uint32_t cfsr = SCB->CFSR;
235 volatile uint32_t bfar = SCB->BFAR;
236 (void)cfsr; (void)bfar;
241 for (
int i = 0; i < 5; i++) {
243 for (
volatile int d = 0; d < 16000000; d++) {}
245 for (
volatile int d = 0; d < 16000000; d++) {}
247 for (
volatile int d = 0; d < 160000000; d++) {}
260 volatile uint32_t cfsr = SCB->CFSR;
266 for (
int i = 0; i < 6; i++) {
268 for (
volatile int d = 0; d < 16000000; d++) {}
270 for (
volatile int d = 0; d < 16000000; d++) {}
272 for (
volatile int d = 0; d < 160000000; d++) {}
358 SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk;
#define ICARUS_TICKS_PER_TASK
Number of SysTick interrupts per task time slice.
ICARUS OS Configuration Header.
volatile uint32_t current_task_ticks_remaining
Ticks remaining in current task's time slice.
volatile uint8_t os_running
Flag indicating OS is running.
volatile uint32_t os_tick_count
System tick counter.
volatile bool scheduler_enabled
Scheduler enable flag.
volatile uint32_t g_last_fault_pc
void UsageFault_Handler(void)
This function handles Undefined instruction or illegal state.
void HardFault_Handler(void)
This function handles Hard fault interrupt.
void MemManage_Handler(void)
This function handles Memory management fault.
volatile uint32_t g_last_fault_addr
void SVC_Handler(void)
This function handles System service call via SWI instruction.
PCD_HandleTypeDef hpcd_USB_OTG_FS
void PendSV_Handler(void)
This function handles Pendable request for system service.
void NMI_Handler(void)
This function handles Non maskable interrupt.
void OTG_FS_IRQHandler(void)
This function handles USB On The Go FS global interrupt.
void BusFault_Handler(void)
This function handles Pre-fetch fault, memory access fault.
void SysTick_Handler(void)
This function handles System tick timer.
volatile uint32_t g_memmanage_fault_count
void DebugMon_Handler(void)
This function handles Debug monitor.
This file contains the headers of the interrupt handlers.
ICARUS Supervisor Call (SVC) Definitions.