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

对硬件中断部分源码注释,对CPU各个寄存器功能注释

鸿蒙内核源码分析系列 【 CSDN | OSCHINA | WIKI 】
鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓 】四大仓库每日同步更新代码和wiki
项目给鸿蒙内核源码逐行加上中文注解,详细阐述框架和代码细节, 精读 HarmonyOS 内核源码, 将迅速拔高对计算机整体理解,从此高屋建瓴看问题.
上级 03a811de
...@@ -49,7 +49,7 @@ extern "C" { ...@@ -49,7 +49,7 @@ extern "C" {
#error "OS_HWI_FORM_EXC_NUM must be zero" #error "OS_HWI_FORM_EXC_NUM must be zero"
#endif #endif
#ifdef LOSCFG_NO_SHARED_IRQ #ifdef LOSCFG_NO_SHARED_IRQ //不共享中断
#define HWI_IS_REGISTED(num) ((&g_hwiForm[num])->pfnHook != NULL) #define HWI_IS_REGISTED(num) ((&g_hwiForm[num])->pfnHook != NULL)
#else #else
#define HWI_IS_REGISTED(num) ((&g_hwiForm[num])->pstNext != NULL) #define HWI_IS_REGISTED(num) ((&g_hwiForm[num])->pstNext != NULL)
......
...@@ -48,71 +48,71 @@ LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_hwiSpin); ...@@ -48,71 +48,71 @@ LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_hwiSpin);
#define HWI_LOCK(state) LOS_SpinLockSave(&g_hwiSpin, &(state)) #define HWI_LOCK(state) LOS_SpinLockSave(&g_hwiSpin, &(state))
#define HWI_UNLOCK(state) LOS_SpinUnlockRestore(&g_hwiSpin, (state)) #define HWI_UNLOCK(state) LOS_SpinUnlockRestore(&g_hwiSpin, (state))
size_t g_intCount[LOSCFG_KERNEL_CORE_NUM] = {0}; size_t g_intCount[LOSCFG_KERNEL_CORE_NUM] = {0};//记录每个CPU core的中断数量
HwiHandleForm g_hwiForm[OS_HWI_MAX_NUM]; HwiHandleForm g_hwiForm[OS_HWI_MAX_NUM]; //记录每个硬件中断实体内容 @note_what 表用 form 来表示?有种写 HTML的感觉
STATIC CHAR *g_hwiFormName[OS_HWI_MAX_NUM] = {0}; STATIC CHAR *g_hwiFormName[OS_HWI_MAX_NUM] = {0};//记录每个硬中断的名称
STATIC UINT32 g_hwiFormCnt[OS_HWI_MAX_NUM] = {0}; STATIC UINT32 g_hwiFormCnt[OS_HWI_MAX_NUM] = {0};//记录每个硬中断的总数量
VOID OsIncHwiFormCnt(UINT32 index) VOID OsIncHwiFormCnt(UINT32 index) //增加一个中断数,递增的,所以只有++ ,没有--,
{ {
g_hwiFormCnt[index]++; g_hwiFormCnt[index]++;
} }
UINT32 OsGetHwiFormCnt(UINT32 index) UINT32 OsGetHwiFormCnt(UINT32 index)//获取某个中断的中断次数
{ {
return g_hwiFormCnt[index]; return g_hwiFormCnt[index];
} }
CHAR *OsGetHwiFormName(UINT32 index) CHAR *OsGetHwiFormName(UINT32 index)//获取某个中断的名称
{ {
return g_hwiFormName[index]; return g_hwiFormName[index];
} }
typedef VOID (*HWI_PROC_FUNC0)(VOID); typedef VOID (*HWI_PROC_FUNC0)(VOID);
typedef VOID (*HWI_PROC_FUNC2)(INT32, VOID *); typedef VOID (*HWI_PROC_FUNC2)(INT32, VOID *);
VOID OsInterrupt(UINT32 intNum) VOID OsInterrupt(UINT32 intNum)//中断实际处理函数
{ {
HwiHandleForm *hwiForm = NULL; HwiHandleForm *hwiForm = NULL;
UINT32 *intCnt = NULL; UINT32 *intCnt = NULL;
intCnt = &g_intCount[ArchCurrCpuid()]; intCnt = &g_intCount[ArchCurrCpuid()];//当前CPU的中断总数量 ++
*intCnt = *intCnt + 1; *intCnt = *intCnt + 1;
#ifdef LOSCFG_CPUP_INCLUDE_IRQ #ifdef LOSCFG_CPUP_INCLUDE_IRQ //开启查询系统CPU的占用率的中断
OsCpupIrqStart(); OsCpupIrqStart();
#endif #endif
#ifdef LOSCFG_KERNEL_TICKLESS #ifdef LOSCFG_KERNEL_TICKLESS
OsTicklessUpdate(intNum); OsTicklessUpdate(intNum);
#endif #endif
hwiForm = (&g_hwiForm[intNum]); hwiForm = (&g_hwiForm[intNum]);//获取对应中断的实体
#ifndef LOSCFG_NO_SHARED_IRQ #ifndef LOSCFG_NO_SHARED_IRQ //如果没有定义不共享中断 ,意思就是如果是共享中断
while (hwiForm->pstNext != NULL) { while (hwiForm->pstNext != NULL) { //一直撸到最后
hwiForm = hwiForm->pstNext; hwiForm = hwiForm->pstNext;//下一个继续撸
#endif #endif
if (hwiForm->uwParam) { if (hwiForm->uwParam) {//有参数的情况
HWI_PROC_FUNC2 func = (HWI_PROC_FUNC2)hwiForm->pfnHook; HWI_PROC_FUNC2 func = (HWI_PROC_FUNC2)hwiForm->pfnHook;//获取回调函数
if (func != NULL) { if (func != NULL) {
UINTPTR *param = (UINTPTR *)(hwiForm->uwParam); UINTPTR *param = (UINTPTR *)(hwiForm->uwParam);
func((INT32)(*param), (VOID *)(*(param + 1))); func((INT32)(*param), (VOID *)(*(param + 1)));//运行带参数的回调函数
} }
} else { } else {//木有参数的情况
HWI_PROC_FUNC0 func = (HWI_PROC_FUNC0)hwiForm->pfnHook; HWI_PROC_FUNC0 func = (HWI_PROC_FUNC0)hwiForm->pfnHook;//获取回调函数
if (func != NULL) { if (func != NULL) {
func(); func();//运行回调函数
} }
} }
#ifndef LOSCFG_NO_SHARED_IRQ #ifndef LOSCFG_NO_SHARED_IRQ
} }
#endif #endif
++g_hwiFormCnt[intNum]; ++g_hwiFormCnt[intNum];//中断数量计数器++
*intCnt = *intCnt - 1; *intCnt = *intCnt - 1; //@note_why 这里没看明白有什么要 -1
#ifdef LOSCFG_CPUP_INCLUDE_IRQ #ifdef LOSCFG_CPUP_INCLUDE_IRQ //开启查询系统CPU的占用率的中断
OsCpupIrqEnd(intNum); OsCpupIrqEnd(intNum);
#endif #endif
} }
//copy 硬中断参数
STATIC HWI_ARG_T OsHwiCpIrqParam(const HwiIrqParam *irqParam) STATIC HWI_ARG_T OsHwiCpIrqParam(const HwiIrqParam *irqParam)
{ {
HwiIrqParam *paramByAlloc = NULL; HwiIrqParam *paramByAlloc = NULL;
...@@ -134,16 +134,16 @@ STATIC UINT32 OsHwiDelNoShared(HWI_HANDLE_T hwiNum) ...@@ -134,16 +134,16 @@ STATIC UINT32 OsHwiDelNoShared(HWI_HANDLE_T hwiNum)
UINT32 intSave; UINT32 intSave;
HWI_LOCK(intSave); HWI_LOCK(intSave);
g_hwiForm[hwiNum].pfnHook = NULL; g_hwiForm[hwiNum].pfnHook = NULL;//回调函数直接NULL
if (g_hwiForm[hwiNum].uwParam) { if (g_hwiForm[hwiNum].uwParam) {//如有参数
(VOID)LOS_MemFree(m_aucSysMem0, (VOID *)g_hwiForm[hwiNum].uwParam); (VOID)LOS_MemFree(m_aucSysMem0, (VOID *)g_hwiForm[hwiNum].uwParam);//释放内存
} }
g_hwiForm[hwiNum].uwParam = 0; g_hwiForm[hwiNum].uwParam = 0; //NULL
HWI_UNLOCK(intSave); HWI_UNLOCK(intSave);
return LOS_OK; return LOS_OK;
} }
//创建一个不支持共享的中断
STATIC UINT32 OsHwiCreateNoShared(HWI_HANDLE_T hwiNum, HWI_MODE_T hwiMode, STATIC UINT32 OsHwiCreateNoShared(HWI_HANDLE_T hwiNum, HWI_MODE_T hwiMode,
HWI_PROC_FUNC hwiHandler, const HwiIrqParam *irqParam) HWI_PROC_FUNC hwiHandler, const HwiIrqParam *irqParam)
{ {
...@@ -152,14 +152,14 @@ STATIC UINT32 OsHwiCreateNoShared(HWI_HANDLE_T hwiNum, HWI_MODE_T hwiMode, ...@@ -152,14 +152,14 @@ STATIC UINT32 OsHwiCreateNoShared(HWI_HANDLE_T hwiNum, HWI_MODE_T hwiMode,
HWI_LOCK(intSave); HWI_LOCK(intSave);
if (g_hwiForm[hwiNum].pfnHook == NULL) { if (g_hwiForm[hwiNum].pfnHook == NULL) {
g_hwiForm[hwiNum].pfnHook = hwiHandler; g_hwiForm[hwiNum].pfnHook = hwiHandler;//记录上回调函数
retParam = OsHwiCpIrqParam(irqParam); retParam = OsHwiCpIrqParam(irqParam);//参数copy一份出来记录
if (retParam == LOS_NOK) { if (retParam == LOS_NOK) {
HWI_UNLOCK(intSave); HWI_UNLOCK(intSave);
return OS_ERRNO_HWI_NO_MEMORY; return OS_ERRNO_HWI_NO_MEMORY;
} }
g_hwiForm[hwiNum].uwParam = retParam; g_hwiForm[hwiNum].uwParam = retParam;//作为硬中断处理函数的参数
} else { } else {
HWI_UNLOCK(intSave); HWI_UNLOCK(intSave);
return OS_ERRNO_HWI_ALREADY_CREATED; return OS_ERRNO_HWI_ALREADY_CREATED;
...@@ -167,7 +167,7 @@ STATIC UINT32 OsHwiCreateNoShared(HWI_HANDLE_T hwiNum, HWI_MODE_T hwiMode, ...@@ -167,7 +167,7 @@ STATIC UINT32 OsHwiCreateNoShared(HWI_HANDLE_T hwiNum, HWI_MODE_T hwiMode,
HWI_UNLOCK(intSave); HWI_UNLOCK(intSave);
return LOS_OK; return LOS_OK;
} }
#else #else //删除一个共性的中断
STATIC UINT32 OsHwiDelShared(HWI_HANDLE_T hwiNum, const HwiIrqParam *irqParam) STATIC UINT32 OsHwiDelShared(HWI_HANDLE_T hwiNum, const HwiIrqParam *irqParam)
{ {
HwiHandleForm *hwiForm = NULL; HwiHandleForm *hwiForm = NULL;
...@@ -225,7 +225,7 @@ STATIC UINT32 OsHwiDelShared(HWI_HANDLE_T hwiNum, const HwiIrqParam *irqParam) ...@@ -225,7 +225,7 @@ STATIC UINT32 OsHwiDelShared(HWI_HANDLE_T hwiNum, const HwiIrqParam *irqParam)
HWI_UNLOCK(intSave); HWI_UNLOCK(intSave);
return LOS_OK; return LOS_OK;
} }
//创建一个共享硬件中断
STATIC UINT32 OsHwiCreateShared(HWI_HANDLE_T hwiNum, HWI_MODE_T hwiMode, STATIC UINT32 OsHwiCreateShared(HWI_HANDLE_T hwiNum, HWI_MODE_T hwiMode,
HWI_PROC_FUNC hwiHandler, const HwiIrqParam *irqParam) HWI_PROC_FUNC hwiHandler, const HwiIrqParam *irqParam)
{ {
...@@ -287,7 +287,7 @@ STATIC UINT32 OsHwiCreateShared(HWI_HANDLE_T hwiNum, HWI_MODE_T hwiMode, ...@@ -287,7 +287,7 @@ STATIC UINT32 OsHwiCreateShared(HWI_HANDLE_T hwiNum, HWI_MODE_T hwiMode,
/* /*
* Description : initialization of the hardware interrupt * Description : initialization of the hardware interrupt
*/ */
LITE_OS_SEC_TEXT_INIT VOID OsHwiInit(VOID) LITE_OS_SEC_TEXT_INIT VOID OsHwiInit(VOID)//硬件中断初始化
{ {
UINT32 hwiNum; UINT32 hwiNum;
...@@ -303,7 +303,7 @@ LITE_OS_SEC_TEXT_INIT VOID OsHwiInit(VOID) ...@@ -303,7 +303,7 @@ LITE_OS_SEC_TEXT_INIT VOID OsHwiInit(VOID)
return; return;
} }
//创建一个硬中断
LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiCreate(HWI_HANDLE_T hwiNum, LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiCreate(HWI_HANDLE_T hwiNum,
HWI_PRIOR_T hwiPrio, HWI_PRIOR_T hwiPrio,
HWI_MODE_T hwiMode, HWI_MODE_T hwiMode,
...@@ -313,21 +313,21 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiCreate(HWI_HANDLE_T hwiNum, ...@@ -313,21 +313,21 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiCreate(HWI_HANDLE_T hwiNum,
UINT32 ret; UINT32 ret;
(VOID)hwiPrio; (VOID)hwiPrio;
if (hwiHandler == NULL) { if (hwiHandler == NULL) {//中断处理函数不能为NULL
return OS_ERRNO_HWI_PROC_FUNC_NULL; return OS_ERRNO_HWI_PROC_FUNC_NULL;
} }
if ((hwiNum > OS_USER_HWI_MAX) || ((INT32)hwiNum < OS_USER_HWI_MIN)) { if ((hwiNum > OS_USER_HWI_MAX) || ((INT32)hwiNum < OS_USER_HWI_MIN)) {//中断数区间限制
return OS_ERRNO_HWI_NUM_INVALID; return OS_ERRNO_HWI_NUM_INVALID;
} }
#ifdef LOSCFG_NO_SHARED_IRQ #ifdef LOSCFG_NO_SHARED_IRQ //不支持共享中断
ret = OsHwiCreateNoShared(hwiNum, hwiMode, hwiHandler, irqParam); ret = OsHwiCreateNoShared(hwiNum, hwiMode, hwiHandler, irqParam);
#else #else
ret = OsHwiCreateShared(hwiNum, hwiMode, hwiHandler, irqParam); ret = OsHwiCreateShared(hwiNum, hwiMode, hwiHandler, irqParam);
#endif #endif
return ret; return ret;
} }
//删除一个硬中断
LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiDelete(HWI_HANDLE_T hwiNum, HwiIrqParam *irqParam) LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiDelete(HWI_HANDLE_T hwiNum, HwiIrqParam *irqParam)
{ {
UINT32 ret; UINT32 ret;
...@@ -336,7 +336,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiDelete(HWI_HANDLE_T hwiNum, HwiIrqParam *irq ...@@ -336,7 +336,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiDelete(HWI_HANDLE_T hwiNum, HwiIrqParam *irq
return OS_ERRNO_HWI_NUM_INVALID; return OS_ERRNO_HWI_NUM_INVALID;
} }
#ifdef LOSCFG_NO_SHARED_IRQ #ifdef LOSCFG_NO_SHARED_IRQ //不支持共享中断
ret = OsHwiDelNoShared(hwiNum); ret = OsHwiDelNoShared(hwiNum);
#else #else
ret = OsHwiDelShared(hwiNum, irqParam); ret = OsHwiDelShared(hwiNum, irqParam);
......
...@@ -212,19 +212,19 @@ extern size_t g_intCount[]; ...@@ -212,19 +212,19 @@ extern size_t g_intCount[];
/** /**
* @ingroup los_hwi * @ingroup los_hwi
* Define the type of a hardware interrupt number. * Define the type of a hardware interrupt number. //定义硬件中断号的类型
*/ */
typedef UINT32 HWI_HANDLE_T; typedef UINT32 HWI_HANDLE_T;
/** /**
* @ingroup los_hwi * @ingroup los_hwi
* Define the type of a hardware interrupt priority. * Define the type of a hardware interrupt priority. //定义硬件中断优先级的类型
*/ */
typedef UINT16 HWI_PRIOR_T; typedef UINT16 HWI_PRIOR_T; //定义
/** /**
* @ingroup los_hwi * @ingroup los_hwi
* Define the type of hardware interrupt mode configurations. * Define the type of hardware interrupt mode configurations. //定义硬件中断配置的类型
*/ */
typedef UINT16 HWI_MODE_T; typedef UINT16 HWI_MODE_T;
...@@ -232,12 +232,12 @@ typedef UINT16 HWI_MODE_T; ...@@ -232,12 +232,12 @@ typedef UINT16 HWI_MODE_T;
* @ingroup los_hwi * @ingroup los_hwi
* Define the type of the parameter used for the hardware interrupt creation function. * Define the type of the parameter used for the hardware interrupt creation function.
* The function of this parameter varies among platforms. * The function of this parameter varies among platforms.
*/ */ //定义用于硬件中断创建功能的参数类型。此参数的功能因平台而异
typedef UINTPTR HWI_ARG_T; typedef UINTPTR HWI_ARG_T;
/** /**
* @ingroup los_hwi * @ingroup los_hwi
* Define the type of a hardware interrupt handling function. * Define the type of a hardware interrupt handling function. //定义硬件中断处理函数的类型
*/ */
typedef VOID (*HWI_PROC_FUNC)(VOID); typedef VOID (*HWI_PROC_FUNC)(VOID);
...@@ -247,21 +247,21 @@ typedef VOID (*HWI_PROC_FUNC)(VOID); ...@@ -247,21 +247,21 @@ typedef VOID (*HWI_PROC_FUNC)(VOID);
* *
* IRQF_SHARED - allow sharing the irq among several devices * IRQF_SHARED - allow sharing the irq among several devices
*/ */
#define IRQF_SHARED 0x8000U #define IRQF_SHARED 0x8000U //IRQF_SHARED-允许在多个设备之间共享irq
typedef struct tagHwiHandleForm { typedef struct tagHwiHandleForm {
HWI_PROC_FUNC pfnHook; HWI_PROC_FUNC pfnHook; //中断处理函数
HWI_ARG_T uwParam; HWI_ARG_T uwParam; //中断处理函数参数
struct tagHwiHandleForm *pstNext; struct tagHwiHandleForm *pstNext; //节点,指向下一个中断
} HwiHandleForm; } HwiHandleForm;
typedef struct tagIrqParam { typedef struct tagIrqParam { //中断参数
int swIrq; int swIrq; // 软件中断
VOID *pDevId; VOID *pDevId; // 设备ID
const CHAR *pName; const CHAR *pName; //名称
} HwiIrqParam; } HwiIrqParam;
extern HwiHandleForm g_hwiForm[OS_HWI_MAX_NUM]; extern HwiHandleForm g_hwiForm[OS_HWI_MAX_NUM];//最大中断数量,OS_HWI_MAX_NUM 见于 ..\vendor_hisi_hi3861_hi3861\hi3861\platform\os\Huawei_LiteOS\arch\los_hwi.h
/** /**
* @ingroup los_hwi * @ingroup los_hwi
......
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
extern "C" { extern "C" {
#endif #endif
#endif /* __cplusplus */ #endif /* __cplusplus */
//*kfy 0x80000000U = 10000000000000000000000000000000(32个0) // 0x80000000U = 10000000000000000000000000000000(32个0)
#define PRIQUEUE_PRIOR0_BIT 0x80000000U #define PRIQUEUE_PRIOR0_BIT 0x80000000U
LITE_OS_SEC_BSS LOS_DL_LIST *g_priQueueList = NULL;//队列链表 LITE_OS_SEC_BSS LOS_DL_LIST *g_priQueueList = NULL;//队列链表
...@@ -84,11 +84,11 @@ VOID OsPriQueueEnqueueHead(LOS_DL_LIST *priQueueList, UINT32 *bitMap, LOS_DL_LIS ...@@ -84,11 +84,11 @@ VOID OsPriQueueEnqueueHead(LOS_DL_LIST *priQueueList, UINT32 *bitMap, LOS_DL_LIS
*/ */
LOS_ASSERT(priqueueItem->pstNext == NULL); LOS_ASSERT(priqueueItem->pstNext == NULL);
if (LOS_ListEmpty(&priQueueList[priority])) { if (LOS_ListEmpty(&priQueueList[priority])) {//队列不为空
*bitMap |= PRIQUEUE_PRIOR0_BIT >> priority; *bitMap |= PRIQUEUE_PRIOR0_BIT >> priority;//位图调度器上记录优先级
} }
LOS_ListHeadInsert(&priQueueList[priority], priqueueItem); LOS_ListHeadInsert(&priQueueList[priority], priqueueItem);//从头部插入
} }
VOID OsPriQueueEnqueue(LOS_DL_LIST *priQueueList, UINT32 *bitMap, LOS_DL_LIST *priqueueItem, UINT32 priority) VOID OsPriQueueEnqueue(LOS_DL_LIST *priQueueList, UINT32 *bitMap, LOS_DL_LIST *priqueueItem, UINT32 priority)
...@@ -100,21 +100,21 @@ VOID OsPriQueueEnqueue(LOS_DL_LIST *priQueueList, UINT32 *bitMap, LOS_DL_LIST *p ...@@ -100,21 +100,21 @@ VOID OsPriQueueEnqueue(LOS_DL_LIST *priQueueList, UINT32 *bitMap, LOS_DL_LIST *p
*/ */
LOS_ASSERT(priqueueItem->pstNext == NULL); LOS_ASSERT(priqueueItem->pstNext == NULL);
if (LOS_ListEmpty(&priQueueList[priority])) { if (LOS_ListEmpty(&priQueueList[priority])) {////队列不为空
*bitMap |= PRIQUEUE_PRIOR0_BIT >> priority;//移到对应位 *bitMap |= PRIQUEUE_PRIOR0_BIT >> priority;//位图调度器上记录优先级
} }
LOS_ListTailInsert(&priQueueList[priority], priqueueItem); LOS_ListTailInsert(&priQueueList[priority], priqueueItem);//从尾部插入
} }
//出队列
VOID OsPriQueueDequeue(LOS_DL_LIST *priQueueList, UINT32 *bitMap, LOS_DL_LIST *priqueueItem) VOID OsPriQueueDequeue(LOS_DL_LIST *priQueueList, UINT32 *bitMap, LOS_DL_LIST *priqueueItem)
{ {
LosTaskCB *task = NULL; LosTaskCB *task = NULL;
LOS_ListDelete(priqueueItem); LOS_ListDelete(priqueueItem);//将item从队列中摘除
task = LOS_DL_LIST_ENTRY(priqueueItem, LosTaskCB, pendList); task = LOS_DL_LIST_ENTRY(priqueueItem, LosTaskCB, pendList);//通过pendList节点,找到task
if (LOS_ListEmpty(&priQueueList[task->priority])) { if (LOS_ListEmpty(&priQueueList[task->priority])) {//队列不为空时
*bitMap &= ~(PRIQUEUE_PRIOR0_BIT >> task->priority); *bitMap &= ~(PRIQUEUE_PRIOR0_BIT >> task->priority);//位图调度器上记录优先级
} }
} }
...@@ -128,7 +128,7 @@ VOID OsPriQueueProcessDequeue(LOS_DL_LIST *priqueueItem) ...@@ -128,7 +128,7 @@ VOID OsPriQueueProcessDequeue(LOS_DL_LIST *priqueueItem)
g_priQueueBitmap &= ~(PRIQUEUE_PRIOR0_BIT >> runProcess->priority); g_priQueueBitmap &= ~(PRIQUEUE_PRIOR0_BIT >> runProcess->priority);
} }
} }
//队列大小
UINT32 OsPriQueueProcessSize(LOS_DL_LIST *priQueueList, UINT32 priority) UINT32 OsPriQueueProcessSize(LOS_DL_LIST *priQueueList, UINT32 priority)
{ {
UINT32 itemCnt = 0; UINT32 itemCnt = 0;
...@@ -137,7 +137,7 @@ UINT32 OsPriQueueProcessSize(LOS_DL_LIST *priQueueList, UINT32 priority) ...@@ -137,7 +137,7 @@ UINT32 OsPriQueueProcessSize(LOS_DL_LIST *priQueueList, UINT32 priority)
LOS_ASSERT(OsIntLocked()); LOS_ASSERT(OsIntLocked());
LOS_ASSERT(LOS_SpinHeld(&g_taskSpin)); LOS_ASSERT(LOS_SpinHeld(&g_taskSpin));
LOS_DL_LIST_FOR_EACH(curNode, &priQueueList[priority]) { LOS_DL_LIST_FOR_EACH(curNode, &priQueueList[priority]) {//遍历队列
++itemCnt; ++itemCnt;
} }
...@@ -158,7 +158,7 @@ UINT32 OsPriQueueSize(LOS_DL_LIST *priQueueList, UINT32 priority) ...@@ -158,7 +158,7 @@ UINT32 OsPriQueueSize(LOS_DL_LIST *priQueueList, UINT32 priority)
LOS_DL_LIST_FOR_EACH(curNode, &priQueueList[priority]) {//循环查找这优先级的数量 LOS_DL_LIST_FOR_EACH(curNode, &priQueueList[priority]) {//循环查找这优先级的数量
#if (LOSCFG_KERNEL_SMP == YES) #if (LOSCFG_KERNEL_SMP == YES)
task = OS_TCB_FROM_PENDLIST(curNode);//找到task task = OS_TCB_FROM_PENDLIST(curNode);//通过pendList节点找到task
if (!(task->cpuAffiMask & (1U << cpuID))) {//属不属于当前CPU if (!(task->cpuAffiMask & (1U << cpuID))) {//属不属于当前CPU
continue; continue;
} }
...@@ -175,7 +175,7 @@ LOS_DL_LIST *OsTaskPriQueueTop(VOID) ...@@ -175,7 +175,7 @@ LOS_DL_LIST *OsTaskPriQueueTop(VOID)
LosProcessCB *processCB = LOS_DL_LIST_ENTRY(OsPriQueueTop(g_priQueueList, &g_priQueueBitmap), LosProcessCB *processCB = LOS_DL_LIST_ENTRY(OsPriQueueTop(g_priQueueList, &g_priQueueBitmap),
LosProcessCB, LosProcessCB,
pendList); pendList);
return OsPriQueueTop(processCB->threadPriQueueList, &processCB->threadScheduleMap); return OsPriQueueTop(processCB->threadPriQueueList, &processCB->threadScheduleMap);//获取进程就绪队列中优先级最高的task
} }
STATIC INLINE VOID OsDequeEmptySchedMap(LosProcessCB *processCB) STATIC INLINE VOID OsDequeEmptySchedMap(LosProcessCB *processCB)
...@@ -185,7 +185,7 @@ STATIC INLINE VOID OsDequeEmptySchedMap(LosProcessCB *processCB) ...@@ -185,7 +185,7 @@ STATIC INLINE VOID OsDequeEmptySchedMap(LosProcessCB *processCB)
OsPriQueueProcessDequeue(&processCB->pendList); OsPriQueueProcessDequeue(&processCB->pendList);
} }
} }
//这个函数留给大家看,内核最美函数 获取优先级最高的task,了解了这个函数就了解了调度的机制
LITE_OS_SEC_TEXT_MINOR LosTaskCB *OsGetTopTask(VOID) LITE_OS_SEC_TEXT_MINOR LosTaskCB *OsGetTopTask(VOID)
{ {
UINT32 priority, processPriority; UINT32 priority, processPriority;
......
...@@ -506,14 +506,14 @@ LITE_OS_SEC_TEXT UINT32 OsAllCpuUsageUnsafe(UINT16 maxNum, CPUP_INFO_S *cpupInfo ...@@ -506,14 +506,14 @@ LITE_OS_SEC_TEXT UINT32 OsAllCpuUsageUnsafe(UINT16 maxNum, CPUP_INFO_S *cpupInfo
OsProcessCycleStart(); OsProcessCycleStart();
return LOS_OK; return LOS_OK;
} }
// shell cpup 命令,查看所有CPU的使用情况 89.9%
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_AllCpuUsage(UINT16 maxNum, CPUP_INFO_S *cpupInfo, UINT16 mode, UINT16 flag) LITE_OS_SEC_TEXT_MINOR UINT32 LOS_AllCpuUsage(UINT16 maxNum, CPUP_INFO_S *cpupInfo, UINT16 mode, UINT16 flag)
{ {
UINT32 intSave; UINT32 intSave;
UINT32 ret; UINT32 ret;
SCHEDULER_LOCK(intSave); SCHEDULER_LOCK(intSave);
ret = OsAllCpuUsageUnsafe(maxNum, cpupInfo, mode, flag); ret = OsAllCpuUsageUnsafe(maxNum, cpupInfo, mode, flag);//所有CPU使用情况
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
return ret; return ret;
......
...@@ -72,7 +72,7 @@ UINT32 HalCurIrqGet(VOID) ...@@ -72,7 +72,7 @@ UINT32 HalCurIrqGet(VOID)
{ {
return g_curIrqNum; return g_curIrqNum;
} }
//屏蔽中断
VOID HalIrqMask(UINT32 vector) VOID HalIrqMask(UINT32 vector)
{ {
if ((vector > OS_USER_HWI_MAX) || (vector < OS_USER_HWI_MIN)) { if ((vector > OS_USER_HWI_MAX) || (vector < OS_USER_HWI_MIN)) {
...@@ -81,7 +81,7 @@ VOID HalIrqMask(UINT32 vector) ...@@ -81,7 +81,7 @@ VOID HalIrqMask(UINT32 vector)
GIC_REG_32(GICD_ICENABLER(vector / 32)) = 1U << (vector % 32); GIC_REG_32(GICD_ICENABLER(vector / 32)) = 1U << (vector % 32);
} }
//解除屏蔽
VOID HalIrqUnmask(UINT32 vector) VOID HalIrqUnmask(UINT32 vector)
{ {
if ((vector > OS_USER_HWI_MAX) || (vector < OS_USER_HWI_MIN)) { if ((vector > OS_USER_HWI_MAX) || (vector < OS_USER_HWI_MIN)) {
...@@ -104,36 +104,36 @@ VOID HalIrqClear(UINT32 vector) ...@@ -104,36 +104,36 @@ VOID HalIrqClear(UINT32 vector)
{ {
GIC_REG_32(GICC_EOIR) = vector; GIC_REG_32(GICC_EOIR) = vector;
} }
//给每个CPU core初始化硬件中断
VOID HalIrqInitPercpu(VOID) VOID HalIrqInitPercpu(VOID)
{ {
/* unmask interrupts */ /* unmask interrupts */ //取消屏蔽中断
GIC_REG_32(GICC_PMR) = 0xFF; GIC_REG_32(GICC_PMR) = 0xFF;
/* enable gic cpu interface */ /* enable gic cpu interface */ //启用gic cpu接口
GIC_REG_32(GICC_CTLR) = 1; GIC_REG_32(GICC_CTLR) = 1;
} }
//硬件中断初始化
VOID HalIrqInit(VOID) VOID HalIrqInit(VOID)
{ {
UINT32 i; UINT32 i;
/* set externel interrupts to be level triggered, active low. */ /* set externel interrupts to be level triggered, active low. */ //将外部中断设置为电平触发,低电平激活
for (i = 32; i < OS_HWI_MAX_NUM; i += 16) { for (i = 32; i < OS_HWI_MAX_NUM; i += 16) {
GIC_REG_32(GICD_ICFGR(i / 16)) = 0; GIC_REG_32(GICD_ICFGR(i / 16)) = 0;
} }
/* set externel interrupts to CPU 0 */ /* set externel interrupts to CPU 0 */ //将外部中断设置为CPU 0
for (i = 32; i < OS_HWI_MAX_NUM; i += 4) { for (i = 32; i < OS_HWI_MAX_NUM; i += 4) {
GIC_REG_32(GICD_ITARGETSR(i / 4)) = 0x01010101; GIC_REG_32(GICD_ITARGETSR(i / 4)) = 0x01010101;
} }
/* set priority on all interrupts */ /* set priority on all interrupts */ //设置所有中断的优先级
for (i = 0; i < OS_HWI_MAX_NUM; i += 4) { for (i = 0; i < OS_HWI_MAX_NUM; i += 4) {
GIC_REG_32(GICD_IPRIORITYR(i / 4)) = GICD_INT_DEF_PRI_X4; GIC_REG_32(GICD_IPRIORITYR(i / 4)) = GICD_INT_DEF_PRI_X4;
} }
/* disable all interrupts. */ /* disable all interrupts. */ //禁用所有中断。
for (i = 0; i < OS_HWI_MAX_NUM; i += 32) { for (i = 0; i < OS_HWI_MAX_NUM; i += 32) {
GIC_REG_32(GICD_ICENABLER(i / 32)) = ~0; GIC_REG_32(GICD_ICENABLER(i / 32)) = ~0;
} }
...@@ -151,7 +151,7 @@ VOID HalIrqInit(VOID) ...@@ -151,7 +151,7 @@ VOID HalIrqInit(VOID)
LOS_HwiCreate(LOS_MP_IPI_HALT, 0xa0, 0, OsMpScheduleHandler, 0);//中断处理函数 LOS_HwiCreate(LOS_MP_IPI_HALT, 0xa0, 0, OsMpScheduleHandler, 0);//中断处理函数
#endif #endif
} }
//硬中断处理函数,这里由硬件触发
VOID HalIrqHandler(VOID) VOID HalIrqHandler(VOID)
{ {
UINT32 iar = GIC_REG_32(GICC_IAR); UINT32 iar = GIC_REG_32(GICC_IAR);
......
...@@ -243,18 +243,18 @@ UINT32 HalCurIrqGet(VOID) ...@@ -243,18 +243,18 @@ UINT32 HalCurIrqGet(VOID)
{ {
return g_curIrqNum; return g_curIrqNum;
} }
//屏蔽所有CPU的硬件中断
VOID HalIrqMask(UINT32 vector) VOID HalIrqMask(UINT32 vector)
{ {
INT32 i; INT32 i;
const UINT32 mask = 1U << (vector % 32); const UINT32 mask = 1U << (vector % 32);//通过参数获取掩码
if ((vector > OS_USER_HWI_MAX) || (vector < OS_USER_HWI_MIN)) { if ((vector > OS_USER_HWI_MAX) || (vector < OS_USER_HWI_MIN)) {
return; return;
} }
if (vector < 32) { if (vector < 32) {
for (i = 0; i < LOSCFG_KERNEL_CORE_NUM; i++) { for (i = 0; i < LOSCFG_KERNEL_CORE_NUM; i++) {//
GIC_REG_32(GICR_ICENABLER0(i)) = mask; GIC_REG_32(GICR_ICENABLER0(i)) = mask;
GicWaitForRwp(GICR_CTLR(i)); GicWaitForRwp(GICR_CTLR(i));
} }
...@@ -263,7 +263,7 @@ VOID HalIrqMask(UINT32 vector) ...@@ -263,7 +263,7 @@ VOID HalIrqMask(UINT32 vector)
GicWaitForRwp(GICD_CTLR); GicWaitForRwp(GICD_CTLR);
} }
} }
//取消屏蔽硬件中断
VOID HalIrqUnmask(UINT32 vector) VOID HalIrqUnmask(UINT32 vector)
{ {
INT32 i; INT32 i;
......
...@@ -35,7 +35,19 @@ ...@@ -35,7 +35,19 @@
#include "stdint.h" #include "stdint.h"
#include "asm/platform.h" #include "asm/platform.h"
#include "los_config.h" #include "los_config.h"
/*************************************************************************************
*
* GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器,
* 其architecture specification目前有四个版本,
* V1~V4(V2最多支持8个ARM core,V3/V4支持更多的ARM core,主要用于ARM64服务器系统结构
* GIC-v2支持三种类型的中断
* PPI:私有外设中断(Private Peripheral Interrupt),是每个CPU私有的中断。最多支持16个PPI中断,
* 硬件中断号从ID16~ID31。PPI通常会送达到指定的CPU上,应用场景有CPU本地时钟。
* SPI:公用外设中断(Shared Peripheral Interrupt),最多可以支持988个外设中断,硬件中断号从ID32~ID1019。
* SGI:软件触发中断(Software Generated Interrupt)通常用于多核间通讯,最多支持16个SGI中断,硬件中断号从ID0~ID15。
* SGI通常在内核中被用作 IPI 中断(inter-processor interrupts),并会送达到系统指定的CPU上。
**************************************************************************************/
/* gic arch revision */ /* gic arch revision */
enum { enum {
GICV1 = 1, GICV1 = 1,
...@@ -48,37 +60,37 @@ enum { ...@@ -48,37 +60,37 @@ enum {
#define GIC_REV_OFFSET 0x4 #define GIC_REV_OFFSET 0x4
#ifdef LOSCFG_PLATFORM_BSP_GIC_V2 #ifdef LOSCFG_PLATFORM_BSP_GIC_V2
#define GICC_CTLR (GICC_OFFSET + 0x00) /* CPU Interface Control Register */ #define GICC_CTLR (GICC_OFFSET + 0x00) /* CPU Interface Control Register */ //CPU接口控制寄存器
#define GICC_PMR (GICC_OFFSET + 0x04) /* Interrupt Priority Mask Register */ #define GICC_PMR (GICC_OFFSET + 0x04) /* Interrupt Priority Mask Register */ //中断优先级屏蔽寄存器
#define GICC_BPR (GICC_OFFSET + 0x08) /* Binary Point Register */ #define GICC_BPR (GICC_OFFSET + 0x08) /* Binary Point Register */ //二进制点寄存器
#define GICC_IAR (GICC_OFFSET + 0x0c) /* Interrupt Acknowledge Register */ #define GICC_IAR (GICC_OFFSET + 0x0c) /* Interrupt Acknowledge Register */ //中断确认寄存器
#define GICC_EOIR (GICC_OFFSET + 0x10) /* End of Interrupt Register */ #define GICC_EOIR (GICC_OFFSET + 0x10) /* End of Interrupt Register */ //中断结尾寄存器
#define GICC_RPR (GICC_OFFSET + 0x14) /* Running Priority Register */ #define GICC_RPR (GICC_OFFSET + 0x14) /* Running Priority Register */ //运行优先寄存器
#define GICC_HPPIR (GICC_OFFSET + 0x18) /* Highest Priority Pending Interrupt Register */ #define GICC_HPPIR (GICC_OFFSET + 0x18) /* Highest Priority Pending Interrupt Register */ //最高优先级挂起中断寄存器
#endif #endif
#define GICD_CTLR (GICD_OFFSET + 0x000) /* Distributor Control Register */ #define GICD_CTLR (GICD_OFFSET + 0x000) /* Distributor Control Register */ //仲裁控制寄存器
#define GICD_TYPER (GICD_OFFSET + 0x004) /* Interrupt Controller Type Register */ #define GICD_TYPER (GICD_OFFSET + 0x004) /* Interrupt Controller Type Register */ //中断控制器类型寄存器
#define GICD_IIDR (GICD_OFFSET + 0x008) /* Distributor Implementer Identification Register */ #define GICD_IIDR (GICD_OFFSET + 0x008) /* Distributor Implementer Identification Register */ //仲裁身份寄存器
#define GICD_IGROUPR(n) (GICD_OFFSET + 0x080 + (n) * 4) /* Interrupt Group Registers */ #define GICD_IGROUPR(n) (GICD_OFFSET + 0x080 + (n) * 4) /* Interrupt Group Registers */ //中断组寄存器
#define GICD_ISENABLER(n) (GICD_OFFSET + 0x100 + (n) * 4) /* Interrupt Set-Enable Registers */ #define GICD_ISENABLER(n) (GICD_OFFSET + 0x100 + (n) * 4) /* Interrupt Set-Enable Registers */ //中断设置使能寄存器
#define GICD_ICENABLER(n) (GICD_OFFSET + 0x180 + (n) * 4) /* Interrupt Clear-Enable Registers */ #define GICD_ICENABLER(n) (GICD_OFFSET + 0x180 + (n) * 4) /* Interrupt Clear-Enable Registers */ //中断清除使能寄存器
#define GICD_ISPENDR(n) (GICD_OFFSET + 0x200 + (n) * 4) /* Interrupt Set-Pending Registers */ #define GICD_ISPENDR(n) (GICD_OFFSET + 0x200 + (n) * 4) /* Interrupt Set-Pending Registers */ //中断设置挂起寄存器
#define GICD_ICPENDR(n) (GICD_OFFSET + 0x280 + (n) * 4) /* Interrupt Clear-Pending Registers */ #define GICD_ICPENDR(n) (GICD_OFFSET + 0x280 + (n) * 4) /* Interrupt Clear-Pending Registers */ //中断清除挂起寄存器
#define GICD_ISACTIVER(n) (GICD_OFFSET + 0x300 + (n) * 4) /* GICv2 Interrupt Set-Active Registers */ #define GICD_ISACTIVER(n) (GICD_OFFSET + 0x300 + (n) * 4) /* GICv2 Interrupt Set-Active Registers */ //GICv2中断设置激活寄存器
#define GICD_ICACTIVER(n) (GICD_OFFSET + 0x380 + (n) * 4) /* Interrupt Clear-Active Registers */ #define GICD_ICACTIVER(n) (GICD_OFFSET + 0x380 + (n) * 4) /* Interrupt Clear-Active Registers */ //GICv2中断清除激活寄存器
#define GICD_IPRIORITYR(n) (GICD_OFFSET + 0x400 + (n) * 4) /* Interrupt Priority Registers */ #define GICD_IPRIORITYR(n) (GICD_OFFSET + 0x400 + (n) * 4) /* Interrupt Priority Registers */ //中断优先级寄存器
#define GICD_ITARGETSR(n) (GICD_OFFSET + 0x800 + (n) * 4) /* Interrupt Processor Targets Registers */ #define GICD_ITARGETSR(n) (GICD_OFFSET + 0x800 + (n) * 4) /* Interrupt Processor Targets Registers */ //中断处理器目标寄存器
#define GICD_ICFGR(n) (GICD_OFFSET + 0xc00 + (n) * 4) /* Interrupt Configuration Registers */ #define GICD_ICFGR(n) (GICD_OFFSET + 0xc00 + (n) * 4) /* Interrupt Configuration Registers */ //中断配置寄存器
#define GICD_SGIR (GICD_OFFSET + 0xf00) /* Software Generated Interrupt Register */ #define GICD_SGIR (GICD_OFFSET + 0xf00) /* Software Generated Interrupt Register */ //由软件产生的中断寄存器
#define GICD_CPENDSGIR(n) (GICD_OFFSET + 0xf10 + (n) * 4) /* SGI Clear-Pending Registers; NOT available on cortex-a9 */ #define GICD_CPENDSGIR(n) (GICD_OFFSET + 0xf10 + (n) * 4) /* SGI Clear-Pending Registers; NOT available on cortex-a9 */ //SGI清除挂起寄存器;在cortex-a9上不可用
#define GICD_SPENDSGIR(n) (GICD_OFFSET + 0xf20 + (n) * 4) /* SGI Set-Pending Registers; NOT available on cortex-a9 */ #define GICD_SPENDSGIR(n) (GICD_OFFSET + 0xf20 + (n) * 4) /* SGI Set-Pending Registers; NOT available on cortex-a9 */ //SGI设置挂起寄存器;在cortex-a9上不可用
#define GICD_PIDR2V2 (GICD_OFFSET + 0xfe8) #define GICD_PIDR2V2 (GICD_OFFSET + 0xfe8)
#define GICD_PIDR2V3 (GICD_OFFSET + 0xffe8) #define GICD_PIDR2V3 (GICD_OFFSET + 0xffe8)
#ifdef LOSCFG_PLATFORM_BSP_GIC_V3 #ifdef LOSCFG_PLATFORM_BSP_GIC_V3
#define GICD_IGRPMODR(n) (GICD_OFFSET + 0x0d00 + (n) * 4) /* Interrupt Group Mode Reisters */ #define GICD_IGRPMODR(n) (GICD_OFFSET + 0x0d00 + (n) * 4) /* Interrupt Group Mode Registers */ //中断组模式寄存器
#define GICD_IROUTER(n) (GICD_OFFSET + 0x6000 + (n) * 8) /* Interrupt Rounter Reisters */ #define GICD_IROUTER(n) (GICD_OFFSET + 0x6000 + (n) * 8) /* Interrupt Rounter Registers */ //中断阻断寄存器
#endif #endif
#define GIC_REG_8(reg) (*(volatile UINT8 *)((UINTPTR)(GIC_BASE_ADDR + (reg)))) #define GIC_REG_8(reg) (*(volatile UINT8 *)((UINTPTR)(GIC_BASE_ADDR + (reg))))
......
...@@ -759,7 +759,7 @@ static int GetGroups(int size, int list[]) ...@@ -759,7 +759,7 @@ static int GetGroups(int size, int list[])
return groupCount; return groupCount;
} }
#endif #endif
//系统调用之获取组
int SysGetGroups(int size, int list[]) int SysGetGroups(int size, int list[])
{ {
#ifdef LOSCFG_SECURITY_CAPABILITY #ifdef LOSCFG_SECURITY_CAPABILITY
...@@ -785,7 +785,7 @@ int SysGetGroups(int size, int list[]) ...@@ -785,7 +785,7 @@ int SysGetGroups(int size, int list[])
return groupCount; return groupCount;
#endif #endif
} }
//系统调用之设置组
int SysSetGroups(int size, int list[]) int SysSetGroups(int size, int list[])
{ {
#ifdef LOSCFG_SECURITY_CAPABILITY #ifdef LOSCFG_SECURITY_CAPABILITY
...@@ -842,13 +842,13 @@ EXIT: ...@@ -842,13 +842,13 @@ EXIT:
return 0; return 0;
#endif #endif
} }
//系统调用之创建一个用户线程
unsigned int SysCreateUserThread(const TSK_ENTRY_FUNC func, const UserTaskParam *userParam, bool joinable) unsigned int SysCreateUserThread(const TSK_ENTRY_FUNC func, const UserTaskParam *userParam, bool joinable)
{ {
TSK_INIT_PARAM_S param = { 0 }; TSK_INIT_PARAM_S param = { 0 };
int ret; int ret;
ret = LOS_ArchCopyFromUser(&(param.userParam), userParam, sizeof(UserTaskParam)); ret = LOS_ArchCopyFromUser(&(param.userParam), userParam, sizeof(UserTaskParam));//参数copy,将用户空间的参数信息copy到内核空间
if (ret != 0) { if (ret != 0) {
return OS_INVALID_VALUE; return OS_INVALID_VALUE;
} }
...@@ -860,9 +860,9 @@ unsigned int SysCreateUserThread(const TSK_ENTRY_FUNC func, const UserTaskParam ...@@ -860,9 +860,9 @@ unsigned int SysCreateUserThread(const TSK_ENTRY_FUNC func, const UserTaskParam
param.uwResved = OS_TASK_FLAG_DETACHED; param.uwResved = OS_TASK_FLAG_DETACHED;
} }
return OsCreateUserTask(OS_INVALID_VALUE, &param); return OsCreateUserTask(OS_INVALID_VALUE, &param);//创建用户task
} }
//系统调用-设置线程使用区域,所有的系统调用都运行在内核态,也运行在内核空间 //系统调用设置线程使用区域,所有的系统调用都运行在内核态,也运行在内核空间
int SysSetThreadArea(const char *area) int SysSetThreadArea(const char *area)
{ {
unsigned int intSave; unsigned int intSave;
...@@ -887,12 +887,12 @@ OUT: ...@@ -887,12 +887,12 @@ OUT:
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
return ret; return ret;
} }
//获取系统调用线程的使用区域 //系统调用之获取线程的使用区域
char *SysGetThreadArea(void) char *SysGetThreadArea(void)
{ {
return (char *)(OsCurrTaskGet()->userArea);//直接返回使用区域 return (char *)(OsCurrTaskGet()->userArea);//直接返回使用区域
} }
//系统调用之设置任务为分离模式
int SysUserThreadSetDeatch(unsigned int taskID) int SysUserThreadSetDeatch(unsigned int taskID)
{ {
unsigned int intSave; unsigned int intSave;
...@@ -916,7 +916,7 @@ EXIT: ...@@ -916,7 +916,7 @@ EXIT:
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
return ret; return ret;
} }
//系统调用之线程分离,意思是这是一个独立的线程
int SysUserThreadDetach(unsigned int taskID) int SysUserThreadDetach(unsigned int taskID)
{ {
unsigned int intSave; unsigned int intSave;
...@@ -942,7 +942,7 @@ int SysUserThreadDetach(unsigned int taskID) ...@@ -942,7 +942,7 @@ int SysUserThreadDetach(unsigned int taskID)
return LOS_OK; return LOS_OK;
} }
//系统调用之线程联结,意思是这是一个可联结的线程
int SysThreadJoin(unsigned int taskID) int SysThreadJoin(unsigned int taskID)
{ {
unsigned int intSave; unsigned int intSave;
...@@ -966,12 +966,12 @@ EXIT: ...@@ -966,12 +966,12 @@ EXIT:
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
return ret; return ret;
} }
//系统调用之退出线程组
void SysUserExitGroup(int status) void SysUserExitGroup(int status)
{ {
OsTaskExitGroup((unsigned int)status); OsTaskExitGroup((unsigned int)status);
} }
//系统调用之退出线程
void SysThreadExit(int status) void SysThreadExit(int status)
{ {
OsTaskToExit(OsCurrTaskGet(), (unsigned int)status); OsTaskToExit(OsCurrTaskGet(), (unsigned int)status);
...@@ -990,10 +990,10 @@ int SysFutex(const unsigned int *uAddr, unsigned int flags, int val, ...@@ -990,10 +990,10 @@ int SysFutex(const unsigned int *uAddr, unsigned int flags, int val,
return -OsFutexWait(uAddr, flags, val, absTime); return -OsFutexWait(uAddr, flags, val, absTime);
} }
//获取当前任务ID
unsigned int SysGetTid(void) unsigned int SysGetTid(void)
{ {
return OsCurrTaskGet()->taskID; return OsCurrTaskGet()->taskID;//获取当前任务ID
} }
#ifdef __cplusplus #ifdef __cplusplus
......
git add -A git add -A
git commit -m '对 cpu sortlink 部分代码注释 git commit -m '对硬件中断部分源码注释,对CPU各个寄存器功能注释
鸿蒙内核源码分析系列 【 CSDN | OSCHINA | WIKI 】 鸿蒙内核源码分析系列 【 CSDN | OSCHINA | WIKI 】
鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓 】四大仓库每日同步更新代码和wiki 鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓 】四大仓库每日同步更新代码和wiki
项目给鸿蒙内核源码逐行加上中文注解,详细阐述框架和代码细节, 精读 HarmonyOS 内核源码, 将迅速拔高对计算机整体理解,从此高屋建瓴看问题.' 项目给鸿蒙内核源码逐行加上中文注解,详细阐述框架和代码细节, 精读 HarmonyOS 内核源码, 将迅速拔高对计算机整体理解,从此高屋建瓴看问题.'
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册