/***************************************************************************** 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, ¶m)) { 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; }