/* * ======== Swi_restorePri ======== */ Void Swi_restorePri(UInt priority) { UInt swiKey; swiKey = Swi_disable(); Swi_module->curQ = Queue_Object_get(Swi_module->readyQ, priority); Swi_restore(swiKey); }
/* * ======== Task_postInit ======== * Function to be called during module startup to complete the * initialization of any statically created or constructed task. * Initialize stack. * Build Initial stack image. * Add task to corresponding ready Queue. * * returns (0) and clean 'eb' on success * returns (0) and 'eb' if Task_SupportProxy_start() fails. * returns (n) and 'eb' for number of successful createFxn() calls iff * one of the createFxn() calls fails */ Int Task_postInit(Task_Object *tsk, Error_Block *eb) { UInt tskKey, hwiKey; Queue_Handle readyQ; #ifndef ti_sysbios_knl_Task_DISABLE_ALL_HOOKS Int i; #endif tsk->context = Task_SupportProxy_start(tsk, (Task_SupportProxy_FuncPtr)Task_enter, (Task_SupportProxy_FuncPtr)Task_exit, eb); if (Error_check(eb)) { return (0); } tsk->mode = Task_Mode_READY; tsk->pendElem = NULL; #ifndef ti_sysbios_knl_Task_DISABLE_ALL_HOOKS for (i = 0; i < Task_hooks.length; i++) { tsk->hookEnv[i] = (Ptr)0; if (Task_hooks.elem[i].createFxn != NULL) { Task_hooks.elem[i].createFxn(tsk, eb); if (Error_check(eb)) { return (i); } } } #endif if (tsk->priority < 0) { tsk->mask = 0; tsk->readyQ = Task_Module_State_inactiveQ(); Queue_put(tsk->readyQ, (Queue_Elem *)tsk); } else { tsk->mask = 1 << tsk->priority; readyQ = Queue_Object_get(Task_module->readyQ, tsk->priority); tsk->readyQ = readyQ; tskKey = Task_disable(); hwiKey = Hwi_disable(); Task_unblock(tsk); Hwi_restore(hwiKey); Task_restore(tskKey); } return (0); }
/* * ======== Swi_Instance_init ======== */ Int Swi_Instance_init(Swi_Object *swi, Swi_FuncPtr fxn, const Swi_Params *params, Error_Block *eb) { Int status; Assert_isTrue((BIOS_swiEnabled == TRUE), Swi_A_swiDisabled); Queue_elemClear(&swi->qElem); swi->fxn = fxn; swi->arg0 = params->arg0; swi->arg1 = params->arg1; if (params->priority == ~0) { swi->priority = Swi_numPriorities - 1; } else { swi->priority = params->priority; } Assert_isTrue((swi->priority < Swi_numPriorities), Swi_A_badPriority); swi->mask = 1 << swi->priority; swi->posted = FALSE; swi->initTrigger = swi->trigger = params->trigger; swi->readyQ = Queue_Object_get(Swi_module->readyQ, swi->priority); #ifndef ti_sysbios_knl_Swi_DISABLE_ALL_HOOKS if (Swi_hooks.length > 0) { swi->hookEnv = Memory_alloc(Swi_Object_heap(), Swi_hooks.length * sizeof(Ptr), 0, eb); if (swi->hookEnv == NULL) { return (1); /* see 2 below */ } } #endif status = Swi_postInit(swi, eb); /* * floor of 2 here is to differentiate Swi_postInit errors * from Instance_init errors */ if (Error_check(eb)) { return (2 + status); } return (0); }
/* * ======== Swi_raisePri ======== * !!! Warning, while raisePri is in effect, the !!! * !!! current Swi's priority and mask don't !!! * !!! match curQ. !!! */ UInt Swi_raisePri(UInt priority) { UInt hwiKey; Queue_Handle oldCurQ, newCurQ; hwiKey = Hwi_disable(); oldCurQ = Swi_module->curQ; newCurQ = Queue_Object_get(Swi_module->readyQ, priority); Swi_module->curQ = newCurQ > oldCurQ ? newCurQ : oldCurQ; Hwi_restore(hwiKey); return (Swi_module->curSwi->priority); }
/* * ======== Swi_setAttrs ======== */ Void Swi_setAttrs(Swi_Object *swi, Swi_FuncPtr fxn, Swi_Params *params) { UInt hwiKey; Swi_Params swiParams; if (params == NULL) { Swi_Params_init(&swiParams); params = &swiParams; } hwiKey = Hwi_disable(); /* defensively remove swi from its readyQ */ Queue_remove((Queue_Elem *)swi); if (fxn) { swi->fxn = fxn; } swi->posted = FALSE; swi->arg0 = params->arg0; swi->arg1 = params->arg1; if (params->priority == ~0) { swi->priority = Swi_numPriorities - 1; } else { swi->priority = params->priority; } Assert_isTrue((swi->priority < Swi_numPriorities), Swi_A_badPriority); swi->mask = 1 << swi->priority; swi->initTrigger = swi->trigger = params->trigger; swi->readyQ = Queue_Object_get(Swi_module->readyQ, swi->priority); Hwi_restore(hwiKey); }