Exemplo n.º 1
0
/*****************************************************************************
 Function   : VOS_CreateTask
 Description: create task with default task mode:
              VOS_T_PREEMPT | VOS_T_NO_TSLICE | VOS_T_SUPV
 Input      : puchName              -- name identify task
              pfnFunc               -- task entry function
              ulPriority            -- task priority
              ulStackSize           -- task stack size
              aulArgs[VOS_TARG_NUM] -- arguments for task
 Output     : pulTaskID             -- task id allocated by dopra
 Return     : result of VOS_CreateTaskEx
 *****************************************************************************/
VOS_UINT32 VOS_CreateTask( VOS_CHAR * puchName,
                           VOS_UINT32 * pulTaskID,
                           VOS_TASK_ENTRY_TYPE pfnFunc,
                           VOS_UINT32 ulPriority,
                           VOS_UINT32 ulStackSize,
                           VOS_UINT32 aulArgs[VOS_TARG_NUM] )
{
    int             i;
    VOS_UINT32      iTid;
    pid_t           ThreadID;
    VOS_CHAR        default_name[8] = {0};
    VOS_UCHAR       value;
    struct task_struct  *tsk;

    struct sched_param  param;

    iTid = VOS_TaskCtrlBlkGet();
    if( iTid == (VOS_UINT32)VOS_TASK_CTRL_BLK_NULL )
    {
		VOS_TaskPrintCtrlBlkInfo();
		
		DRV_SYSTEM_ERROR(OSA_ALLOC_TASK_CONTROL_ERROR, (VOS_INT)vos_TaskCtrlBlkNumber, (VOS_INT)pfnFunc, VOS_NULL_PTR, 0);
		
        VOS_SetErrorNo(VOS_ERRNO_TASK_CREATE_NOFREETCB);
        return( VOS_ERRNO_TASK_CREATE_NOFREETCB );    
    }

    /* caller not use name asign a default name */    
    if ( VOS_NULL_PTR == puchName ) 
    {
        default_name[0]= 't';
        default_name[1]= 'i';
        default_name[2]= 'd';
        default_name[3] = (VOS_CHAR)(48 + iTid/100);
        value = (VOS_UCHAR)(iTid%100);
        default_name[4] = (VOS_CHAR)(48 + value/10);
        default_name[5] = (VOS_CHAR)(48 + value%10);
        default_name[6]= '\0';
    }

    *pulTaskID = iTid;

    if ( VOS_NULL_PTR != puchName ) 
    {
        for(i=0; i<VOS_MAX_LENGTH_TASK_NAME; i++)
        {
            vos_TaskCtrlBlk[iTid].Name[i]= puchName[i];
        }            
        vos_TaskCtrlBlk[iTid].Name[i-1]  = '\0';
    }
    else
    {
        vos_TaskCtrlBlk[iTid].Name[0] = default_name[0];
        vos_TaskCtrlBlk[iTid].Name[1] = default_name[1];
        vos_TaskCtrlBlk[iTid].Name[2] = default_name[2];
        vos_TaskCtrlBlk[iTid].Name[3] = default_name[3];
        vos_TaskCtrlBlk[iTid].Name[4] = default_name[4];
        vos_TaskCtrlBlk[iTid].Name[5] = default_name[5];
        vos_TaskCtrlBlk[iTid].Name[6] = default_name[6];
    }

    vos_TaskCtrlBlk[iTid].Function   = pfnFunc;
    vos_TaskCtrlBlk[iTid].Priority   = ulPriority;
    vos_TaskCtrlBlk[iTid].StackSize  = ulStackSize;

    for ( i=0; i<VOS_TARG_NUM; i++ )
    {
        vos_TaskCtrlBlk[iTid].Args[i]    = aulArgs[i];
    }

    ThreadID = kernel_thread( (LINUX_START_ROUTINE)VOS_LinuxTaskEntry,
        ( VOS_VOID * )&(vos_TaskCtrlBlk[iTid]), CLONE_KERNEL);

    if (ThreadID < VOS_NULL) 
    {
		VOS_TaskPrintCtrlBlkInfo();

		DRV_SYSTEM_ERROR(OSA_CREATE_TASK_ERROR, (VOS_INT)ThreadID, (VOS_INT)iTid, VOS_NULL_PTR, 0);
		
        VOS_TaskCtrlBlkFree(iTid);
        VOS_SetErrorNo(VOS_ERRNO_TASK_CREATE_OSALCREATEFAIL);
        return( VOS_ERRNO_TASK_CREATE_OSALCREATEFAIL );
    }

    vos_TaskCtrlBlk[iTid].ulLinuxThreadId = ThreadID;

    tsk = pid_task(find_vpid(ThreadID), PIDTYPE_PID);

    if ( VOS_NULL_PTR == tsk )
    {
		VOS_TaskPrintCtrlBlkInfo();

		DRV_SYSTEM_ERROR(OSA_FIND_TASK_ERROR, (VOS_INT)ThreadID, (VOS_INT)iTid, VOS_NULL_PTR, 0);
		
        return VOS_ERR;
    }

    if ( tsk->pid != ThreadID )
    {
        vos_printf("find task to set pri fail.\r\n");

        VOS_TaskPrintCtrlBlkInfo();

		DRV_SYSTEM_ERROR(OSA_FIND_TASK_PARA_ERROR, (VOS_INT)ThreadID, (VOS_INT)iTid, (VOS_CHAR *)tsk, sizeof(struct task_struct));
		
        return VOS_ERR;
    }

    param.sched_priority = ulPriority;

    if (VOS_NULL != sched_setscheduler(tsk, SCHED_FIFO, &param))
    {
        vos_printf("\r\nVOS_CreateTask: Creat Task %s ID %d sched_setscheduler Error", puchName, iTid);

        VOS_TaskPrintCtrlBlkInfo();

		DRV_SYSTEM_ERROR(OSA_SET_TASK_PRI_ERROR, (VOS_INT)ulPriority, (VOS_INT)iTid, (VOS_CHAR *)tsk, sizeof(struct task_struct));
		
        return VOS_ERR;
    }

    return VOS_OK;
}
/*****************************************************************************
 Function   : VOS_CreateTask
 Description: create task with default task mode:
              VOS_T_PREEMPT | VOS_T_NO_TSLICE | VOS_T_SUPV
 Input      : puchName              -- name identify task
              pfnFunc               -- task entry function
              ulPriority            -- task priority
              ulStackSize           -- task stack size
              aulArgs[VOS_TARG_NUM] -- arguments for task
 Output     : pulTaskID             -- task id allocated by dopra
 Return     : result of VOS_CreateTaskEx
 *****************************************************************************/
VOS_UINT32 VOS_CreateTask( VOS_CHAR * puchName,
                           VOS_UINT32 * pulTaskID,
                           VOS_TASK_ENTRY_TYPE pfnFunc,
                           VOS_UINT32 ulPriority,
                           VOS_UINT32 ulStackSize,
                           VOS_UINT32 aulArgs[VOS_TARG_NUM] )
{
    int             i;
    VOS_UINT32      iTid;
    VOS_CHAR        default_name[8];
    VOS_UCHAR       value;
    VOS_VOID        *pStackStartAddress;

    iTid = VOS_TaskCtrlBlkGet();
    if( iTid == (VOS_UINT32)VOS_TASK_CTRL_BLK_NULL )
    {
        VOS_SetErrorNo(VOS_ERRNO_TASK_CREATE_NOFREETCB);
        return( VOS_ERRNO_TASK_CREATE_NOFREETCB );
    }

    /* caller not use name asign a default name */
    if ( VOS_NULL_PTR == puchName )
    {
        default_name[0]= 't';
        default_name[1]= 'i';
        default_name[2]= 'd';
        default_name[3] = (VOS_CHAR)(48 + iTid/100);
        value = (VOS_UCHAR)(iTid%100);
        default_name[4] = (VOS_CHAR)(48 + value/10);
        default_name[5] = (VOS_CHAR)(48 + value%10);
        default_name[6]= '\0';

        /*lint -e534*/
        VOS_MemCpy(vos_TaskCtrlBlk[iTid].Name, default_name, 7);
        /*lint +e534*/
    }
    else
    {
        for(i=0; i<VOS_MAX_LENGTH_TASK_NAME; i++)
        {
            vos_TaskCtrlBlk[iTid].Name[i]= puchName[i];
        }
        vos_TaskCtrlBlk[iTid].Name[i-1]  = '\0';
    }

    pStackStartAddress = NU_StackMalloc(ulStackSize);
    if ( VOS_NULL_PTR == pStackStartAddress )
    {
        VOS_TaskCtrlBlkFree(iTid);
        VOS_SetErrorNo(VOS_ERRNO_TASK_CREATE_OSALCREATEFAIL);
        return( VOS_ERRNO_TASK_CREATE_OSALCREATEFAIL );
    }

    vos_TaskCtrlBlk[iTid].Function   = pfnFunc;
    vos_TaskCtrlBlk[iTid].Priority   = ulPriority;
    vos_TaskCtrlBlk[iTid].StackSize  = ulStackSize;

    for ( i=0; i<VOS_TARG_NUM; i++ )
    {
        vos_TaskCtrlBlk[iTid].Args[i]    = aulArgs[i];
    }

    if ( NU_SUCCESS
        != NU_Create_Task(&(vos_TaskCtrlBlk[iTid].NuTid), vos_TaskCtrlBlk[iTid].Name,
            VOS_NucleusTaskEntry, (VOS_UINT32)(&(vos_TaskCtrlBlk[iTid])),
            VOS_NULL_PTR, pStackStartAddress, ulStackSize, ulPriority, 0,
            NU_PREEMPT, NU_START) )
    {
        NU_StackFree(pStackStartAddress);
        VOS_TaskCtrlBlkFree(iTid);
        VOS_SetErrorNo(VOS_ERRNO_TASK_CREATE_OSALCREATEFAIL);
        return( VOS_ERRNO_TASK_CREATE_OSALCREATEFAIL );
    }

    *pulTaskID = iTid;

    return VOS_OK;
}