los_task.c半成

danwanhao_branch
dancer 2 years ago
parent 4d8d4f01e8
commit abea0ef5fc

@ -68,13 +68,83 @@
#if (LOSCFG_BASE_CORE_TSK_LIMIT <= 0) #if (LOSCFG_BASE_CORE_TSK_LIMIT <= 0)
#error "task maxnum cannot be zero" #error "task maxnum cannot be zero"
#endif /* LOSCFG_BASE_CORE_TSK_LIMIT <= 0 */ #endif /* LOSCFG_BASE_CORE_TSK_LIMIT <= 0 */
/*
LITE_OS_SEC_BSS LosTaskCB *g_taskCBArray;
LITE_OS_SEC_BSS LOS_DL_LIST g_losFreeTask; 使CPU
LITE_OS_SEC_BSS LOS_DL_LIST g_taskRecycleList; 使
LITE_OS_SEC_BSS UINT32 g_taskMaxNum;
线
32[0-31]031
ReadyCPU
Running
Blockedsuspenddelay
退Dead
退
退退退
InvalidInvalid退
退
退
ID
IDID
ID
使
Huawei LiteOS便
TCB
(TCB)TCBstack pointer
IDTCB
*/
LITE_OS_SEC_BSS LosTaskCB *g_taskCBArray;//任务池 128个
LITE_OS_SEC_BSS LOS_DL_LIST g_losFreeTask;//空闲任务链表
LITE_OS_SEC_BSS LOS_DL_LIST g_taskRecycleList;//回收任务链表
LITE_OS_SEC_BSS UINT32 g_taskMaxNum;//任务最大个数
LITE_OS_SEC_BSS UINT32 g_taskScheduled; /* one bit for each cores */ LITE_OS_SEC_BSS UINT32 g_taskScheduled; /* one bit for each cores */
LITE_OS_SEC_BSS EVENT_CB_S g_resourceEvent; LITE_OS_SEC_BSS EVENT_CB_S g_resourceEvent;//资源的事件
/* spinlock for task module, only available on SMP mode */ /* spinlock for task module, only available on SMP mode */
LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_taskSpin); LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_taskSpin);
@ -82,7 +152,7 @@ STATIC VOID OsConsoleIDSetHook(UINT32 param1,
UINT32 param2) __attribute__((weakref("OsSetConsoleID"))); UINT32 param2) __attribute__((weakref("OsSetConsoleID")));
/* temp task blocks for booting procedure */ /* temp task blocks for booting procedure */
LITE_OS_SEC_BSS STATIC LosTaskCB g_mainTask[LOSCFG_KERNEL_CORE_NUM]; LITE_OS_SEC_BSS STATIC LosTaskCB g_mainTask[LOSCFG_KERNEL_CORE_NUM];//启动引导过程中使用的临时任务
LosTaskCB *OsGetMainTask(VOID) LosTaskCB *OsGetMainTask(VOID)
{ {
@ -92,23 +162,23 @@ LosTaskCB *OsGetMainTask(VOID)
VOID OsSetMainTask(VOID) VOID OsSetMainTask(VOID)
{ {
UINT32 i; UINT32 i;
CHAR *name = "osMain"; CHAR *name = "osMain";//任务名称
SchedParam schedParam = { 0 }; SchedParam schedParam = { 0 };
schedParam.policy = LOS_SCHED_RR; schedParam.policy = LOS_SCHED_RR;
schedParam.basePrio = OS_PROCESS_PRIORITY_HIGHEST; schedParam.basePrio = OS_PROCESS_PRIORITY_HIGHEST;
schedParam.priority = OS_TASK_PRIORITY_LOWEST; schedParam.priority = OS_TASK_PRIORITY_LOWEST;
//为每个CPU core 设置mainTask
for (i = 0; i < LOSCFG_KERNEL_CORE_NUM; i++) { for (i = 0; i < LOSCFG_KERNEL_CORE_NUM; i++) {
g_mainTask[i].taskStatus = OS_TASK_STATUS_UNUSED; g_mainTask[i].taskStatus = OS_TASK_STATUS_UNUSED;
g_mainTask[i].taskID = LOSCFG_BASE_CORE_TSK_LIMIT; g_mainTask[i].taskID = LOSCFG_BASE_CORE_TSK_LIMIT;//128
g_mainTask[i].processCB = OS_KERNEL_PROCESS_GROUP; g_mainTask[i].processCB = OS_KERNEL_PROCESS_GROUP;
#ifdef LOSCFG_KERNEL_SMP_LOCKDEP #ifdef LOSCFG_KERNEL_SMP_LOCKDEP
g_mainTask[i].lockDep.lockDepth = 0; g_mainTask[i].lockDep.lockDepth = 0;
g_mainTask[i].lockDep.waitLock = NULL; g_mainTask[i].lockDep.waitLock = NULL;
#endif #endif
(VOID)strncpy_s(g_mainTask[i].taskName, OS_TCB_NAME_LEN, name, OS_TCB_NAME_LEN - 1); (VOID)strncpy_s(g_mainTask[i].taskName, OS_TCB_NAME_LEN, name, OS_TCB_NAME_LEN - 1);
LOS_ListInit(&g_mainTask[i].lockList); LOS_ListInit(&g_mainTask[i].lockList);//初始化任务锁链表,上面挂的是任务已申请到的互斥锁
(VOID)OsSchedParamInit(&g_mainTask[i], schedParam.policy, &schedParam, NULL); (VOID)OsSchedParamInit(&g_mainTask[i], schedParam.policy, &schedParam, NULL);
} }
} }
@ -122,31 +192,34 @@ VOID OsSetMainTaskProcess(UINTPTR processCB)
#endif #endif
} }
} }
//空闲任务每个CPU都有自己的空闲任务
LITE_OS_SEC_TEXT WEAK VOID OsIdleTask(VOID) LITE_OS_SEC_TEXT WEAK VOID OsIdleTask(VOID)
{ {
while (1) { while (1) {//只有一个死循环
WFI; WFI;//WFI指令arm core立即进入low-power standly state,进入休眠模式,等待中断
} }
} }
VOID OsTaskInsertToRecycleList(LosTaskCB *taskCB) VOID OsTaskInsertToRecycleList(LosTaskCB *taskCB)
{ {
LOS_ListTailInsert(&g_taskRecycleList, &taskCB->pendList); LOS_ListTailInsert(&g_taskRecycleList, &taskCB->pendList);//将任务挂入回收链表,等待回收
} }
/*
taskOS_TCB_FROM_PENDLISTLOS_DL_LISTLosTaskCB,
task
*/
LITE_OS_SEC_TEXT_INIT VOID OsTaskJoinPostUnsafe(LosTaskCB *taskCB) LITE_OS_SEC_TEXT_INIT VOID OsTaskJoinPostUnsafe(LosTaskCB *taskCB)
{ {
if (taskCB->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) { if (taskCB->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) {//join任务处理
if (!LOS_ListEmpty(&taskCB->joinList)) { if (!LOS_ListEmpty(&taskCB->joinList)) {//joinList中的节点身上都有阻塞标签
LosTaskCB *resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(taskCB->joinList))); LosTaskCB *resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(taskCB->joinList)));//通过贴有JOIN标签链表的第一个节点找到Task
OsTaskWakeClearPendMask(resumedTask); OsTaskWakeClearPendMask(resumedTask);//清除任务的挂起标记
resumedTask->ops->wake(resumedTask); resumedTask->ops->wake(resumedTask);
} }
} }
taskCB->taskStatus |= OS_TASK_STATUS_EXIT; taskCB->taskStatus |= OS_TASK_STATUS_EXIT;//贴上任务退出标签
} }
//挂起任务任务进入等待链表Join代表是支持通过的第一个任务去唤醒其他的任务
LITE_OS_SEC_TEXT UINT32 OsTaskJoinPendUnsafe(LosTaskCB *taskCB) LITE_OS_SEC_TEXT UINT32 OsTaskJoinPendUnsafe(LosTaskCB *taskCB)
{ {
if (taskCB->taskStatus & OS_TASK_STATUS_INIT) { if (taskCB->taskStatus & OS_TASK_STATUS_INIT) {
@ -165,13 +238,13 @@ LITE_OS_SEC_TEXT UINT32 OsTaskJoinPendUnsafe(LosTaskCB *taskCB)
return LOS_EINVAL; return LOS_EINVAL;
} }
//任务设置分离模式Deatch和JOIN是一对有你没我的状态
LITE_OS_SEC_TEXT UINT32 OsTaskSetDetachUnsafe(LosTaskCB *taskCB) LITE_OS_SEC_TEXT UINT32 OsTaskSetDetachUnsafe(LosTaskCB *taskCB)
{ {
if (taskCB->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) { if (taskCB->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) {//join状态时
if (LOS_ListEmpty(&(taskCB->joinList))) { if (LOS_ListEmpty(&(taskCB->joinList))) {//joinlist中没有数据了
LOS_ListDelete(&(taskCB->joinList)); LOS_ListDelete(&(taskCB->joinList));//所谓删除就是自己指向自己
taskCB->taskStatus &= ~OS_TASK_FLAG_PTHREAD_JOIN; taskCB->taskStatus &= ~OS_TASK_FLAG_PTHREAD_JOIN;//去掉JOIN标签
return LOS_OK; return LOS_OK;
} }
/* This error code has a special purpose and is not allowed to appear again on the interface */ /* This error code has a special purpose and is not allowed to appear again on the interface */
@ -181,39 +254,40 @@ LITE_OS_SEC_TEXT UINT32 OsTaskSetDetachUnsafe(LosTaskCB *taskCB)
return LOS_EINVAL; return LOS_EINVAL;
} }
//初始化任务模块
LITE_OS_SEC_TEXT_INIT UINT32 OsTaskInit(UINTPTR processCB) LITE_OS_SEC_TEXT_INIT UINT32 OsTaskInit(UINTPTR processCB)
{ {
UINT32 index; UINT32 index;
UINT32 size; UINT32 size;
UINT32 ret; UINT32 ret;
g_taskMaxNum = LOSCFG_BASE_CORE_TSK_LIMIT; g_taskMaxNum = LOSCFG_BASE_CORE_TSK_LIMIT;//任务池中最多默认128个可谓铁打的任务池流水的线程
size = (g_taskMaxNum + 1) * sizeof(LosTaskCB); size = (g_taskMaxNum + 1) * sizeof(LosTaskCB);//计算需分配内存总大小
/* /*
* This memory is resident memory and is used to save the system resources * This memory is resident memory and is used to save the system resources
* of task control block and will not be freed. * of task control block and will not be freed.
*/ */
g_taskCBArray = (LosTaskCB *)LOS_MemAlloc(m_aucSysMem0, size); g_taskCBArray = (LosTaskCB *)LOS_MemAlloc(m_aucSysMem0, size);//任务池常驻内存,不被释放
if (g_taskCBArray == NULL) { if (g_taskCBArray == NULL) {
ret = LOS_ERRNO_TSK_NO_MEMORY; ret = LOS_ERRNO_TSK_NO_MEMORY;
goto EXIT; goto EXIT;
} }
(VOID)memset_s(g_taskCBArray, size, 0, size); (VOID)memset_s(g_taskCBArray, size, 0, size);
LOS_ListInit(&g_losFreeTask); LOS_ListInit(&g_losFreeTask);//初始化空闲任务链表
LOS_ListInit(&g_taskRecycleList); LOS_ListInit(&g_taskRecycleList);//初始化回收任务链表
for (index = 0; index < g_taskMaxNum; index++) { for (index = 0; index < g_taskMaxNum; index++) {//任务挨个初始化
g_taskCBArray[index].taskStatus = OS_TASK_STATUS_UNUSED; g_taskCBArray[index].taskStatus = OS_TASK_STATUS_UNUSED;//默认未使用,
g_taskCBArray[index].taskID = index; g_taskCBArray[index].taskID = index;//任务ID[0~g_taskMaxNum-1]
g_taskCBArray[index].processCB = processCB; g_taskCBArray[index].processCB = processCB;
LOS_ListTailInsert(&g_losFreeTask, &g_taskCBArray[index].pendList); LOS_ListTailInsert(&g_losFreeTask, &g_taskCBArray[index].pendList);//通过pendlist节点插入空闲任务列表
} }//注意这里挂的是pendList节点可以取TCB也要通过OS_TCB_FROM-PENDLIST取
g_taskCBArray[index].taskStatus = OS_TASK_STATUS_UNUSED; g_taskCBArray[index].taskStatus = OS_TASK_STATUS_UNUSED;
g_taskCBArray[index].taskID = index; g_taskCBArray[index].taskID = index;
g_taskCBArray[index].processCB = processCB; g_taskCBArray[index].processCB = processCB;
ret = OsSchedInit(); ret = OsSchedInit();//调度器初始化
EXIT: EXIT:
if (ret != LOS_OK) { if (ret != LOS_OK) {
@ -221,41 +295,41 @@ EXIT:
} }
return ret; return ret;
} }
//获取IdletaskId每个CPU核都对Task进行了内部管理做到真正的并行处理
UINT32 OsGetIdleTaskId(VOID) UINT32 OsGetIdleTaskId(VOID)
{ {
return OsSchedRunqueueIdleGet()->taskID; return OsSchedRunqueueIdleGet()->taskID;
} }
//创建一个空闲任务
LITE_OS_SEC_TEXT_INIT UINT32 OsIdleTaskCreate(UINTPTR processID) LITE_OS_SEC_TEXT_INIT UINT32 OsIdleTaskCreate(UINTPTR processID)
{ {
UINT32 ret; UINT32 ret;
TSK_INIT_PARAM_S taskInitParam; TSK_INIT_PARAM_S taskInitParam;
UINT32 idleTaskID; UINT32 idleTaskID;
(VOID)memset_s((VOID *)(&taskInitParam), sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S)); (VOID)memset_s((VOID *)(&taskInitParam), sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));//任务初始参数清零
taskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)OsIdleTask; taskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)OsIdleTask;//入口函数
taskInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE; taskInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE;//任务栈大小 2K
taskInitParam.pcName = "Idle"; taskInitParam.pcName = "Idle";//任务名称叫pcNAME
taskInitParam.policy = LOS_SCHED_IDLE; taskInitParam.policy = LOS_SCHED_IDLE;
taskInitParam.usTaskPrio = OS_TASK_PRIORITY_LOWEST; taskInitParam.usTaskPrio = OS_TASK_PRIORITY_LOWEST;//默认最低优先级31
taskInitParam.processID = processID; taskInitParam.processID = processID;
#ifdef LOSCFG_KERNEL_SMP #ifdef LOSCFG_KERNEL_SMP
taskInitParam.usCpuAffiMask = CPUID_TO_AFFI_MASK(ArchCurrCpuid()); taskInitParam.usCpuAffiMask = CPUID_TO_AFFI_MASK(ArchCurrCpuid());//每个idle任务只在单独的CPU上运行
#endif #endif
ret = LOS_TaskCreateOnly(&idleTaskID, &taskInitParam); ret = LOS_TaskCreateOnly(&idleTaskID, &taskInitParam);
if (ret != LOS_OK) { if (ret != LOS_OK) {
return ret; return ret;
} }
LosTaskCB *idleTask = OS_TCB_FROM_TID(idleTaskID); LosTaskCB *idleTask = OS_TCB_FROM_TID(idleTaskID);
idleTask->taskStatus |= OS_TASK_FLAG_SYSTEM_TASK; idleTask->taskStatus |= OS_TASK_FLAG_SYSTEM_TASK;//标记为系统任务idle任务是给CPU休息用的当然是个系统任务
OsSchedRunqueueIdleInit(idleTask); OsSchedRunqueueIdleInit(idleTask);
return LOS_TaskResume(idleTaskID); return LOS_TaskResume(idleTaskID);
} }
/* /*
* Description : get id of current running task. * Description : get id of current running task. |CPUID
* Return : task id * Return : task id
*/ */
LITE_OS_SEC_TEXT UINT32 LOS_CurTaskIDGet(VOID) LITE_OS_SEC_TEXT UINT32 LOS_CurTaskIDGet(VOID)
@ -267,7 +341,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_CurTaskIDGet(VOID)
} }
return runTask->taskID; return runTask->taskID;
} }
//创建指定任务同步信号量
STATIC INLINE UINT32 TaskSyncCreate(LosTaskCB *taskCB) STATIC INLINE UINT32 TaskSyncCreate(LosTaskCB *taskCB)
{ {
#ifdef LOSCFG_KERNEL_SMP_TASK_SYNC #ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
@ -280,7 +354,7 @@ STATIC INLINE UINT32 TaskSyncCreate(LosTaskCB *taskCB)
#endif #endif
return LOS_OK; return LOS_OK;
} }
//销毁指定任务同步信号量
STATIC INLINE VOID OsTaskSyncDestroy(UINT32 syncSignal) STATIC INLINE VOID OsTaskSyncDestroy(UINT32 syncSignal)
{ {
#ifdef LOSCFG_KERNEL_SMP_TASK_SYNC #ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
@ -291,6 +365,7 @@ STATIC INLINE VOID OsTaskSyncDestroy(UINT32 syncSignal)
} }
#ifdef LOSCFG_KERNEL_SMP #ifdef LOSCFG_KERNEL_SMP
//任务同步等待,通过信号量保持同步
STATIC INLINE UINT32 OsTaskSyncWait(const LosTaskCB *taskCB) STATIC INLINE UINT32 OsTaskSyncWait(const LosTaskCB *taskCB)
{ {
#ifdef LOSCFG_KERNEL_SMP_TASK_SYNC #ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
@ -316,7 +391,7 @@ STATIC INLINE UINT32 OsTaskSyncWait(const LosTaskCB *taskCB)
#endif #endif
} }
#endif #endif
//同步唤醒
STATIC INLINE VOID OsTaskSyncWake(const LosTaskCB *taskCB) STATIC INLINE VOID OsTaskSyncWake(const LosTaskCB *taskCB)
{ {
#ifdef LOSCFG_KERNEL_SMP_TASK_SYNC #ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
@ -338,14 +413,14 @@ STATIC INLINE VOID OsInsertTCBToFreeList(LosTaskCB *taskCB)
taskCB->taskStatus = OS_TASK_STATUS_UNUSED; taskCB->taskStatus = OS_TASK_STATUS_UNUSED;
LOS_ListAdd(&g_losFreeTask, &taskCB->pendList); LOS_ListAdd(&g_losFreeTask, &taskCB->pendList);
} }
//释放任务在内核状态下占用的资源
STATIC VOID OsTaskKernelResourcesToFree(UINT32 syncSignal, UINTPTR topOfStack) STATIC VOID OsTaskKernelResourcesToFree(UINT32 syncSignal, UINTPTR topOfStack)
{ {
OsTaskSyncDestroy(syncSignal); OsTaskSyncDestroy(syncSignal);//任务销毁,同步信息
(VOID)LOS_MemFree((VOID *)m_aucSysMem1, (VOID *)topOfStack); (VOID)LOS_MemFree((VOID *)m_aucSysMem1, (VOID *)topOfStack);//释放内核态空间
} }
//释放任务资源
STATIC VOID OsTaskResourcesToFree(LosTaskCB *taskCB) STATIC VOID OsTaskResourcesToFree(LosTaskCB *taskCB)
{ {
UINT32 syncSignal = LOSCFG_BASE_IPC_SEM_LIMIT; UINT32 syncSignal = LOSCFG_BASE_IPC_SEM_LIMIT;
@ -353,7 +428,7 @@ STATIC VOID OsTaskResourcesToFree(LosTaskCB *taskCB)
UINTPTR topOfStack; UINTPTR topOfStack;
#ifdef LOSCFG_KERNEL_VM #ifdef LOSCFG_KERNEL_VM
if ((taskCB->taskStatus & OS_TASK_FLAG_USER_MODE) && (taskCB->userMapBase != 0)) { if ((taskCB->taskStatus & OS_TASK_FLAG_USER_MODE) && (taskCB->userMapBase != 0)) {//释放用户态栈
SCHEDULER_LOCK(intSave); SCHEDULER_LOCK(intSave);
UINT32 mapBase = (UINTPTR)taskCB->userMapBase; UINT32 mapBase = (UINTPTR)taskCB->userMapBase;
UINT32 mapSize = taskCB->userMapSize; UINT32 mapSize = taskCB->userMapSize;
@ -363,7 +438,7 @@ STATIC VOID OsTaskResourcesToFree(LosTaskCB *taskCB)
LosProcessCB *processCB = OS_PCB_FROM_TCB(taskCB); LosProcessCB *processCB = OS_PCB_FROM_TCB(taskCB);
LOS_ASSERT(!(OsProcessVmSpaceGet(processCB) == NULL)); LOS_ASSERT(!(OsProcessVmSpaceGet(processCB) == NULL));
UINT32 ret = OsUnMMap(OsProcessVmSpaceGet(processCB), (UINTPTR)mapBase, mapSize); UINT32 ret = OsUnMMap(OsProcessVmSpaceGet(processCB), (UINTPTR)mapBase, mapSize);//解除映射
if ((ret != LOS_OK) && (mapBase != 0) && !OsProcessIsInit(processCB)) { if ((ret != LOS_OK) && (mapBase != 0) && !OsProcessIsInit(processCB)) {
PRINT_ERR("process(%u) unmmap user task(%u) stack failed! mapbase: 0x%x size :0x%x, error: %d\n", PRINT_ERR("process(%u) unmmap user task(%u) stack failed! mapbase: 0x%x size :0x%x, error: %d\n",
processCB->processID, taskCB->taskID, mapBase, mapSize, ret); processCB->processID, taskCB->taskID, mapBase, mapSize, ret);
@ -375,36 +450,36 @@ STATIC VOID OsTaskResourcesToFree(LosTaskCB *taskCB)
} }
#endif #endif
if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) {//任务还未使用情况
topOfStack = taskCB->topOfStack; topOfStack = taskCB->topOfStack;
taskCB->topOfStack = 0; taskCB->topOfStack = 0;
#ifdef LOSCFG_KERNEL_SMP_TASK_SYNC #ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
syncSignal = taskCB->syncSignal; syncSignal = taskCB->syncSignal;
taskCB->syncSignal = LOSCFG_BASE_IPC_SEM_LIMIT; taskCB->syncSignal = LOSCFG_BASE_IPC_SEM_LIMIT;
#endif #endif
OsTaskKernelResourcesToFree(syncSignal, topOfStack); OsTaskKernelResourcesToFree(syncSignal, topOfStack);//释放内核所占内存,即内核栈的栈空间
SCHEDULER_LOCK(intSave); SCHEDULER_LOCK(intSave);
#ifdef LOSCFG_KERNEL_VM #ifdef LOSCFG_KERNEL_VM
OsClearSigInfoTmpList(&(taskCB->sig)); OsClearSigInfoTmpList(&(taskCB->sig));//归还信号控制块的内存
#endif #endif
OsInsertTCBToFreeList(taskCB); OsInsertTCBToFreeList(taskCB);
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
} }
return; return;
} }
//批量回收任务
LITE_OS_SEC_TEXT VOID OsTaskCBRecycleToFree(void) LITE_OS_SEC_TEXT VOID OsTaskCBRecycleToFree(void)
{ {
UINT32 intSave; UINT32 intSave;
SCHEDULER_LOCK(intSave); SCHEDULER_LOCK(intSave);
while (!LOS_ListEmpty(&g_taskRecycleList)) { while (!LOS_ListEmpty(&g_taskRecycleList)) {//遍历回收链表
LosTaskCB *taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&g_taskRecycleList)); LosTaskCB *taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&g_taskRecycleList));//取出任务
LOS_ListDelete(&taskCB->pendList); LOS_ListDelete(&taskCB->pendList);//重置节点
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
OsTaskResourcesToFree(taskCB); OsTaskResourcesToFree(taskCB);//释放任务所占资源
SCHEDULER_LOCK(intSave); SCHEDULER_LOCK(intSave);
} }
@ -414,7 +489,7 @@ LITE_OS_SEC_TEXT VOID OsTaskCBRecycleToFree(void)
/* /*
* Description : All task entry * Description : All task entry
* Input : taskID --- The ID of the task to be run * Input : taskID --- The ID of the task to be run
*/ *///所有任务的入口函数OsTaskEntry是new task OsTaskStackInit时指定的
LITE_OS_SEC_TEXT_INIT VOID OsTaskEntry(UINT32 taskID) LITE_OS_SEC_TEXT_INIT VOID OsTaskEntry(UINT32 taskID)
{ {
LOS_ASSERT(!OS_TID_CHECK_INVALID(taskID)); LOS_ASSERT(!OS_TID_CHECK_INVALID(taskID));
@ -424,19 +499,19 @@ LITE_OS_SEC_TEXT_INIT VOID OsTaskEntry(UINT32 taskID)
* from interrupt and other cores. release task spinlock and enable * from interrupt and other cores. release task spinlock and enable
* interrupt in sequence at the task entry. * interrupt in sequence at the task entry.
*/ */
LOS_SpinUnlock(&g_taskSpin); LOS_SpinUnlock(&g_taskSpin);//释放任务自旋锁
(VOID)LOS_IntUnLock(); (VOID)LOS_IntUnLock();//恢复中断
LosTaskCB *taskCB = OS_TCB_FROM_TID(taskID); LosTaskCB *taskCB = OS_TCB_FROM_TID(taskID);
taskCB->joinRetval = taskCB->taskEntry(taskCB->args[0], taskCB->args[1], taskCB->joinRetval = taskCB->taskEntry(taskCB->args[0], taskCB->args[1],//调出任务的入口函数
taskCB->args[2], taskCB->args[3]); /* 2 & 3: just for args array index */ taskCB->args[2], taskCB->args[3]); /* 2 & 3: just for args array index */
if (!(taskCB->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN)) { if (!(taskCB->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN)) {
taskCB->joinRetval = 0; taskCB->joinRetval = 0;//结合数为0
} }
OsRunningTaskToExit(taskCB, 0); OsRunningTaskToExit(taskCB, 0);
} }
//任务创建参数检查
STATIC UINT32 TaskCreateParamCheck(const UINT32 *taskID, TSK_INIT_PARAM_S *initParam) STATIC UINT32 TaskCreateParamCheck(const UINT32 *taskID, TSK_INIT_PARAM_S *initParam)
{ {
UINT32 poolSize = OS_SYS_MEM_SIZE; UINT32 poolSize = OS_SYS_MEM_SIZE;
@ -455,19 +530,19 @@ STATIC UINT32 TaskCreateParamCheck(const UINT32 *taskID, TSK_INIT_PARAM_S *initP
} }
} }
if (initParam->pfnTaskEntry == NULL) { if (initParam->pfnTaskEntry == NULL) {//入口函数不能为空
return LOS_ERRNO_TSK_ENTRY_NULL; return LOS_ERRNO_TSK_ENTRY_NULL;
} }
if (initParam->usTaskPrio > OS_TASK_PRIORITY_LOWEST) { if (initParam->usTaskPrio > OS_TASK_PRIORITY_LOWEST) {//优先级必须大于31
return LOS_ERRNO_TSK_PRIOR_ERROR; return LOS_ERRNO_TSK_PRIOR_ERROR;
} }
if (initParam->uwStackSize > poolSize) { if (initParam->uwStackSize > poolSize) {//希望申请的栈大小不能大于总池子
return LOS_ERRNO_TSK_STKSZ_TOO_LARGE; return LOS_ERRNO_TSK_STKSZ_TOO_LARGE;
} }
if (initParam->uwStackSize == 0) { if (initParam->uwStackSize == 0) {//任何任务都必须由内核态栈所以uwStackSize不能为0
initParam->uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; initParam->uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
} }
initParam->uwStackSize = (UINT32)ALIGN(initParam->uwStackSize, LOSCFG_STACK_POINT_ALIGN_SIZE); initParam->uwStackSize = (UINT32)ALIGN(initParam->uwStackSize, LOSCFG_STACK_POINT_ALIGN_SIZE);

Loading…
Cancel
Save