Esempio n. 1
0
/*
 *  ======== 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);
}
Esempio n. 3
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);
}
Esempio n. 4
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);
}
Esempio n. 5
0
/*
 *  ======== 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);
}