提交 e96b7482 编写于 作者: 鸿蒙内核源码分析's avatar 鸿蒙内核源码分析

CPU core 的两个sort list(taskSortLink,swtmrSortLink)模块的注释

鸿蒙内核源码分析系列 https://blog.csdn.net/kuangyufei https://my.oschina.net/u/3751245
鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓】四大仓库每日同步更新
给鸿蒙内核源码逐行加上中文注释 ,让 HarmonyOS 楚楚动人, 从此不再神秘.
上级 d2d99194
......@@ -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)) {
......
......@@ -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
......
......@@ -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)
{
......
......@@ -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;
......
......@@ -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;
......
......@@ -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://再删除定时器
......
......@@ -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,
......
......@@ -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 */
......
......@@ -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);
......
......@@ -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
......
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 楚楚动人, 从此不再神秘.'
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册