diff --git a/arch/arm/arm/include/arch_config.h b/arch/arm/arm/include/arch_config.h index 3fb5f0c2c75c9063cd1c74779f03e9058107e566..183164a03f70343c2a6fbc5ee0281966376e9b19 100644 --- a/arch/arm/arm/include/arch_config.h +++ b/arch/arm/arm/include/arch_config.h @@ -64,9 +64,9 @@ #endif /* Initial bit32 stack value. */ -#define OS_STACK_INIT 0xCACACACA +#define OS_STACK_INIT 0xCACACACA //栈指针初始化值 0b 1010 1010 1010 /* Bit32 stack top magic number. */ -#define OS_STACK_MAGIC_WORD 0xCCCCCCCC +#define OS_STACK_MAGIC_WORD 0xCCCCCCCC //用于栈顶值,可标识为栈是否被使用过,神奇的 "烫烫烫烫"的根源所在! 0b 1100 1100 1100 #ifdef LOSCFG_GDB #define OS_EXC_UNDEF_STACK_SIZE 512 diff --git a/arch/arm/arm/include/los_hw_cpu.h b/arch/arm/arm/include/los_hw_cpu.h index 5585eebc7fe2118c7db0eb2a28cffd07b61f0f2c..100beffe126c07c2c937295bbc5007bb25d8cb03 100644 --- a/arch/arm/arm/include/los_hw_cpu.h +++ b/arch/arm/arm/include/los_hw_cpu.h @@ -87,7 +87,7 @@ extern "C" { * Identification registers (c0) */ #define MIDR CP15_REG(c0, 0, c0, 0) /* Main ID Register */ -#define MPIDR CP15_REG(c0, 0, c0, 5) /* Multiprocessor Affinity Register */ +#define MPIDR CP15_REG(c0, 0, c0, 5) /* Multiprocessor Affinity Register *///多处理器关联寄存器给每个CPU制定一个逻辑地址 #define CCSIDR CP15_REG(c0, 1, c0, 0) /* Cache Size ID Registers */ #define CLIDR CP15_REG(c0, 1, c0, 1) /* Cache Level ID Register */ #define VPIDR CP15_REG(c0, 4, c0, 0) /* Virtualization Processor ID Register */ @@ -141,12 +141,12 @@ STATIC INLINE VOID ArchCurrUserTaskSet(UINTPTR val) { ARM_SYSREG_WRITE(TPIDRURO, (UINT32)val); } - +//https://www.keil.com/pack/doc/cmsis/Core_A/html/group__CMSIS__MPIDR.html STATIC INLINE UINT32 ArchCurrCpuid(VOID) { -#if (LOSCFG_KERNEL_SMP == YES) +#if (LOSCFG_KERNEL_SMP == YES)//CPU多核情况 return ARM_SYSREG_READ(MPIDR) & MPIDR_CPUID_MASK; -#else +#else//ARM架构通过MPIDR(Multiprocessor Affinity Register)寄存器给每个CPU制定一个逻辑地址。 return 0; #endif } diff --git a/arch/arm/arm/src/los_hw.c b/arch/arm/arm/src/los_hw.c index d35ccf95a9d918185d6f76ae3b27f35ca2499e5b..ef2405fcc11db2e38e5b4aafd8ea140c9a329767 100644 --- a/arch/arm/arm/src/los_hw.c +++ b/arch/arm/arm/src/los_hw.c @@ -39,7 +39,7 @@ extern "C" { #endif /* __cplusplus */ /* support cpu vendors */ -CpuVendor g_cpuTable[] = { +CpuVendor g_cpuTable[] = {//支持的CPU供应商 /* armv7-a */ { 0xc07, "Cortex-A7" }, { 0xc09, "Cortex-A9" }, diff --git a/kernel/base/core/los_process.c b/kernel/base/core/los_process.c index 6be1792371463809b1640303de44ace6753c8f1f..c8d4239413d0028465bfd13ca31b634478ab7e04 100644 --- a/kernel/base/core/los_process.c +++ b/kernel/base/core/los_process.c @@ -607,21 +607,21 @@ LITE_OS_SEC_TEXT VOID OsProcessCBRecyleToFree(VOID) SCHEDULER_UNLOCK(intSave); } - +//获取一个可用的PCB(进程控制块) STATIC LosProcessCB *OsGetFreePCB(VOID) { LosProcessCB *processCB = NULL; UINT32 intSave; SCHEDULER_LOCK(intSave); - if (LOS_ListEmpty(&g_freeProcess)) { + if (LOS_ListEmpty(&g_freeProcess)) {//空闲池里还有未分配的task? SCHEDULER_UNLOCK(intSave); PRINT_ERR("No idle PCB in the system!\n"); return NULL; } - processCB = OS_PCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&g_freeProcess)); - LOS_ListDelete(&processCB->pendList); + processCB = OS_PCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&g_freeProcess));//拿到PCB,通过OS_PCB_FROM_PENDLIST是因为通过pendlist 节点挂在 freelist链表上. + LOS_ListDelete(&processCB->pendList);//分配出来了就要在freelist将自己摘除 SCHEDULER_UNLOCK(intSave); return processCB; @@ -1336,16 +1336,16 @@ ERROR: SCHEDULER_UNLOCK(intSave); return pid; } - +//设置进程组检查 STATIC UINT32 OsSetProcessGroupCheck(const LosProcessCB *processCB, UINT32 gid) { - LosProcessCB *runProcessCB = OsCurrProcessGet(); - LosProcessCB *groupProcessCB = OS_PCB_FROM_PID(gid); + LosProcessCB *runProcessCB = OsCurrProcessGet();//拿到当前运行进程 + LosProcessCB *groupProcessCB = OS_PCB_FROM_PID(gid);//通过组ID拿到组长PCB实体 - if (OsProcessIsInactive(processCB)) { + if (OsProcessIsInactive(processCB)) {//进程是否活动 return LOS_ESRCH; } - + //参数进程不在用户态或者组长不在用户态 if (!OsProcessIsUserMode(processCB) || !OsProcessIsUserMode(groupProcessCB)) { return LOS_EPERM; } diff --git a/kernel/base/core/los_task.c b/kernel/base/core/los_task.c index 71c26731144b1122fe3de42d791bece5eccf1f7d..70837fb44a08a19f35103f6dc4435adeff7c3539 100644 --- a/kernel/base/core/los_task.c +++ b/kernel/base/core/los_task.c @@ -335,8 +335,8 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsTaskInit(VOID) for (index = 0; index < g_taskMaxNum; index++) { g_taskCBArray[index].taskStatus = OS_TASK_STATUS_UNUSED; g_taskCBArray[index].taskID = index;//任务ID最大默认127 - LOS_ListTailInsert(&g_losFreeTask, &g_taskCBArray[index].pendList);//都插入空闲任务列表 - } + LOS_ListTailInsert(&g_losFreeTask, &g_taskCBArray[index].pendList);//都插入空闲任务列表 + }//注意:这里挂的是pendList节点,所以取TCB要通过 OS_TCB_FROM_PENDLIST 取. ret = OsPriQueueInit();//创建32个任务优先级队列,即32个双向循环链表 if (ret != LOS_OK) { @@ -352,32 +352,32 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsTaskInit(VOID) } return LOS_OK; } - +//获取IdletaskId,每个CPU核都对Task进行了内部管理,做到真正的并行处理 UINT32 OsGetIdleTaskId(VOID) { - Percpu *perCpu = OsPercpuGet(); - return perCpu->idleTaskID; + Percpu *perCpu = OsPercpuGet();//获取当前Cpu信息 + return perCpu->idleTaskID;//返回当前CPU 空闲任务ID } - +//创建一个空闲任务 LITE_OS_SEC_TEXT_INIT UINT32 OsIdleTaskCreate(VOID) { UINT32 ret; TSK_INIT_PARAM_S taskInitParam; - Percpu *perCpu = OsPercpuGet(); + Percpu *perCpu = OsPercpuGet();//获取CPU信息 UINT32 *idleTaskID = &perCpu->idleTaskID; - (VOID)memset_s((VOID *)(&taskInitParam), sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S)); - taskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)OsIdleTask; - taskInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE; - taskInitParam.pcName = "Idle"; - taskInitParam.usTaskPrio = OS_TASK_PRIORITY_LOWEST; - taskInitParam.uwResved = OS_TASK_FLAG_IDLEFLAG; -#if (LOSCFG_KERNEL_SMP == YES) - taskInitParam.usCpuAffiMask = CPUID_TO_AFFI_MASK(ArchCurrCpuid()); + (VOID)memset_s((VOID *)(&taskInitParam), sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));//任务初始参数清0 + taskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)OsIdleTask;//入口函数指定idle + taskInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE;//任务栈大小 + taskInitParam.pcName = "Idle";//任务名称 叫pcName有点怪怪的,不能换个撒 + taskInitParam.usTaskPrio = OS_TASK_PRIORITY_LOWEST;//默认最低优先级 31 + taskInitParam.uwResved = OS_TASK_FLAG_IDLEFLAG;//默认idle flag +#if (LOSCFG_KERNEL_SMP == YES)//CPU多核情况 + taskInitParam.usCpuAffiMask = CPUID_TO_AFFI_MASK(ArchCurrCpuid());//意思是归于哪个CPU核调度, #endif - ret = LOS_TaskCreate(idleTaskID, &taskInitParam); - OS_TCB_FROM_TID(*idleTaskID)->taskStatus |= OS_TASK_FLAG_SYSTEM_TASK; - + ret = LOS_TaskCreate(idleTaskID, &taskInitParam);//创建task并申请调度, + OS_TCB_FROM_TID(*idleTaskID)->taskStatus |= OS_TASK_FLAG_SYSTEM_TASK;//设置task状态为系统任务,系统任务运行在内核态. + //这里说下系统任务有哪些?比如: idle,swtmr(软时钟)等等 return ret; } @@ -398,7 +398,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_CurTaskIDGet(VOID) #if (LOSCFG_BASE_CORE_TSK_MONITOR == YES) LITE_OS_SEC_TEXT STATIC VOID OsTaskStackCheck(LosTaskCB *oldTask, LosTaskCB *newTask) { - if (!OS_STACK_MAGIC_CHECK(oldTask->topOfStack)) { + if (!OS_STACK_MAGIC_CHECK(oldTask->topOfStack)) {//magic检查无效情况 LOS_Panic("CURRENT task ID: %s:%d stack overflow!\n", oldTask->taskName, oldTask->taskID); } @@ -414,20 +414,20 @@ LITE_OS_SEC_TEXT STATIC VOID OsTaskStackCheck(LosTaskCB *oldTask, LosTaskCB *new } #endif - +//任务切换检查 LITE_OS_SEC_TEXT_MINOR UINT32 OsTaskSwitchCheck(LosTaskCB *oldTask, LosTaskCB *newTask) { -#if (LOSCFG_BASE_CORE_TSK_MONITOR == YES) - OsTaskStackCheck(oldTask, newTask); +#if (LOSCFG_BASE_CORE_TSK_MONITOR == YES)//这里宏指任务栈有没有启动监控 + OsTaskStackCheck(oldTask, newTask);//任务栈监控检查 #endif /* LOSCFG_BASE_CORE_TSK_MONITOR == YES */ #if (LOSCFG_KERNEL_TRACE == YES) - LOS_Trace(LOS_TRACE_SWITCH, newTask->taskID, oldTask->taskID); + LOS_Trace(LOS_TRACE_SWITCH, newTask->taskID, oldTask->taskID);//打印新老任务 #endif return LOS_OK; } - +//任务退出 LITE_OS_SEC_TEXT VOID OsTaskToExit(LosTaskCB *taskCB, UINT32 status) { UINT32 intSave; @@ -478,10 +478,10 @@ 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) { - taskCB->joinRetval = 0; + if (taskCB->taskStatus & OS_TASK_FLAG_DETACHED) {//task有分离标签时 + taskCB->joinRetval = 0;//结合数为0 } OsTaskToExit(taskCB, 0); @@ -766,21 +766,21 @@ LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCBInit(LosTaskCB *taskCB, const TSK_IN return LOS_OK; } - +//获取一个空闲TCB LITE_OS_SEC_TEXT LosTaskCB *OsGetFreeTaskCB(VOID) { UINT32 intSave; LosTaskCB *taskCB = NULL; SCHEDULER_LOCK(intSave); - if (LOS_ListEmpty(&g_losFreeTask)) { + if (LOS_ListEmpty(&g_losFreeTask)) {//全局空闲task为空 SCHEDULER_UNLOCK(intSave); PRINT_ERR("No idle TCB in the system!\n"); return NULL; } - taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&g_losFreeTask)); - LOS_ListDelete(LOS_DL_LIST_FIRST(&g_losFreeTask)); + taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&g_losFreeTask));//拿到第一节点并通过pendlist拿到完整的TCB + LOS_ListDelete(LOS_DL_LIST_FIRST(&g_losFreeTask));//从g_losFreeTask链表中摘除自己 SCHEDULER_UNLOCK(intSave); return taskCB; diff --git a/kernel/base/include/los_percpu_pri.h b/kernel/base/include/los_percpu_pri.h index ab0d860a5f5f320f4207262fbad8cb55f5bbb9bf..37e7c8da9b676772d57eaf75d0f8c074a31a28ef 100644 --- a/kernel/base/include/los_percpu_pri.h +++ b/kernel/base/include/los_percpu_pri.h @@ -66,7 +66,7 @@ typedef struct { } Percpu; /* the kernel per-cpu structure */ -extern Percpu g_percpu[LOSCFG_KERNEL_CORE_NUM]; +extern Percpu g_percpu[LOSCFG_KERNEL_CORE_NUM];//CPU核 STATIC INLINE Percpu *OsPercpuGet(VOID) { diff --git a/kernel/base/include/los_process_pri.h b/kernel/base/include/los_process_pri.h index 58fa84c58b02293cc6d80d246c1eabab16e8861f..7d29dd0694971dea864f7be87335a4b8398e53b2 100644 --- a/kernel/base/include/los_process_pri.h +++ b/kernel/base/include/los_process_pri.h @@ -239,7 +239,7 @@ typedef struct ProcessCB { * The process is dying or already dying. */ #define OS_PROCESS_STATUS_INACTIVE (OS_PROCESS_FLAG_EXIT | OS_PROCESS_STATUS_ZOMBIES) -//不活跃进程定义: 身上贴有退出便签且状态为僵死的进程 +//进程不活跃状态定义: 身上贴有退出便签且状态为僵死的进程 /** * @ingroup los_process * Used to check if the process control block is unused. @@ -256,7 +256,7 @@ STATIC INLINE BOOL OsProcessIsUnused(const LosProcessCB *processCB)//查下进 STATIC INLINE BOOL OsProcessIsInactive(const LosProcessCB *processCB)//查下进程是否不活跃? { return ((processCB->processStatus & (OS_PROCESS_FLAG_UNUSED | OS_PROCESS_STATUS_INACTIVE)) != 0); -} +}//进程不活跃函数定义:身上贴有不使用且不活跃标签的进程 /** * @ingroup los_process diff --git a/kernel/base/include/los_task_pri.h b/kernel/base/include/los_task_pri.h index 411bcca3f5dd766a11b082d57a3078e560b63649..1f810d4a2ed610d9793b34c0e8e7deaca642f58a 100644 --- a/kernel/base/include/los_task_pri.h +++ b/kernel/base/include/los_task_pri.h @@ -177,16 +177,16 @@ extern SPIN_LOCK_S g_taskSpin; * * The task is joinable. */ -#define OS_TASK_FLAG_PTHREAD_JOIN 0x0400U - +#define OS_TASK_FLAG_PTHREAD_JOIN 0x0400U //主task和子task连在一块不分离 +//一个可结合的线程能够被其他线程收回其资源和杀死。在被其他线程回收之前,它的存储器资源(例如栈)是不释放的。 /** * @ingroup los_task * Flag that indicates the task or task control block status. * * The task is status detached. */ -#define OS_TASK_FLAG_DETACHED 0x0800U - +#define OS_TASK_FLAG_DETACHED 0x0800U //任务分离 主task与子task分离,子task结束后,资源自动回收 +//一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。 /** * @ingroup los_task * Flag that indicates the task property. @@ -264,7 +264,7 @@ extern SPIN_LOCK_S g_taskSpin; * @see */ #define OS_TCB_FROM_PENDLIST(ptr) LOS_DL_LIST_ENTRY(ptr, LosTaskCB, pendList) - +//通过pendList取出TCB,用于挂入链表节点时使用 pendList的情况 /** * @ingroup los_task * @brief Obtain the pointer to a task control block. @@ -281,7 +281,7 @@ extern SPIN_LOCK_S g_taskSpin; * @see */ #define OS_TCB_FROM_TID(taskID) (((LosTaskCB *)g_taskCBArray) + (taskID)) - +//通过Tid找到TCB #ifndef LOSCFG_STACK_POINT_ALIGN_SIZE #define LOSCFG_STACK_POINT_ALIGN_SIZE (sizeof(UINTPTR) * 2) #endif diff --git a/kernel/base/misc/los_stackinfo.c b/kernel/base/misc/los_stackinfo.c index 566d0393a3b158ff53a6e5ec23563c5c10006f10..b48ef1971b46c3cc466c2e70cf67b589d83ad218 100644 --- a/kernel/base/misc/los_stackinfo.c +++ b/kernel/base/misc/los_stackinfo.c @@ -112,7 +112,7 @@ VOID OsExcStackInfoReg(const StackInfo *stackInfo, UINT32 stackNum) g_stackInfo = stackInfo; g_stackNum = stackNum; } - +//栈的初始化,设置固定的值. 0xcccccccc 和 0xcacacaca VOID OsStackInit(VOID *stacktop, UINT32 stacksize) { /* initialize the task stack, write magic num to stack top */ diff --git a/kernel/common/los_config.h b/kernel/common/los_config.h index be26d5670b525649972b7ba179471b6573a02874..e0a0312cf6d3bf0067b903de43dbe57e053c79ce 100644 --- a/kernel/common/los_config.h +++ b/kernel/common/los_config.h @@ -222,7 +222,7 @@ extern UINT32 __heap_end; // 堆区结束地址 * @ingroup los_config * Configuration item for task (stack) monitoring module tailoring */ -#ifndef LOSCFG_BASE_CORE_TSK_MONITOR +#ifndef LOSCFG_BASE_CORE_TSK_MONITOR //任务(栈)监控模块裁剪配置项 #define LOSCFG_BASE_CORE_TSK_MONITOR YES #endif diff --git a/zzz/datasheet/ARM720T.PDF b/zzz/datasheet/ARM720T.PDF new file mode 100644 index 0000000000000000000000000000000000000000..5441e82b01e557fa11911db913e33379a4f576cc Binary files /dev/null and b/zzz/datasheet/ARM720T.PDF differ diff --git a/zzz/datasheet/ARM920T.PDF b/zzz/datasheet/ARM920T.PDF new file mode 100644 index 0000000000000000000000000000000000000000..d97477ef4ac3577f2a4c103d1128665ede56da84 Binary files /dev/null and b/zzz/datasheet/ARM920T.PDF differ