os_error_t os_arch_os_init(void) { os_error_t err; int i; /* Cannot be called within an ISR */ err = OS_ERR_IN_ISR; if (__get_IPSR() == 0) { err = OS_OK; /* Drop priority for all interrupts */ for (i = 0; i < sizeof(NVIC->IP); i++) { NVIC->IP[i] = 0xff; } /* * Install default interrupt handler, which'll print out system * state at the time of the interrupt, and few other regs which * should help in trying to figure out what went wrong. */ NVIC_SetVector(-13, (uint32_t)os_default_irq_asm); /* Hardfault */ NVIC_SetVector(MemoryManagement_IRQn, (uint32_t)os_default_irq_asm); NVIC_SetVector(BusFault_IRQn, (uint32_t)os_default_irq_asm); NVIC_SetVector(UsageFault_IRQn, (uint32_t)os_default_irq_asm); for (i = 0; i < NVIC_NUM_VECTORS - NVIC_USER_IRQ_OFFSET; i++) { NVIC_SetVector(i, (uint32_t)os_default_irq_asm); } /* Call bsp related OS initializations */ os_bsp_init(); /* Set the PendSV interrupt exception priority to the lowest priority */ NVIC_SetPriority(PendSV_IRQn, PEND_SV_PRIO); /* Set the SVC interrupt to priority 0 (highest configurable) */ NVIC_SetPriority(SVCall_IRQn, SVC_PRIO); /* * Set the os environment. This will set stack pointers and, based * on the contents of os_flags, will determine if the tasks run in * priviliged or un-privileged mode. */ os_set_env(); /* Check if privileged or not */ if ((__get_CONTROL() & 1) == 0) { os_arch_init(); } else { svc_os_arch_init(); } } return err; }
os_error_t os_arch_os_init(void) { os_error_t err; int i; /* Cannot be called within an ISR */ err = OS_ERR_IN_ISR; if (__get_IPSR() == 0) { err = OS_OK; /* Drop priority for all interrupts */ for (i = 0; i < sizeof(NVIC->IP); i++) { NVIC->IP[i] = -1; } NVIC_SetVector(SVCall_IRQn, (uint32_t)SVC_Handler); NVIC_SetVector(PendSV_IRQn, (uint32_t)PendSV_Handler); NVIC_SetVector(SysTick_IRQn, (uint32_t)SysTick_Handler); /* * Install default interrupt handler, which'll print out system * state at the time of the interrupt, and few other regs which * should help in trying to figure out what went wrong. */ NVIC_SetVector(NonMaskableInt_IRQn, (uint32_t)os_default_irq_asm); NVIC_SetVector(HardFault_IRQn, (uint32_t)os_default_irq_asm); NVIC_SetVector(-13, (uint32_t)os_default_irq_asm); /* Hardfault */ for (i = 0; i < NVIC_NUM_VECTORS - NVIC_USER_IRQ_OFFSET; i++) { NVIC_SetVector(i, (uint32_t)os_default_irq_asm); } /* Set the PendSV interrupt exception priority to the lowest priority */ NVIC_SetPriority(PendSV_IRQn, PEND_SV_PRIO); /* Set the SVC interrupt to priority 0 (highest configurable) */ NVIC_SetPriority(SVCall_IRQn, SVC_PRIO); /* Check if privileged or not */ if ((__get_CONTROL() & 1) == 0) { os_arch_init(); } else { svc_os_arch_init(); } } return err; }
os_error_t os_arch_os_init(void) { os_error_t err; /* Cannot be called within an ISR */ err = OS_ERR_IN_ISR; if (__get_IPSR() == 0) { err = OS_OK; /* Call bsp related OS initializations */ os_bsp_init(); /* Set the PendSV interrupt exception priority to the lowest priority */ NVIC_SetPriority(PendSV_IRQn, PEND_SV_PRIO); /* Set the SVC interrupt to priority 0 (highest configurable) */ NVIC_SetPriority(SVCall_IRQn, SVC_PRIO); /* * Set the os environment. This will set stack pointers and, based * on the contents of os_flags, will determine if the tasks run in * priviliged or un-privileged mode. */ os_set_env(); /* Check if priviliged or not */ if ((__get_CONTROL() & 1) == 0) { os_arch_init(); } else { svc_os_arch_init(); } } return err; }