diff --git a/apps/shell/src/shcmdparse.c b/apps/shell/src/shcmdparse.c index 1a9bc75e1b96e435dcd6d70976fb240bbb9ff3eb..65b4440c3bd7ebaff2dbb3b506ca9906b609303f 100644 --- a/apps/shell/src/shcmdparse.c +++ b/apps/shell/src/shcmdparse.c @@ -148,7 +148,7 @@ unsigned int OsCmdTokenSplit(char *cmdStr, char split, CmdParsed *cmdParsed) return ret; } - +//cmd命令解析 unsigned int OsCmdParse(char *cmdStr, CmdParsed *cmdParsed) { if ((cmdStr == NULL) || (cmdParsed == NULL) || (strlen(cmdStr) == 0)) { diff --git a/arch/arm/arm/include/arch_config.h b/arch/arm/arm/include/arch_config.h index cd10ccb71e35fa2082b42930fdbe1d957078765d..bc3196f2cbb5ca023e517799c1c572d5daf20406 100644 --- a/arch/arm/arm/include/arch_config.h +++ b/arch/arm/arm/include/arch_config.h @@ -66,7 +66,7 @@ /* Initial bit32 stack value. */ #define OS_STACK_INIT 0xCACACACA //栈指针初始化值 0b 1010 1010 1010 /* Bit32 stack top magic number. */ -#define OS_STACK_MAGIC_WORD 0xCCCCCCCC //用于栈顶值,可标识为栈是否被使用过,神奇的 "烫烫烫烫"的根源所在! 0b 1100 1100 1100 +#define OS_STACK_MAGIC_WORD 0xCCCCCCCC //用于栈顶值,可标识为栈是否被溢出过,神奇的 "烫烫烫烫"的根源所在! 0b 1100 1100 1100 /*************************************************************************** @note_pic * 鸿蒙虚拟内存-栈空间运行时图 * 鸿蒙源码分析系列篇: https://blog.csdn.net/kuangyufei diff --git a/compat/posix/src/pthread.c b/compat/posix/src/pthread.c index 372fbe56165fe38ffe05a1edee2f55924daa1d5e..af8b3ab7a043bdd955266f3068869d45f76208bd 100644 --- a/compat/posix/src/pthread.c +++ b/compat/posix/src/pthread.c @@ -218,7 +218,7 @@ STATIC UINT32 InitPthreadData(pthread_t threadID, pthread_attr_t *userAttr, SetPthreadDataAttr(userAttr, threadID, taskCB, created); return ret; } - +//POSIX 创建线程接口 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*startRoutine)(void *), void *arg) { diff --git a/compat/posix/src/pthread_attr.c b/compat/posix/src/pthread_attr.c index ec3764be65933f56deefcfb232ec5b3be741c122..ef888b077827346984390baca4ad14e7037d9602 100644 --- a/compat/posix/src/pthread_attr.c +++ b/compat/posix/src/pthread_attr.c @@ -37,7 +37,7 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ - +//现实 POSIX thread 接口 int pthread_attr_init(pthread_attr_t *attr) { if (attr == NULL) { @@ -46,13 +46,13 @@ int pthread_attr_init(pthread_attr_t *attr) attr->detachstate = PTHREAD_CREATE_JOINABLE; attr->schedpolicy = SCHED_RR; - attr->schedparam.sched_priority = LOSCFG_BASE_CORE_TSK_DEFAULT_PRIO; + attr->schedparam.sched_priority = LOSCFG_BASE_CORE_TSK_DEFAULT_PRIO;//默认线程优先级 attr->inheritsched = PTHREAD_INHERIT_SCHED; attr->scope = PTHREAD_SCOPE_PROCESS; attr->stackaddr_set = 0; attr->stackaddr = NULL; attr->stacksize_set = 1; - attr->stacksize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; + attr->stacksize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;//栈的大小 默认16K #if (LOSCFG_KERNEL_SMP == YES) attr->cpuset.__bits[0] = 0; diff --git a/kernel/base/core/los_sortlink.c b/kernel/base/core/los_sortlink.c index 590978b8ce2b4a5fe8e5d0392f59f2ef2332adfe..77f38266981f1129e9a98e722df442caa407944a 100644 --- a/kernel/base/core/los_sortlink.c +++ b/kernel/base/core/los_sortlink.c @@ -76,33 +76,33 @@ LITE_OS_SEC_TEXT VOID OsAdd2SortLink(const SortLinkAttribute *sortLinkHeader, So SET_SORTLIST_VALUE(sortList, OS_TSK_MAX_ROLLNUM); } timeout = sortList->idxRollNum; - sortIndex = timeout & OS_TSK_SORTLINK_MASK; + sortIndex = timeout & OS_TSK_SORTLINK_MASK;// 决定放在哪个链表中 rollNum = (timeout >> OS_TSK_SORTLINK_LOGLEN) + 1; if (sortIndex == 0) { rollNum--; } - EVALUATE_L(sortList->idxRollNum, rollNum); - sortIndex = sortIndex + sortLinkHeader->cursor; - sortIndex = sortIndex & OS_TSK_SORTLINK_MASK; - EVALUATE_H(sortList->idxRollNum, sortIndex); - - listObject = sortLinkHeader->sortLink + sortIndex; - if (listObject->pstNext == listObject) { - LOS_ListTailInsert(listObject, &sortList->sortLinkNode); + EVALUATE_L(sortList->idxRollNum, rollNum);//计算idxRollNum的低位 + sortIndex = sortIndex + sortLinkHeader->cursor;//通过游标确定最终链表位置 + sortIndex = sortIndex & OS_TSK_SORTLINK_MASK;//sortIndex不能大于OS_TSK_SORTLINK_MASK + EVALUATE_H(sortList->idxRollNum, sortIndex);//计算idxRollNum的高位 + + listObject = sortLinkHeader->sortLink + sortIndex;//找到最终要挂入的链表 + if (listObject->pstNext == listObject) {//为空时 + LOS_ListTailInsert(listObject, &sortList->sortLinkNode);//直接挂上去 } else { - listSorted = LOS_DL_LIST_ENTRY(listObject->pstNext, SortLinkList, sortLinkNode); + listSorted = LOS_DL_LIST_ENTRY(listObject->pstNext, SortLinkList, sortLinkNode);//取出SortLinkList do { - if (ROLLNUM(listSorted->idxRollNum) <= ROLLNUM(sortList->idxRollNum)) { + if (ROLLNUM(listSorted->idxRollNum) <= ROLLNUM(sortList->idxRollNum)) {// @note_? 这块没看懂,谁能帮帮我 ROLLNUM_SUB(sortList->idxRollNum, listSorted->idxRollNum); } else { ROLLNUM_SUB(listSorted->idxRollNum, sortList->idxRollNum); break; } - listSorted = LOS_DL_LIST_ENTRY(listSorted->sortLinkNode.pstNext, SortLinkList, sortLinkNode); - } while (&listSorted->sortLinkNode != listObject); + listSorted = LOS_DL_LIST_ENTRY(listSorted->sortLinkNode.pstNext, SortLinkList, sortLinkNode);//取下一个 + } while (&listSorted->sortLinkNode != listObject);//一直查询直到回到起点位置 - LOS_ListTailInsert(&listSorted->sortLinkNode, &sortList->sortLinkNode); + LOS_ListTailInsert(&listSorted->sortLinkNode, &sortList->sortLinkNode);//插入链表 } } @@ -144,7 +144,7 @@ LITE_OS_SEC_TEXT VOID OsDeleteSortLink(const SortLinkAttribute *sortLinkHeader, } LOS_ListDelete(&sortList->sortLinkNode); } - +//计算超时时间 LITE_OS_SEC_TEXT STATIC UINT32 OsCalcExpierTime(UINT32 rollNum, UINT32 sortIndex, UINT16 curSortIndex) { UINT32 expireTime; @@ -157,7 +157,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 OsCalcExpierTime(UINT32 rollNum, UINT32 sortIndex expireTime = ((rollNum - 1) << OS_TSK_SORTLINK_LOGLEN) + sortIndex; return expireTime; } - +//从sortLink中获取下一个过期时间 LITE_OS_SEC_TEXT UINT32 OsSortLinkGetNextExpireTime(const SortLinkAttribute *sortLinkHeader) { UINT16 cursor; diff --git a/kernel/base/core/los_swtmr.c b/kernel/base/core/los_swtmr.c index d7cf92497d74cf5b35ab9e88900eabf3a3baf35e..ca6d4a092e921c1e678cde484d24397f2a78b3a5 100644 --- a/kernel/base/core/los_swtmr.c +++ b/kernel/base/core/los_swtmr.c @@ -81,7 +81,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrTaskCreate(VOID) TSK_INIT_PARAM_S swtmrTask; UINT32 cpuid = ArchCurrCpuid();//获取当前CPU id - (VOID)memset_s(&swtmrTask, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S)); + (VOID)memset_s(&swtmrTask, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));//清0 swtmrTask.pfnTaskEntry = (TSK_ENTRY_FUNC)OsSwtmrTask;//入口函数 swtmrTask.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;//16K默认内核任务栈 swtmrTask.pcName = "Swt_Task";//任务名称 @@ -98,12 +98,12 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrTaskCreate(VOID) return ret; } -//软时钟回收 +//回收指定进程的软时钟 LITE_OS_SEC_TEXT_INIT VOID OsSwtmrRecycle(UINT32 processID) { - for (UINT16 index = 0; index < LOSCFG_BASE_CORE_SWTMR_LIMIT; index++) { - if (g_swtmrCBArray[index].uwOwnerPid == processID) { - LOS_SwtmrDelete(index); + for (UINT16 index = 0; index < LOSCFG_BASE_CORE_SWTMR_LIMIT; index++) {//一个进程往往会有多个定时器 + if (g_swtmrCBArray[index].uwOwnerPid == processID) {//找到一个 + LOS_SwtmrDelete(index);//删除定时器 } } } @@ -213,7 +213,7 @@ LITE_OS_SEC_TEXT VOID OsSwtmrScan(VOID)//扫描定时器,如果碰到超时的, swtmrSortLink->cursor = (swtmrSortLink->cursor + 1) & OS_TSK_SORTLINK_MASK; listObject = swtmrSortLink->sortLink + swtmrSortLink->cursor; - + //由于swtmr是在特定的sortlink中,所以需要很小心的处理它,但其他CPU Core仍然有机会处理它,比如停止计时器 /* * it needs to be carefully coped with, since the swtmr is in specific sortlink * while other cores still has the chance to process it, like stop the timer. @@ -271,7 +271,7 @@ LITE_OS_SEC_TEXT VOID OsSwtmrScan(VOID)//扫描定时器,如果碰到超时的, * Description: Get next timeout * Return : Count of the Timer list */ -LITE_OS_SEC_TEXT UINT32 OsSwtmrGetNextTimeout(VOID) +LITE_OS_SEC_TEXT UINT32 OsSwtmrGetNextTimeout(VOID)//获取下一个timeout { return OsSortLinkGetNextExpireTime(&OsPercpuGet()->swtmrSortLink); } @@ -519,7 +519,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrDelete(UINT16 swtmrID) case OS_SWTMR_STATUS_UNUSED: ret = LOS_ERRNO_SWTMR_NOT_CREATED; break; - case OS_SWTMR_STATUS_TICKING://正在计数就先停止 + case OS_SWTMR_STATUS_TICKING://正在计数就先停止再删除,这里没有break; OsSwtmrStop(swtmr); /* fall-through */ case OS_SWTMR_STATUS_CREATED://再删除定时器 diff --git a/kernel/base/core/los_task.c b/kernel/base/core/los_task.c index fdc4e4b96b812c06c3c132ba4f22b1ffe754bad2..65b745f128c4450ae4afe61ba83ae180387c65b7 100644 --- a/kernel/base/core/los_task.c +++ b/kernel/base/core/los_task.c @@ -159,16 +159,16 @@ LITE_OS_SEC_TEXT_MINOR VOID OsTaskPriModify(LosTaskCB *taskCB, UINT16 priority) taskCB->priority = priority; } } - +//把任务加到定时器链表中 LITE_OS_SEC_TEXT STATIC INLINE VOID OsAdd2TimerList(LosTaskCB *taskCB, UINT32 timeOut) { - SET_SORTLIST_VALUE(&taskCB->sortList, timeOut); - OsAdd2SortLink(&OsPercpuGet()->taskSortLink, &taskCB->sortList); -#if (LOSCFG_KERNEL_SMP == YES) + SET_SORTLIST_VALUE(&taskCB->sortList, timeOut);//设置idxRollNum的值为timeOut + OsAdd2SortLink(&OsPercpuGet()->taskSortLink, &taskCB->sortList);//将任务挂到定时器排序链表上 +#if (LOSCFG_KERNEL_SMP == YES)//注意:这里的排序不是传统意义上12345的排序,而是根据timeOut的值来决定放到CPU core哪个taskSortLink[0:7]链表上 taskCB->timerCpu = ArchCurrCpuid(); #endif } - +//删除定时器链表 LITE_OS_SEC_TEXT STATIC INLINE VOID OsTimerListDelete(LosTaskCB *taskCB) { #if (LOSCFG_KERNEL_SMP == YES) @@ -176,9 +176,9 @@ LITE_OS_SEC_TEXT STATIC INLINE VOID OsTimerListDelete(LosTaskCB *taskCB) #else SortLinkAttribute *sortLinkHeader = &g_percpu[0].taskSortLink; #endif - OsDeleteSortLink(sortLinkHeader, &taskCB->sortList); + OsDeleteSortLink(sortLinkHeader, &taskCB->sortList);//把task从taskSortLink链表上摘出去 } - +//插入一个TCB到空闲链表 STATIC INLINE VOID OsInsertTCBToFreeList(LosTaskCB *taskCB) { UINT32 taskID = taskCB->taskID; @@ -186,21 +186,21 @@ STATIC INLINE VOID OsInsertTCBToFreeList(LosTaskCB *taskCB) taskCB->taskID = taskID; taskCB->taskStatus = OS_TASK_STATUS_UNUSED; taskCB->processID = OS_INVALID_VALUE; - LOS_ListAdd(&g_losFreeTask, &taskCB->pendList); -} - + LOS_ListAdd(&g_losFreeTask, &taskCB->pendList);//内核挂在g_losFreeTask上的任务都是由pendList完成 +}//查找task 就通过 OS_TCB_FROM_PENDLIST 来完成,相当于由LOS_DL_LIST找到LosTaskCB +//这个函数在task退出事调用,目的是自己要完蛋了,over之前要把那些和他绑在一起的task唤醒. LITE_OS_SEC_TEXT_INIT VOID OsTaskJoinPostUnsafe(LosTaskCB *taskCB) { LosTaskCB *resumedTask = NULL; - if (taskCB->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) { - if (!LOS_ListEmpty(&taskCB->joinList)) { - resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(taskCB->joinList))); - OsTaskWake(resumedTask); + if (taskCB->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) {//任务贴有 + if (!LOS_ListEmpty(&taskCB->joinList)) {//注意到了这里 joinList中的节点身上都有阻塞标签 + resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(taskCB->joinList)));//通过贴有JOIN标签链表的第一个节点找到Task + OsTaskWake(resumedTask);//唤醒任务 } - taskCB->taskStatus &= ~OS_TASK_FLAG_PTHREAD_JOIN; + taskCB->taskStatus &= ~OS_TASK_FLAG_PTHREAD_JOIN;//去掉JOIN标签 } - taskCB->taskStatus |= OS_TASK_STATUS_EXIT; + taskCB->taskStatus |= OS_TASK_STATUS_EXIT;//贴上任务退出标签 } LITE_OS_SEC_TEXT UINT32 OsTaskJoinPendUnsafe(LosTaskCB *taskCB) @@ -222,19 +222,19 @@ LITE_OS_SEC_TEXT UINT32 OsTaskJoinPendUnsafe(LosTaskCB *taskCB) return LOS_EINVAL; } - +//任务设置分离模式 Deatch和JOIN是一对有你没我的状态 LITE_OS_SEC_TEXT UINT32 OsTaskSetDeatchUnsafe(LosTaskCB *taskCB) { - LosProcessCB *processCB = OS_PCB_FROM_PID(taskCB->processID); - if (!(processCB->processStatus & OS_PROCESS_STATUS_RUNNING)) { + LosProcessCB *processCB = OS_PCB_FROM_PID(taskCB->processID);//获取进程实体 + if (!(processCB->processStatus & OS_PROCESS_STATUS_RUNNING)) {//进程必须是运行状态 return LOS_EPERM; } - if (taskCB->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) { - if (LOS_ListEmpty(&(taskCB->joinList))) { - LOS_ListDelete(&(taskCB->joinList)); - taskCB->taskStatus &= ~OS_TASK_FLAG_PTHREAD_JOIN; - taskCB->taskStatus |= OS_TASK_FLAG_DETACHED; + if (taskCB->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) {//join状态时 + if (LOS_ListEmpty(&(taskCB->joinList))) {//joinlist中没有数据了 + LOS_ListDelete(&(taskCB->joinList));//所谓删除就是自己指向自己 + taskCB->taskStatus &= ~OS_TASK_FLAG_PTHREAD_JOIN;//去掉JOIN标签 + taskCB->taskStatus |= OS_TASK_FLAG_DETACHED;//贴上分离标签,自己独立存在,不和其他任务媾和,别的线程不能回收和干掉我,只能由系统来收我 return LOS_OK; } /* This error code has a special purpose and is not allowed to appear again on the interface */ @@ -243,7 +243,7 @@ LITE_OS_SEC_TEXT UINT32 OsTaskSetDeatchUnsafe(LosTaskCB *taskCB) return LOS_EINVAL; } -//任务扫描 +//任务扫描处理,注意这个函数只有 时钟中断处理函数OsTickHandler调用,非常稳定.所以游标每次进来都+1对应一个tick LITE_OS_SEC_TEXT VOID OsTaskScan(VOID) { SortLinkList *sortList = NULL; @@ -255,9 +255,9 @@ LITE_OS_SEC_TEXT VOID OsTaskScan(VOID) taskSortLink = &OsPercpuGet()->taskSortLink;//获取任务的排序链表 taskSortLink->cursor = (taskSortLink->cursor + 1) & OS_TSK_SORTLINK_MASK; - listObject = taskSortLink->sortLink + taskSortLink->cursor; - - /* + listObject = taskSortLink->sortLink + taskSortLink->cursor;//只处理这个游标上的链表,因为系统对超时任务都已经规链表了. + //当任务因超时而挂起时,任务块处于超时排序链接上,(每个cpu)和ipc(互斥锁、扫描电镜等)的块同时被唤醒 + /*不管是超时还是相应的ipc,它都在等待。现在使用synchronize sortlink precedure,因此整个任务扫描需要保护,防止另一个核心同时删除sortlink。 * When task is pended with timeout, the task block is on the timeout sortlink * (per cpu) and ipc(mutex,sem and etc.)'s block at the same time, it can be waken * up by either timeout or corresponding ipc it's waiting. @@ -271,12 +271,12 @@ LITE_OS_SEC_TEXT VOID OsTaskScan(VOID) LOS_SpinUnlock(&g_taskSpin); return; } - sortList = LOS_DL_LIST_ENTRY(listObject->pstNext, SortLinkList, sortLinkNode); - ROLLNUM_DEC(sortList->idxRollNum); + sortList = LOS_DL_LIST_ENTRY(listObject->pstNext, SortLinkList, sortLinkNode);//拿本次Tick对应链表的SortLinkList的第一个节点sortLinkNode + ROLLNUM_DEC(sortList->idxRollNum);//滚动数-- - while (ROLLNUM(sortList->idxRollNum) == 0) { + while (ROLLNUM(sortList->idxRollNum) == 0) {//找到时间到了节点,注意这些节点都是由定时器产生的, LOS_ListDelete(&sortList->sortLinkNode); - taskCB = LOS_DL_LIST_ENTRY(sortList, LosTaskCB, sortList); + taskCB = LOS_DL_LIST_ENTRY(sortList, LosTaskCB, sortList);//拿任务,这里的任务都是超时任务 taskCB->taskStatus &= ~OS_TASK_STATUS_PEND_TIME; tempStatus = taskCB->taskStatus; if (tempStatus & OS_TASK_STATUS_PEND) { @@ -427,7 +427,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsTaskSwitchCheck(LosTaskCB *oldTask, LosTaskCB *n return LOS_OK; } -//任务退出 +//一个任务的退出过程 LITE_OS_SEC_TEXT VOID OsTaskToExit(LosTaskCB *taskCB, UINT32 status) { UINT32 intSave; @@ -435,26 +435,26 @@ LITE_OS_SEC_TEXT VOID OsTaskToExit(LosTaskCB *taskCB, UINT32 status) LosTaskCB *mainTask = NULL; SCHEDULER_LOCK(intSave); - runProcess = OS_PCB_FROM_PID(taskCB->processID); - mainTask = OS_TCB_FROM_TID(runProcess->threadGroupID); - SCHEDULER_UNLOCK(intSave); - if (mainTask == taskCB) { - OsTaskExitGroup(status); + runProcess = OS_PCB_FROM_PID(taskCB->processID);//通过任务ID拿到进程实体 + mainTask = OS_TCB_FROM_TID(runProcess->threadGroupID);//通过线程组ID拿到主任务实体,threadGroupID就是等于mainTask的taskId + SCHEDULER_UNLOCK(intSave); //这个是在线程组创建的时候指定的. + if (mainTask == taskCB) {//如果参数任务就是主任务 + OsTaskExitGroup(status);//task退出线程组 } SCHEDULER_LOCK(intSave); - if (runProcess->threadNumber == 1) { /* 1: The last task of the process exits */ + if (runProcess->threadNumber == 1) { /* 1: The last task of the process exits *///进程的最后一个任务退出 SCHEDULER_UNLOCK(intSave); - (VOID)OsProcessExit(taskCB, status); + (VOID)OsProcessExit(taskCB, status);//调用进程退出流程 return; } - if (taskCB->taskStatus & OS_TASK_FLAG_DETACHED) { - (VOID)OsTaskDeleteUnsafe(taskCB, status, intSave); + if (taskCB->taskStatus & OS_TASK_FLAG_DETACHED) {//任务贴有分离的标签 + (VOID)OsTaskDeleteUnsafe(taskCB, status, intSave);//任务要over了,走起释放占用的资源的流程 } - OsTaskJoinPostUnsafe(taskCB); - OsSchedResched(); + OsTaskJoinPostUnsafe(taskCB);//退出前唤醒跟自己绑在一块的任务 + OsSchedResched();//申请调度 SCHEDULER_UNLOCK(intSave); return; } @@ -462,7 +462,7 @@ LITE_OS_SEC_TEXT VOID OsTaskToExit(LosTaskCB *taskCB, UINT32 status) /* * Description : All task entry * Input : taskID --- The ID of the task to be run - */ + *///所有任务的入口函数,OsTaskEntry是在new task OsTaskStackInit 时指定的 LITE_OS_SEC_TEXT_INIT VOID OsTaskEntry(UINT32 taskID) { LosTaskCB *taskCB = NULL; @@ -478,13 +478,13 @@ LITE_OS_SEC_TEXT_INIT VOID OsTaskEntry(UINT32 taskID) (VOID)LOS_IntUnLock(); 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 */ if (taskCB->taskStatus & OS_TASK_FLAG_DETACHED) {//task有分离标签时 taskCB->joinRetval = 0;//结合数为0 } - - OsTaskToExit(taskCB, 0); + + OsTaskToExit(taskCB, 0);//到这里任务跑完了要退出了 } //任务创建参数检查 LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCreateParamCheck(const UINT32 *taskID, diff --git a/kernel/base/include/los_percpu_pri.h b/kernel/base/include/los_percpu_pri.h index 37e7c8da9b676772d57eaf75d0f8c074a31a28ef..44faf6e67c7cb3fa660871dc27fd75196cff29fc 100644 --- a/kernel/base/include/los_percpu_pri.h +++ b/kernel/base/include/los_percpu_pri.h @@ -51,8 +51,8 @@ typedef enum { #endif typedef struct { - SortLinkAttribute taskSortLink; /* task sort link */ - SortLinkAttribute swtmrSortLink; /* swtmr sort link */ + SortLinkAttribute taskSortLink; /* task sort link *///每个CPU core 都有一个task排序链表 + SortLinkAttribute swtmrSortLink; /* swtmr sort link *///每个CPU core 都有一个定时器排序链表 UINT32 idleTaskID; /* idle task id */ UINT32 taskLockCnt; /* task lock flag */ diff --git a/kernel/base/include/los_sortlink_pri.h b/kernel/base/include/los_sortlink_pri.h index c25f0dff2d56be2246c5fd4b1020e647f9c18334..39c1cd99b7c74a0e3310f8b25086f760f101c5d1 100644 --- a/kernel/base/include/los_sortlink_pri.h +++ b/kernel/base/include/los_sortlink_pri.h @@ -52,13 +52,13 @@ extern "C" { * High Bits : sortlink index */ #define OS_TSK_HIGH_BITS 3U -#define OS_TSK_LOW_BITS (32U - OS_TSK_HIGH_BITS) -#define OS_TSK_SORTLINK_LOGLEN OS_TSK_HIGH_BITS -#define OS_TSK_SORTLINK_LEN (1U << OS_TSK_SORTLINK_LOGLEN) -#define OS_TSK_SORTLINK_MASK (OS_TSK_SORTLINK_LEN - 1U) -#define OS_TSK_MAX_ROLLNUM (0xFFFFFFFFU - OS_TSK_SORTLINK_LEN) -#define OS_TSK_HIGH_BITS_MASK (OS_TSK_SORTLINK_MASK << OS_TSK_LOW_BITS) -#define OS_TSK_LOW_BITS_MASK (~OS_TSK_HIGH_BITS_MASK) +#define OS_TSK_LOW_BITS (32U - OS_TSK_HIGH_BITS) //29 +#define OS_TSK_SORTLINK_LOGLEN OS_TSK_HIGH_BITS //3U +#define OS_TSK_SORTLINK_LEN (1U << OS_TSK_SORTLINK_LOGLEN)//链表长度 1<<3 = 8 +#define OS_TSK_SORTLINK_MASK (OS_TSK_SORTLINK_LEN - 1U)// 0b111 +#define OS_TSK_MAX_ROLLNUM (0xFFFFFFFFU - OS_TSK_SORTLINK_LEN)//最大滚动数0xFFFFFFFC +#define OS_TSK_HIGH_BITS_MASK (OS_TSK_SORTLINK_MASK << OS_TSK_LOW_BITS)//高位掩码 0b111000..00 +#define OS_TSK_LOW_BITS_MASK (~OS_TSK_HIGH_BITS_MASK)//低位掩码 0b000...111 #define EVALUATE_L(NUM, VALUE) NUM = (((NUM) & OS_TSK_HIGH_BITS_MASK) | (VALUE)) @@ -80,15 +80,35 @@ extern "C" { #define SET_SORTLIST_VALUE(sortList, value) (((SortLinkList *)(sortList))->idxRollNum = (value)) +/**************************************** @note_pic + sortLink ++-------->+-----------------+ + | sortLinkNode | + +-----------------+ + | sortLinkNode | + +-----------------+ + | sortLinkNode | + +-----------------+ + | sortLinkNode | + +-----------------+ + | sortLinkNode | + +-----------------+ + | sortLinkNode | + +-----------------+ + | sortLinkNode | + +-----------------+ + | sortLinkNode | + +-----------------+ +*/ + typedef struct { - LOS_DL_LIST sortLinkNode; - UINT32 idxRollNum; + LOS_DL_LIST sortLinkNode; //链表节点 + UINT32 idxRollNum; //滚动数 } SortLinkList; - typedef struct { - LOS_DL_LIST *sortLink;//排序双循环链表 - UINT16 cursor;//游标 - UINT16 reserved; + LOS_DL_LIST *sortLink;//排序节点 + UINT16 cursor; //游标 + UINT16 reserved; //保留用 } SortLinkAttribute; extern UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader); diff --git a/kernel/common/los_config.h b/kernel/common/los_config.h index e0a0312cf6d3bf0067b903de43dbe57e053c79ce..2c9bc3f00b37d823b6196c0544072be8c6600c9f 100644 --- a/kernel/common/los_config.h +++ b/kernel/common/los_config.h @@ -292,7 +292,7 @@ extern UINT32 __heap_end; // 堆区结束地址 * Maximum supported number of software timers rather than the number of usable software timers */ #ifndef LOSCFG_BASE_CORE_SWTMR_LIMIT -#define LOSCFG_BASE_CORE_SWTMR_LIMIT 1024 // 支持的最大软件计时器数量,而不是可用的软件计时器数量 +#define LOSCFG_BASE_CORE_SWTMR_LIMIT 1024 // 支持的最大软件计时器数量 #endif /** * @ingroup los_config diff --git a/zzz/git/push.sh b/zzz/git/push.sh index e390a08261f67985e23d7fef789f63a53e17db77..298b1465c231df75e5d10c844bf284b30951abed 100644 --- a/zzz/git/push.sh +++ b/zzz/git/push.sh @@ -1,5 +1,5 @@ git add -A -git commit -m '提交栈运行空间全景图,CPU多核调度部分注释 +git commit -m 'CPU core 的两个sort list(taskSortLink,swtmrSortLink)模块的注释 鸿蒙内核源码分析系列 https://blog.csdn.net/kuangyufei https://my.oschina.net/u/3751245 鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓】四大仓库每日同步更新 给鸿蒙内核源码逐行加上中文注释 ,让 HarmonyOS 楚楚动人, 从此不再神秘.'