/** * Start the OS. First check to see if we are running with the correct stack * pointer set (PSP) and privilege mode (PRIV). * * * @return os_error_t */ os_error_t os_arch_os_start(void) { os_error_t err; err = OS_ERR_IN_ISR; if (__get_IPSR() == 0) { /* * The following switch statement is really just a sanity check to * insure that the os initialization routine was called prior to the * os start routine. */ err = OS_OK; switch (__get_CONTROL() & 0x03) { /* * These two cases are for completeness. Thread mode should be set * to use PSP already. * * Fall-through intentional! */ case 0x00: case 0x01: err = OS_ERR_PRIV; break; case 0x02: /* * We are running in Privileged Thread mode w/SP = PSP but we * are supposed to be un-privileged. */ if ((os_flags & 1) == OS_RUN_UNPRIV) { err = OS_ERR_PRIV; } break; case 0x03: /* * We are running in Unprivileged Thread mode w/SP = PSP but we * are supposed to be privileged. */ if ((os_flags & 1) == OS_RUN_PRIV) { err = OS_ERR_PRIV; } break; } if (err == OS_OK) { /* Always start OS through SVC call */ svc_os_arch_start(); } } return err; }
/** * Start the OS. First check to see if we are running with the correct stack * pointer set (PSP) and privilege mode (PRIV). * * @return os_error_t */ os_error_t os_arch_os_start(void) { os_error_t err; /* * 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. * * We switch to using "empty" part of idle task's stack until * the svc_os_arch_start() executes SVC, and we will never return. */ os_set_env(g_idle_task.t_stackptr - 1); err = OS_ERR_IN_ISR; if (__get_IPSR() == 0) { /* * The following switch statement is really just a sanity check to * insure that the os initialization routine was called prior to the * os start routine. */ err = OS_OK; switch (__get_CONTROL() & 0x03) { /* * These two cases are for completeness. Thread mode should be set * to use PSP already. * * Fall-through intentional! */ case 0x00: case 0x01: err = OS_ERR_PRIV; break; case 0x02: /* * We are running in Privileged Thread mode w/SP = PSP but we * are supposed to be un-privileged. */ if ((os_flags & 1) == OS_RUN_UNPRIV) { err = OS_ERR_PRIV; } break; case 0x03: /* * We are running in Unprivileged Thread mode w/SP = PSP but we * are supposed to be privileged. */ if ((os_flags & 1) == OS_RUN_PRIV) { err = OS_ERR_PRIV; } break; } if (err == OS_OK) { /* Always start OS through SVC call */ svc_os_arch_start(); } } return err; }