From ac6647ebaf622603b15b5ae3ba9e055857182805 Mon Sep 17 00:00:00 2001 From: kuangyufei Date: Mon, 26 Oct 2020 18:23:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=85=E5=AD=98,=E8=BF=9B=E7=A8=8B,task?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E6=B3=A8=E9=87=8A=E5=9F=BA=E6=9C=AC=E5=AE=8C?= =?UTF-8?q?=E6=88=90.=20=E6=AD=A3=E5=9C=A8=E6=9B=B4=E6=96=B0:=20=E8=BF=9B?= =?UTF-8?q?=E7=A8=8B=E9=97=B4IPC=E9=80=9A=E8=AE=AF=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E9=98=9F=E5=88=97=E6=A8=A1=E5=9D=97=E4=BB=A3=E7=A0=81=E6=B3=A8?= =?UTF-8?q?=E9=87=8A...=20=E9=B8=BF=E8=92=99=E5=86=85=E6=A0=B8=E6=BA=90?= =?UTF-8?q?=E7=A0=81=E5=88=86=E6=9E=90=E7=B3=BB=E5=88=97=20https://blog.cs?= =?UTF-8?q?dn.net/kuangyufei=20https://my.oschina.net/u/3751245?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/base/core/los_task.c | 2 +- kernel/base/include/los_queue_pri.h | 10 +++--- kernel/base/ipc/los_event.c | 4 +-- kernel/base/ipc/los_queue.c | 46 ++++++++++++------------ kernel/base/ipc/los_queue_debug.c | 2 +- kernel/base/mp/los_mp.c | 18 +++++----- kernel/common/los_config.c | 48 +++++++++++++------------- kernel/include/los_event.h | 4 +-- kernel/include/los_mp.h | 6 ++-- platform/hw/arm/interrupt/gic/gic_v2.c | 9 ++--- platform/hw/arm/interrupt/gic/gic_v3.c | 9 ++--- platform/main.c | 8 ++--- syscall/process_syscall.c | 10 +++--- zzz/git/push.sh | 4 +-- 14 files changed, 91 insertions(+), 89 deletions(-) diff --git a/kernel/base/core/los_task.c b/kernel/base/core/los_task.c index 70837fb4..0573890d 100644 --- a/kernel/base/core/los_task.c +++ b/kernel/base/core/los_task.c @@ -486,7 +486,7 @@ LITE_OS_SEC_TEXT_INIT VOID OsTaskEntry(UINT32 taskID) OsTaskToExit(taskCB, 0); } - +//任务创建参数检查 LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCreateParamCheck(const UINT32 *taskID, TSK_INIT_PARAM_S *initParam, VOID **pool) { diff --git a/kernel/base/include/los_queue_pri.h b/kernel/base/include/los_queue_pri.h index 746b7801..4a978762 100644 --- a/kernel/base/include/los_queue_pri.h +++ b/kernel/base/include/los_queue_pri.h @@ -41,14 +41,14 @@ extern "C" { #endif /* __cplusplus */ typedef enum { - OS_QUEUE_READ = 0, - OS_QUEUE_WRITE = 1, + OS_QUEUE_READ = 0, //读队列 + OS_QUEUE_WRITE = 1, //写队列 OS_QUEUE_N_RW = 2 } QueueReadWrite; typedef enum { - OS_QUEUE_HEAD = 0, - OS_QUEUE_TAIL = 1 + OS_QUEUE_HEAD = 0, //队列头部标识 + OS_QUEUE_TAIL = 1 //队列尾部标识 } QueueHeadTail; #define OS_QUEUE_OPERATE_TYPE(ReadOrWrite, HeadOrTail) (((UINT32)(HeadOrTail) << 1) | (ReadOrWrite)) @@ -76,7 +76,7 @@ typedef struct { 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 */ -} LosQueueCB; +} LosQueueCB;//读写队列分离 /* queue state */ /** diff --git a/kernel/base/ipc/los_event.c b/kernel/base/ipc/los_event.c index 92b90d62..a7fe3b8a 100644 --- a/kernel/base/ipc/los_event.c +++ b/kernel/base/ipc/los_event.c @@ -44,7 +44,7 @@ extern "C" { #endif #endif /* __cplusplus */ - +//时间初始化 LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventInit(PEVENT_CB_S eventCB) { UINT32 intSave; @@ -55,7 +55,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventInit(PEVENT_CB_S eventCB) intSave = LOS_IntLock(); eventCB->uwEventID = 0; - LOS_ListInit(&eventCB->stEventList); + LOS_ListInit(&eventCB->stEventList);//事件链表初始化 LOS_IntRestore(intSave); return LOS_OK; } diff --git a/kernel/base/ipc/los_queue.c b/kernel/base/ipc/los_queue.c index f7acdf0f..8537cff6 100644 --- a/kernel/base/ipc/los_queue.c +++ b/kernel/base/ipc/los_queue.c @@ -54,7 +54,7 @@ LITE_OS_SEC_BSS STATIC LOS_DL_LIST g_freeQueueList;//IPC空闲队列链表,管 * Description : queue initial * Return : LOS_OK on success or error code on failure */ -LITE_OS_SEC_TEXT_INIT UINT32 OsQueueInit(VOID)//IPC 队列初始化 +LITE_OS_SEC_TEXT_INIT UINT32 OsQueueInit(VOID)//队列初始化 { LosQueueCB *queueNode = NULL; UINT32 index; @@ -232,7 +232,7 @@ STATIC VOID OsQueueBufferOperate(LosQueueCB *queueCB, UINT32 operateType, VOID * } *bufferSize = msgDataSize;//通过入参 带走消息的大小 - } else {//只有读写两种操作,这里就是写队列了.写也分两步走 + } else {//只有读写两种操作,这里就是写队列了.写也分两步走 , @@@@@ 这里建议鸿蒙加上 OS_QUEUE_IS_WRITE 判断 if (memcpy_s(queueNode, queueCB->queueSize, bufferAddr, *bufferSize) != EOK) {//1.写入消息内容长度 UINT32表示 PRINT_ERR("store message failed\n"); return; @@ -244,65 +244,65 @@ STATIC VOID OsQueueBufferOperate(LosQueueCB *queueCB, UINT32 operateType, VOID * } } } - +//队列操作参数检查 STATIC UINT32 OsQueueOperateParamCheck(const LosQueueCB *queueCB, UINT32 queueID, UINT32 operateType, const UINT32 *bufferSize) { - if ((queueCB->queueID != queueID) || (queueCB->queueState == OS_QUEUE_UNUSED)) { + if ((queueCB->queueID != queueID) || (queueCB->queueState == OS_QUEUE_UNUSED)) {//队列ID和状态判断 return LOS_ERRNO_QUEUE_NOT_CREATE; } - if (OS_QUEUE_IS_READ(operateType) && (*bufferSize < (queueCB->queueSize - sizeof(UINT32)))) { + if (OS_QUEUE_IS_READ(operateType) && (*bufferSize < (queueCB->queueSize - sizeof(UINT32)))) {//读时判断 return LOS_ERRNO_QUEUE_READ_SIZE_TOO_SMALL; - } else if (OS_QUEUE_IS_WRITE(operateType) && (*bufferSize > (queueCB->queueSize - sizeof(UINT32)))) { + } else if (OS_QUEUE_IS_WRITE(operateType) && (*bufferSize > (queueCB->queueSize - sizeof(UINT32)))) {//写时判断 return LOS_ERRNO_QUEUE_WRITE_SIZE_TOO_BIG; } return LOS_OK; } - +//队列操作.是读是写由operateType定 UINT32 OsQueueOperate(UINT32 queueID, UINT32 operateType, VOID *bufferAddr, UINT32 *bufferSize, UINT32 timeout) { LosQueueCB *queueCB = NULL; LosTaskCB *resumedTask = NULL; UINT32 ret; - UINT32 readWrite = OS_QUEUE_READ_WRITE_GET(operateType); + UINT32 readWrite = OS_QUEUE_READ_WRITE_GET(operateType);//获取读写操作标识 UINT32 intSave; SCHEDULER_LOCK(intSave); - queueCB = (LosQueueCB *)GET_QUEUE_HANDLE(queueID); - ret = OsQueueOperateParamCheck(queueCB, queueID, operateType, bufferSize); + queueCB = (LosQueueCB *)GET_QUEUE_HANDLE(queueID);//获取对应的队列控制块 + ret = OsQueueOperateParamCheck(queueCB, queueID, operateType, bufferSize);//参数检查 if (ret != LOS_OK) { goto QUEUE_END; } - if (queueCB->readWriteableCnt[readWrite] == 0) { - if (timeout == LOS_NO_WAIT) { + if (queueCB->readWriteableCnt[readWrite] == 0) {//没有数据 + if (timeout == LOS_NO_WAIT) {//不等待直接退出 ret = OS_QUEUE_IS_READ(operateType) ? LOS_ERRNO_QUEUE_ISEMPTY : LOS_ERRNO_QUEUE_ISFULL; goto QUEUE_END; } - if (!OsPreemptableInSched()) { + if (!OsPreemptableInSched()) {//不能抢占式调度 ret = LOS_ERRNO_QUEUE_PEND_IN_LOCK; goto QUEUE_END; } - ret = OsTaskWait(&queueCB->readWriteList[readWrite], timeout, TRUE); + ret = OsTaskWait(&queueCB->readWriteList[readWrite], timeout, TRUE);//任务等待 if (ret == LOS_ERRNO_TSK_TIMEOUT) { ret = LOS_ERRNO_QUEUE_TIMEOUT; goto QUEUE_END; } } else { - queueCB->readWriteableCnt[readWrite]--; + queueCB->readWriteableCnt[readWrite]--;//对应队列中计数器-- } - OsQueueBufferOperate(queueCB, operateType, bufferAddr, bufferSize); + OsQueueBufferOperate(queueCB, operateType, bufferAddr, bufferSize);//发起读或写队列操作 - if (!LOS_ListEmpty(&queueCB->readWriteList[!readWrite])) { - resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&queueCB->readWriteList[!readWrite])); - OsTaskWake(resumedTask); + if (!LOS_ListEmpty(&queueCB->readWriteList[!readWrite])) {//另外的operateType中还有其他消息时,如果 operateType=read,这时去查write队列,读写交互操作 + resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&queueCB->readWriteList[!readWrite]));//拿到拥有这个队列节点的任务 + OsTaskWake(resumedTask);//唤醒任务去处理队列的值 SCHEDULER_UNLOCK(intSave); - LOS_MpSchedule(OS_MP_CPU_ALL); - LOS_Schedule(); + LOS_MpSchedule(OS_MP_CPU_ALL);//让所有CPU参与调度 + LOS_Schedule();//申请调度 return LOS_OK; } else { queueCB->readWriteableCnt[!readWrite]++; @@ -312,7 +312,7 @@ QUEUE_END: SCHEDULER_UNLOCK(intSave); return ret; } - +//接口函数 鸿蒙 LOS_ 开头的都是可供外面调用的接口函数 LITE_OS_SEC_TEXT UINT32 LOS_QueueReadCopy(UINT32 queueID, VOID *bufferAddr, UINT32 *bufferSize, @@ -363,7 +363,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_QueueWriteCopy(UINT32 queueID, operateType = OS_QUEUE_OPERATE_TYPE(OS_QUEUE_WRITE, OS_QUEUE_TAIL); return OsQueueOperate(queueID, operateType, bufferAddr, &bufferSize, timeout); } - +//读一个队列数据 LITE_OS_SEC_TEXT UINT32 LOS_QueueRead(UINT32 queueID, VOID *bufferAddr, UINT32 bufferSize, UINT32 timeout) { return LOS_QueueReadCopy(queueID, bufferAddr, &bufferSize, timeout); diff --git a/kernel/base/ipc/los_queue_debug.c b/kernel/base/ipc/los_queue_debug.c index 3543b006..e422cf89 100644 --- a/kernel/base/ipc/los_queue_debug.c +++ b/kernel/base/ipc/los_queue_debug.c @@ -131,7 +131,7 @@ STATIC VOID SortQueueIndexArray(UINT32 *indexArray, UINT32 count) } (VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, indexArray); } - +//队列检查 VOID OsQueueCheck(VOID) { LosQueueCB queueNode = {0}; diff --git a/kernel/base/mp/los_mp.c b/kernel/base/mp/los_mp.c index 948d3d72..189cf602 100644 --- a/kernel/base/mp/los_mp.c +++ b/kernel/base/mp/los_mp.c @@ -43,33 +43,33 @@ extern "C" { #if (LOSCFG_KERNEL_SMP == YES) -VOID LOS_MpSchedule(UINT32 target) +VOID LOS_MpSchedule(UINT32 target)//target每位对应CPU core { UINT32 cpuid = ArchCurrCpuid(); target &= ~(1U << cpuid); - HalIrqSendIpi(target, LOS_MP_IPI_SCHEDULE); + HalIrqSendIpi(target, LOS_MP_IPI_SCHEDULE);//处理器间中断(IPI) } - +//硬中断唤醒处理函数 VOID OsMpWakeHandler(VOID) { /* generic wakeup ipi, do nothing */ } - +//硬中断调度处理函数 VOID OsMpScheduleHandler(VOID) -{ +{//将调度标志设置为与唤醒功能不同,这样就可以在硬中断结束时触发调度程序。 /* * set schedule flag to differ from wake function, * so that the scheduler can be triggered at the end of irq. */ - OsPercpuGet()->schedFlag = INT_PEND_RESCH; + OsPercpuGet()->schedFlag = INT_PEND_RESCH;//贴上调度标签 } - +//硬中断调度处理函数 VOID OsMpHaltHandler(VOID) { (VOID)LOS_IntLock(); - OsPercpuGet()->excFlag = CPU_HALT; + OsPercpuGet()->excFlag = CPU_HALT;//让当前Cpu停止工作 - while (1) {} + while (1) {}//陷入空循环,也就是空闲状态 } VOID OsMpCollectTasks(VOID) diff --git a/kernel/common/los_config.c b/kernel/common/los_config.c index 85997f2f..5f9bd2c8 100644 --- a/kernel/common/los_config.c +++ b/kernel/common/los_config.c @@ -139,35 +139,35 @@ LITE_OS_SEC_TEXT_INIT VOID osRegister(VOID) return; } - +//系统初始化已经完成,系统正式开始工作 LITE_OS_SEC_TEXT_INIT VOID OsStart(VOID) { LosProcessCB *runProcess = NULL; LosTaskCB *taskCB = NULL; UINT32 cpuid = ArchCurrCpuid(); - OsTickStart(); + OsTickStart();//启动tick LOS_SpinLock(&g_taskSpin); - taskCB = OsGetTopTask(); + taskCB = OsGetTopTask();//获取一个最高优先级任务 - runProcess = OS_PCB_FROM_PID(taskCB->processID); - runProcess->processStatus |= OS_PROCESS_STATUS_RUNNING; + runProcess = OS_PCB_FROM_PID(taskCB->processID);//获取这个task所在进程 + runProcess->processStatus |= OS_PROCESS_STATUS_RUNNING;//设这个进程为运行进程 #if (LOSCFG_KERNEL_SMP == YES) /* * attention: current cpu needs to be set, in case first task deletion * may fail because this flag mismatch with the real current cpu. - */ - taskCB->currCpu = cpuid; + *///注意:当前cpu需要设置,以防第一个任务被删除可能会失败,因为此标志与实际当前cpu不匹配 + taskCB->currCpu = cpuid;//设置当前cpuID为当前任务跑在这个CPUID上 runProcess->processStatus = OS_PROCESS_RUNTASK_COUNT_ADD(runProcess->processStatus); #endif - OS_SCHEDULER_SET(cpuid); + OS_SCHEDULER_SET(cpuid);//设置调度要使用的cpu id PRINTK("cpu %d entering scheduler\n", cpuid); - OsStartToRun(taskCB); + OsStartToRun(taskCB);//任务开始起跑 } - +//进程通讯IPC初始化 由OsMain()调用 LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsIpcInit(VOID) { UINT32 ret; @@ -178,8 +178,8 @@ LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsIpcInit(VOID) } #endif -#if (LOSCFG_BASE_IPC_QUEUE == YES) - ret = OsQueueInit(); +#if (LOSCFG_BASE_IPC_QUEUE == YES)//系统已配置支持队列IPC + ret = OsQueueInit();//队列初始化 if (ret != LOS_OK) { return ret; } @@ -302,7 +302,7 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID) } #if (LOSCFG_BASE_CORE_SWTMR == YES) - ret = OsSwtmrInit(); + ret = OsSwtmrInit();//软时钟模块初始化 if (ret != LOS_OK) { return ret; } @@ -313,7 +313,7 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID) #endif #if (LOSCFG_KERNEL_SMP == YES) - (VOID)OsMpInit(); + (VOID)OsMpInit();//多处理器模块的初始化 #endif #if defined(LOSCFG_HW_RANDOM_ENABLE) || defined (LOSCFG_DRIVERS_RANDOM) @@ -322,7 +322,7 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID) #endif #ifdef LOSCFG_COMPAT_BSD - ret = OsBsdInit(); + ret = OsBsdInit();//BSD模块初始化 if (ret != LOS_OK) { PRINT_ERR("init bsd failed!\n"); return ret; @@ -333,7 +333,7 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID) OsDriverPipeInit(); #endif - ret = OsSystemInit(); + ret = OsSystemInit();//系统初始化 if (ret != LOS_OK) { return ret; } @@ -343,11 +343,11 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID) #endif #if (LOSCFG_KERNEL_TRACE == YES) - LOS_TraceInit(); + LOS_TraceInit();//日志模块初始化,没有日志一片摸瞎. #endif #if (LOSCFG_KERNEL_LITEIPC == YES) - ret = LiteIpcInit(); + ret = LiteIpcInit();//这是lite自有的IPC模块 初始化 if (ret != LOS_OK) { return ret; } @@ -361,20 +361,20 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID) #endif #ifdef LOSCFG_KERNEL_VDSO - ret = OsInitVdso(); - if (ret != LOS_OK) { + ret = OsInitVdso();//VDSO模块初始化 + if (ret != LOS_OK) {//VDSO就是Virtual Dynamic Shared Object,即内核提供的虚拟的.so,这个.so文件不在磁盘上,而是在内核里头 return ret; } #endif - - ret = OsFutexInit(); + //Fast Userspace muTexes (快速用户空间互斥体) + ret = OsFutexInit();//linux使用了futex来进行快速通信,pthread_xxx 相关接口全部都是基于futex实现的 if (ret != LOS_OK) { PRINT_ERR("Create futex failed : %d!\n", ret); return ret; } - ret = OomTaskInit(); - if (ret != LOS_OK) { + ret = OomTaskInit();//Out-Of-Memory 用户监控使用内存太大的task,在内存不足而某些进程太耗内存时 + if (ret != LOS_OK) {//可以直接把进程干掉而释放内存 return ret; } diff --git a/kernel/include/los_event.h b/kernel/include/los_event.h index faddb393..29764f38 100644 --- a/kernel/include/los_event.h +++ b/kernel/include/los_event.h @@ -161,11 +161,11 @@ extern "C" { * @ingroup los_event * Event control structure */ -typedef struct tagEvent { +typedef struct tagEvent {//EVENT_CB_S 这结构体名字取的不能统一下吗? 明显这里是另一个人的代码 UINT32 uwEventID; /**< Event mask in the event control block, indicating the event that has been logically processed. */ LOS_DL_LIST stEventList; /**< Event control block linked list */ -} EVENT_CB_S, *PEVENT_CB_S; +} EVENT_CB_S, *PEVENT_CB_S;//一个是结构体,一个是指针 /** * @ingroup los_event diff --git a/kernel/include/los_mp.h b/kernel/include/los_mp.h index 3c1b21b8..de8b06ad 100644 --- a/kernel/include/los_mp.h +++ b/kernel/include/los_mp.h @@ -45,9 +45,9 @@ extern "C" { #define OS_MP_GC_PERIOD 100 /* ticks */ typedef enum { - LOS_MP_IPI_WAKEUP, - LOS_MP_IPI_SCHEDULE, - LOS_MP_IPI_HALT, + LOS_MP_IPI_WAKEUP, //唤醒CPU + LOS_MP_IPI_SCHEDULE,//调度CPU + LOS_MP_IPI_HALT, //停止CPU } MP_IPI_TYPE; #if (LOSCFG_KERNEL_SMP == YES) diff --git a/platform/hw/arm/interrupt/gic/gic_v2.c b/platform/hw/arm/interrupt/gic/gic_v2.c index 87226902..df789ceb 100644 --- a/platform/hw/arm/interrupt/gic/gic_v2.c +++ b/platform/hw/arm/interrupt/gic/gic_v2.c @@ -144,10 +144,11 @@ VOID HalIrqInit(VOID) GIC_REG_32(GICD_CTLR) = 1; #if (LOSCFG_KERNEL_SMP == YES) - /* register inter-processor interrupt */ - (VOID)LOS_HwiCreate(LOS_MP_IPI_WAKEUP, 0xa0, 0, OsMpWakeHandler, 0); - (VOID)LOS_HwiCreate(LOS_MP_IPI_SCHEDULE, 0xa0, 0, OsMpScheduleHandler, 0); - (VOID)LOS_HwiCreate(LOS_MP_IPI_HALT, 0xa0, 0, OsMpHaltHandler, 0); + /* register inter-processor interrupt *///注册寄存器处理器间中断处理函数,啥意思?就是当前CPU核向其他CPU核发送中断信号 + //处理器间中断允许一个CPU向系统其他的CPU发送中断信号,处理器间中断(IPI)不是通过IRQ线传输的,而是作为信号直接放在连接所有CPU本地APIC的总线上。 + LOS_HwiCreate(LOS_MP_IPI_WAKEUP, 0xa0, 0, OsMpWakeHandler, 0);//中断处理函数 + LOS_HwiCreate(LOS_MP_IPI_SCHEDULE, 0xa0, 0, OsMpScheduleHandler, 0);//中断处理函数 + LOS_HwiCreate(LOS_MP_IPI_HALT, 0xa0, 0, OsMpScheduleHandler, 0);//中断处理函数 #endif } diff --git a/platform/hw/arm/interrupt/gic/gic_v3.c b/platform/hw/arm/interrupt/gic/gic_v3.c index 3e20c60c..2cfbc41a 100644 --- a/platform/hw/arm/interrupt/gic/gic_v3.c +++ b/platform/hw/arm/interrupt/gic/gic_v3.c @@ -399,10 +399,11 @@ VOID HalIrqInit(VOID) HalIrqInitPercpu(); #if (LOSCFG_KERNEL_SMP == YES) - /* register inter-processor interrupt */ - LOS_HwiCreate(LOS_MP_IPI_WAKEUP, 0xa0, 0, OsMpWakeHandler, 0); - LOS_HwiCreate(LOS_MP_IPI_SCHEDULE, 0xa0, 0, OsMpScheduleHandler, 0); - LOS_HwiCreate(LOS_MP_IPI_HALT, 0xa0, 0, OsMpScheduleHandler, 0); + /* register inter-processor interrupt *///注册寄存器处理器间中断处理函数,啥意思?就是当前CPU核向其他CPU核发送中断信号 + //处理器间中断允许一个CPU向系统其他的CPU发送中断信号,处理器间中断(IPI)不是通过IRQ线传输的,而是作为信号直接放在连接所有CPU本地APIC的总线上。 + LOS_HwiCreate(LOS_MP_IPI_WAKEUP, 0xa0, 0, OsMpWakeHandler, 0);//中断处理函数 + LOS_HwiCreate(LOS_MP_IPI_SCHEDULE, 0xa0, 0, OsMpScheduleHandler, 0);//中断处理函数 + LOS_HwiCreate(LOS_MP_IPI_HALT, 0xa0, 0, OsMpScheduleHandler, 0);//中断处理函数 #endif } diff --git a/platform/main.c b/platform/main.c index a1aece22..10419d69 100644 --- a/platform/main.c +++ b/platform/main.c @@ -171,16 +171,16 @@ LITE_OS_SEC_TEXT_INIT INT32 main(VOID) return LOS_NOK; } -#if (LOSCFG_KERNEL_SMP == YES) +#if (LOSCFG_KERNEL_SMP == YES)//多核支持 PRINT_RELEASE("releasing %u secondary cores\n", LOSCFG_KERNEL_SMP_CORE_NUM - 1); - release_secondary_cores(); + release_secondary_cores();//让CPU其他核也开始工作,真正的并行开始了. #endif CPU_MAP_SET(0, OsHwIDGet()); - OsStart(); + OsStart();//内核初始化完成,正式开始工作 while (1) { - __asm volatile("wfi"); + __asm volatile("wfi");//让cpu进入idle状态 } } diff --git a/syscall/process_syscall.c b/syscall/process_syscall.c index 919c5fef..ede81553 100644 --- a/syscall/process_syscall.c +++ b/syscall/process_syscall.c @@ -197,13 +197,13 @@ int SysSchedGetParam(int id, int flag) return OsGetProcessPriority(LOS_PRIO_PROCESS, id); } - +//设置调度参数 int SysSchedSetParam(int id, unsigned int prio, int flag) { int ret; if (flag < 0) { - return -OsUserTaskSchedulerSet(id, LOS_SCHED_RR, prio, FALSE); + return -OsUserTaskSchedulerSet(id, LOS_SCHED_RR, prio, FALSE);//用户态任务调度设置 } if (prio < OS_USER_PROCESS_PRIORITY_HIGHEST) { @@ -219,9 +219,9 @@ int SysSchedSetParam(int id, unsigned int prio, int flag) return ret; } - return OsSetProcessScheduler(LOS_PRIO_PROCESS, id, prio, LOS_SCHED_RR, FALSE); + return OsSetProcessScheduler(LOS_PRIO_PROCESS, id, prio, LOS_SCHED_RR, FALSE);//设置进程调度参数 } - +//设置进程的优先级 int SysSetProcessPriority(int which, int who, unsigned int prio) { int ret; @@ -241,7 +241,7 @@ int SysSetProcessPriority(int which, int who, unsigned int prio) return OsSetProcessScheduler(which, who, prio, LOS_SCHED_RR, FALSE); } - +//获取进程优先级 int SysGetProcessPriority(int which, int who) { if (who == 0) { diff --git a/zzz/git/push.sh b/zzz/git/push.sh index 76111fad..12ee517a 100644 --- a/zzz/git/push.sh +++ b/zzz/git/push.sh @@ -1,6 +1,6 @@ git add -A -git commit -m '鸿蒙源码分析系列篇 https://blog.csdn.net/kuangyufei - https://my.oschina.net/u/3751245' +git commit -m '内存,进程,task模块注释基本完成. 正在更新: 进程间IPC通讯消息队列模块代码注释... +鸿蒙内核源码分析系列 https://blog.csdn.net/kuangyufei https://my.oschina.net/u/3751245' git push origin git push gitee_origin master git push github_origin master -- GitLab