diff --git a/kernel/base/core/los_sortlink.c b/kernel/base/core/los_sortlink.c index 77f38266981f1129e9a98e722df442caa407944a..9791ed306318796766b153cf40a9c95eb60b9810 100644 --- a/kernel/base/core/los_sortlink.c +++ b/kernel/base/core/los_sortlink.c @@ -45,14 +45,14 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader) LOS_DL_LIST *listObject = NULL; UINT32 index; - size = sizeof(LOS_DL_LIST) << OS_TSK_SORTLINK_LOGLEN;//这行代码很精彩,得到 8个 LOS_DL_LIST - listObject = (LOS_DL_LIST *)LOS_MemAlloc(m_aucSysMem0, size); /* system resident resource *///常驻内存 + size = sizeof(LOS_DL_LIST) << OS_TSK_SORTLINK_LOGLEN;//这行代码很精彩, size=64个字节 每个LOS_DL_LIST8个字节,即等于 8个LOS_DL_LIST + listObject = (LOS_DL_LIST *)LOS_MemAlloc(m_aucSysMem0, size); /* system resident resource *///常驻内存 size表示字节的意思 if (listObject == NULL) { return LOS_NOK; } (VOID)memset_s(listObject, size, 0, size);//清0 - sortLinkHeader->sortLink = listObject;//可以知道 sortLink是个链表数组 + sortLinkHeader->sortLink = listObject;//可以知道 sortLink是个链表数组,这个很重要 sortLinkHeader->cursor = 0;//游标默认为0 for (index = 0; index < OS_TSK_SORTLINK_LEN; index++, listObject++) {// OS_TSK_SORTLINK_LEN = 8 LOS_ListInit(listObject);//初始化8个链表 @@ -92,7 +92,7 @@ LITE_OS_SEC_TEXT VOID OsAdd2SortLink(const SortLinkAttribute *sortLinkHeader, So } else { listSorted = LOS_DL_LIST_ENTRY(listObject->pstNext, SortLinkList, sortLinkNode);//取出SortLinkList do { - if (ROLLNUM(listSorted->idxRollNum) <= ROLLNUM(sortList->idxRollNum)) {// @note_? 这块没看懂,谁能帮帮我 + if (ROLLNUM(listSorted->idxRollNum) <= ROLLNUM(sortList->idxRollNum)) {// @note_why 这块没看懂,谁能帮帮我 ROLLNUM_SUB(sortList->idxRollNum, listSorted->idxRollNum); } else { ROLLNUM_SUB(listSorted->idxRollNum, sortList->idxRollNum); @@ -110,7 +110,7 @@ LITE_OS_SEC_TEXT STATIC VOID OsCheckSortLink(const LOS_DL_LIST *listHead, const { LOS_DL_LIST *tmp = listNode->pstPrev; - /* recursive check until double link round to itself */ + /* recursive check until double link round to itself */ //递归检查,直到双链接循环到自身 while (tmp != listNode) { if (tmp == listHead) { goto FOUND; @@ -125,17 +125,17 @@ LITE_OS_SEC_TEXT STATIC VOID OsCheckSortLink(const LOS_DL_LIST *listHead, const FOUND: return; } - +//删除排序链表 LITE_OS_SEC_TEXT VOID OsDeleteSortLink(const SortLinkAttribute *sortLinkHeader, SortLinkList *sortList) { LOS_DL_LIST *listObject = NULL; SortLinkList *nextSortList = NULL; UINT32 sortIndex; - sortIndex = SORT_INDEX(sortList->idxRollNum); - listObject = sortLinkHeader->sortLink + sortIndex; + sortIndex = SORT_INDEX(sortList->idxRollNum);//找出对应索引,索引是通过滚动的idxRollNum来定位的 + listObject = sortLinkHeader->sortLink + sortIndex;//找出索引对应的链表 - /* check if pstSortList node is on the right sortlink */ + /* check if pstSortList node is on the right sortlink */ //检查pstSortList节点是否在正确的sortlink上 OsCheckSortLink(listObject, &sortList->sortLinkNode); if (listObject != sortList->sortLinkNode.pstNext) { diff --git a/kernel/base/core/los_swtmr.c b/kernel/base/core/los_swtmr.c index d330de346828e81c76b7f2366bb00c0230cb8589..ea3b52f6490369187b58c2980093a1aef735403c 100644 --- a/kernel/base/core/los_swtmr.c +++ b/kernel/base/core/los_swtmr.c @@ -165,20 +165,20 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrInit(VOID) /* * Description: Start Software Timer * Input : swtmr --- Need to start software timer - */ + */ //开始定时器 LITE_OS_SEC_TEXT VOID OsSwtmrStart(SWTMR_CTRL_S *swtmr) { if ((swtmr->ucOverrun == 0) && ((swtmr->ucMode == LOS_SWTMR_MODE_ONCE) || (swtmr->ucMode == LOS_SWTMR_MODE_OPP) || (swtmr->ucMode == LOS_SWTMR_MODE_NO_SELFDELETE))) { - SET_SORTLIST_VALUE(&(swtmr->stSortList), swtmr->uwExpiry); + SET_SORTLIST_VALUE(&(swtmr->stSortList), swtmr->uwExpiry);//设置过期时间 } else { SET_SORTLIST_VALUE(&(swtmr->stSortList), swtmr->uwInterval); } - OsAdd2SortLink(&OsPercpuGet()->swtmrSortLink, &swtmr->stSortList); + OsAdd2SortLink(&OsPercpuGet()->swtmrSortLink, &swtmr->stSortList); //通过stSortList节点挂到CPU的软件定时器排序链表上 - swtmr->ucState = OS_SWTMR_STATUS_TICKING; + swtmr->ucState = OS_SWTMR_STATUS_TICKING;//定时器状态成正在 ticking 中 #if (LOSCFG_KERNEL_SMP == YES) swtmr->uwCpuid = ArchCurrCpuid(); @@ -279,24 +279,24 @@ LITE_OS_SEC_TEXT UINT32 OsSwtmrGetNextTimeout(VOID)//获取下一个timeout /* * Description: Stop of Software Timer interface * Input : swtmr --- the software timer contrl handler - */ + */ //停止定时器 LITE_OS_SEC_TEXT STATIC VOID OsSwtmrStop(SWTMR_CTRL_S *swtmr) { SortLinkAttribute *sortLinkHeader = NULL; #if (LOSCFG_KERNEL_SMP == YES) /* - * the timer is running on the specific processor, - * we need delete the timer from that processor's sortlink. + * the timer is running on the specific processor, //计时器正在特定处理器上运行 + * we need delete the timer from that processor's sortlink. //我们需要从处理器的sortlink中删除计时器 */ - sortLinkHeader = &g_percpu[swtmr->uwCpuid].swtmrSortLink; + sortLinkHeader = &g_percpu[swtmr->uwCpuid].swtmrSortLink;//找到定时器所属CPU的 sortlind #else sortLinkHeader = &g_percpu[0].swtmrSortLink; #endif - OsDeleteSortLink(sortLinkHeader, &swtmr->stSortList); + OsDeleteSortLink(sortLinkHeader, &swtmr->stSortList);//将自己摘出去 - swtmr->ucState = OS_SWTMR_STATUS_CREATED; - swtmr->ucOverrun = 0; + swtmr->ucState = OS_SWTMR_STATUS_CREATED;//状态变成已创建,又可以再利用. + swtmr->ucOverrun = 0;//计次器清0 } /* @@ -359,13 +359,13 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_SwtmrCreate(UINT32 interval, SWTMR_UNLOCK(intSave); swtmr->uwOwnerPid = OsCurrProcessGet()->processID;//定时器进程归属设定 - swtmr->pfnHandler = handler; - swtmr->ucMode = mode; - swtmr->ucOverrun = 0; - swtmr->uwInterval = interval; - swtmr->uwExpiry = interval; - swtmr->uwArg = arg; - swtmr->ucState = OS_SWTMR_STATUS_CREATED; + swtmr->pfnHandler = handler;//时间到了的回调函数 + swtmr->ucMode = mode; //定时器模式 + swtmr->ucOverrun = 0; //重复计时的次数 + swtmr->uwInterval = interval; //周期性超时间隔 + swtmr->uwExpiry = interval; //一次性超时间隔 + swtmr->uwArg = arg; //回调函数的参数 + swtmr->ucState = OS_SWTMR_STATUS_CREATED; //已创建状态 SET_SORTLIST_VALUE(&(swtmr->stSortList), 0); *swtmrID = swtmr->usTimerID; diff --git a/kernel/base/include/los_queue_pri.h b/kernel/base/include/los_queue_pri.h index 02b817457c0caf9940261ca8caffa3be45c78c07..efe2785257478b4ef1c8d2bf4fc9c83e20997991 100644 --- a/kernel/base/include/los_queue_pri.h +++ b/kernel/base/include/los_queue_pri.h @@ -75,7 +75,7 @@ typedef struct { UINT16 queueTail; /**< Node tail */ //队列尾部节点 UINT16 readWriteableCnt[OS_QUEUE_N_RW]; /**< Count of readable or writable resources, 0:readable, 1:writable */ LOS_DL_LIST readWriteList[OS_QUEUE_N_RW]; /**< the linked list to be read or written, 0:readlist, 1:writelist */ - LOS_DL_LIST memList; /**< Pointer to the memory linked list */ //@note_? 这么尚未搞明白是啥意思 + LOS_DL_LIST memList; /**< Pointer to the memory linked list */ //@note_why 这里尚未搞明白是啥意思 } LosQueueCB;//读写队列分离 /* queue state */ diff --git a/kernel/base/include/los_sortlink_pri.h b/kernel/base/include/los_sortlink_pri.h index 39c1cd99b7c74a0e3310f8b25086f760f101c5d1..09367f295802c1a7b04518fa924850a2673220fa 100644 --- a/kernel/base/include/los_sortlink_pri.h +++ b/kernel/base/include/los_sortlink_pri.h @@ -81,7 +81,8 @@ extern "C" { #define SET_SORTLIST_VALUE(sortList, value) (((SortLinkList *)(sortList))->idxRollNum = (value)) /**************************************** @note_pic - sortLink + + sortLink[0:7] +-------->+-----------------+ | sortLinkNode | +-----------------+ @@ -106,7 +107,7 @@ typedef struct { UINT32 idxRollNum; //滚动数 } SortLinkList; typedef struct { - LOS_DL_LIST *sortLink;//排序节点 + LOS_DL_LIST *sortLink;//排序链表,看上图它指向的结构. UINT16 cursor; //游标 UINT16 reserved; //保留用 } SortLinkAttribute; diff --git a/kernel/base/misc/los_stackinfo.c b/kernel/base/misc/los_stackinfo.c index e24bdead9837f2aa3a9fc06e9c493981ec50ab5a..6c6acbaf2c6500ee7651af2d749b097e6a510755 100644 --- a/kernel/base/misc/los_stackinfo.c +++ b/kernel/base/misc/los_stackinfo.c @@ -105,7 +105,7 @@ VOID OsExcStackInfo(VOID) OsExcStackCheck(); } -/***************************************************************************************@note_pic +/*************************************************************************************** @note_pic OsExcStackInfo 各个CPU栈布局图,其他栈也是一样,CPU各核硬件栈都是紧挨着 __undef_stack(SMP) +-------------------+ <--- cpu1 top diff --git a/kernel/include/los_swtmr.h b/kernel/include/los_swtmr.h index 205539f0a2a19474fd554fc2fd857ccf3df7722b..1dff73755eb196a6cae3ec2c1c5fd9979be2e50e 100644 --- a/kernel/include/los_swtmr.h +++ b/kernel/include/los_swtmr.h @@ -229,10 +229,10 @@ extern "C" { * Software timer mode */ enum enSwTmrType { - LOS_SWTMR_MODE_ONCE, /**< One-off software timer */ - LOS_SWTMR_MODE_PERIOD, /**< Periodic software timer */ - LOS_SWTMR_MODE_NO_SELFDELETE, /**< One-off software timer, but not self-delete */ - LOS_SWTMR_MODE_OPP /**< After the one-off timer finishes timing, + LOS_SWTMR_MODE_ONCE, /**< One-off software timer */ //一次性的软件计时器 + LOS_SWTMR_MODE_PERIOD, /**< Periodic software timer */ //周期性的软件计时器 + LOS_SWTMR_MODE_NO_SELFDELETE, /**< One-off software timer, but not self-delete */ //一次性软件计时器,但不能自删除 + LOS_SWTMR_MODE_OPP /**< After the one-off timer finishes timing, //一次性完成后启用周期性软件计时器,鸿蒙目前暂时不支持这种方式 the periodic software timer is enabled. This mode is not supported temporarily. */ }; @@ -257,27 +257,27 @@ enum enSwTmrType { * * @see None. */ -typedef VOID (*SWTMR_PROC_FUNC)(UINTPTR arg); +typedef VOID (*SWTMR_PROC_FUNC)(UINTPTR arg); //函数指针, 赋值给 SWTMR_CTRL_S->pfnHandler,回调处理 /** * @ingroup los_swtmr * Software timer control structure */ -typedef struct tagSwTmrCtrl { +typedef struct tagSwTmrCtrl {// @note_why 鸿蒙内核经常出现 uc uw 这样的变量前缀命名,到底是什么意思? SortLinkList stSortList; - UINT8 ucState; /**< Software timer state */ - UINT8 ucMode; /**< Software timer mode */ - UINT8 ucOverrun; /**< Times that a software timer repeats timing */ - UINT16 usTimerID; /**< Software timer ID */ - UINT32 uwCount; /**< Times that a software timer works */ - UINT32 uwInterval; /**< Timeout interval of a periodic software timer */ - UINT32 uwExpiry; /**< Timeout interval of an one-off software timer */ + UINT8 ucState; /**< Software timer state */ //软件计时器的状态 + UINT8 ucMode; /**< Software timer mode */ //软件计时器的模式 + UINT8 ucOverrun; /**< Times that a software timer repeats timing */ //软件计时器重复计时的次数 + UINT16 usTimerID; /**< Software timer ID */ //软件计时器ID,唯一标识,由软件计时器池分配 + UINT32 uwCount; /**< Times that a software timer works */ //软件计时器工作的时间 + UINT32 uwInterval; /**< Timeout interval of a periodic software timer */ //周期性软件计时器的超时间隔 + UINT32 uwExpiry; /**< Timeout interval of an one-off software timer */ //一次性软件计时器的超时间隔 #if (LOSCFG_KERNEL_SMP == YES) - UINT32 uwCpuid; /**< The cpu where the timer running on */ + UINT32 uwCpuid; /**< The cpu where the timer running on */ //多核情况下,定时器运行的cpu #endif - UINTPTR uwArg; /**< Parameter passed in when the callback function + UINTPTR uwArg; /**< Parameter passed in when the callback function //回调函数的参数 that handles software timer timeout is called */ - SWTMR_PROC_FUNC pfnHandler; /**< Callback function that handles software timer timeout */ + SWTMR_PROC_FUNC pfnHandler; /**< Callback function that handles software timer timeout */ //处理软件计时器超时的回调函数 UINT32 uwOwnerPid; /** Owner of this software timer */ } SWTMR_CTRL_S; diff --git a/zzz/git/push.sh b/zzz/git/push.sh index c8328f67950815d65a39738824d784c1df47cc3f..e9eb47acb703e472e80f0bdb7c9835944c838518 100644 --- a/zzz/git/push.sh +++ b/zzz/git/push.sh @@ -1,5 +1,5 @@ git add -A -git commit -m '开始对IPC Futex 部分代码注释,鸿蒙提供了多种IPC方式 +git commit -m '对 cpu sortlink 部分代码注释 鸿蒙内核源码分析系列 【 CSDN | OSCHINA | WIKI 】 鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓 】四大仓库每日同步更新代码和wiki 项目给鸿蒙内核源码逐行加上中文注解,详细阐述框架和代码细节, 精读 HarmonyOS 内核源码, 将迅速拔高对计算机整体理解,从此高屋建瓴看问题.' diff --git a/zzz/test/main.c b/zzz/test/main.c index b62647df00ed881d00600dec775a71075c9b692e..bebae296fbbf95fd19e30107f92835268718a4a3 100644 --- a/zzz/test/main.c +++ b/zzz/test/main.c @@ -5,6 +5,11 @@ typedef unsigned long PTE_T; typedef unsigned long VADDR_T; #define IS_ALIGNED(a, b) (!(((UINTPTR)(a)) & (((UINTPTR)(b)) - 1))) +typedef struct LOS_DL_LIST { + struct LOS_DL_LIST *pstPrev; /**< Current node's pointer to the previous node */ + struct LOS_DL_LIST *pstNext; /**< Current node's pointer to the next node */ +} LOS_DL_LIST; + //鸿蒙内核源码分析系列篇 https://blog.csdn.net/kuangyufei void b(){ @@ -17,6 +22,9 @@ void b(){ #define MMU_DESCRIPTOR_L1_SMALL_FRAME (~MMU_DESCRIPTOR_L1_SMALL_MASK) #define MMU_DESCRIPTOR_L1_SMALL_SHIFT 20 #define MMU_DESCRIPTOR_L1_SECTION_ADDR(x) ((x) & MMU_DESCRIPTOR_L1_SMALL_FRAME) +#define OS_TSK_HIGH_BITS 3U +#define OS_TSK_LOW_BITS (32U - OS_TSK_HIGH_BITS) //29 +#define OS_TSK_SORTLINK_LOGLEN OS_TSK_HIGH_BITS //3U PTE_T l1Entry = pte1BasePtr + vaddr >> MMU_DESCRIPTOR_L1_SMALL_SHIFT; printf("pte1BasePtr ad: %x\n",&pte1BasePtr); @@ -43,16 +51,13 @@ void round1(){ //printf("ROUNDUP %d\n",ROUNDUP(9, 2)); //printf("ROUNDDOWN %d\n",ROUNDDOWN(9, 2)); } -int aw; -int bw=99; -void Print(){ - printf("ROUNDUP %d\n",ROUNDUP(0x00000200+512,1024)); -} + int main() { - int b = 0; - //printf("ROUNDUP %d\n",ROUNDUP(0x00000200+512,1024)); - Print(); + int size = 0; + size = sizeof(LOS_DL_LIST) << OS_TSK_SORTLINK_LOGLEN; + printf("LOS_DL_LIST %d\n",sizeof(LOS_DL_LIST *)); + printf("size %d\n",size); return 0; } diff --git a/zzz/test/main.exe b/zzz/test/main.exe new file mode 100644 index 0000000000000000000000000000000000000000..89c1d9a89fa3df11c694c14e30440e0db1079917 Binary files /dev/null and b/zzz/test/main.exe differ