鸿蒙内核源码分析(中断管理篇) | 硬中断的实现类似观察者模式 | 百篇博客分析鸿蒙源码 | v44.01

    百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
    https://my.oschina.net/weharmony
上级 f6dd06b0
......@@ -76,7 +76,9 @@
* [(中断概念篇) | 外人眼中权势滔天的当红海公公 ](https://weharmony.gitee.io/中断概念篇.html) **[< csdn](https://blog.csdn.net/kuangyufei/article/details/115014442) [ | oschina >](https://my.oschina.net/weharmony/blog/4992750)**
* [(中断切换篇) | 自下而上逐行分析保存和恢复中断现场全过程 ](https://weharmony.gitee.io/中断切换篇.html) **[< csdn](https://blog.csdn.net/kuangyufei/article/details/114988891) [ | oschina >](https://my.oschina.net/weharmony/blog/4990948)**
* [(中断管理篇) | 硬中断的实现类似观察者模式 ](https://weharmony.gitee.io/中断管理篇.html) **[< csdn](https://blog.csdn.net/kuangyufei/article/details/115130055) [ | oschina >](https://my.oschina.net/weharmony/blog/4995800)**
* [(中断切换篇) | 在中断切换的那一瞬间发生了什么? ](https://weharmony.gitee.io/中断切换篇.html) **[< csdn](https://blog.csdn.net/kuangyufei/article/details/114988891) [ | oschina >](https://my.oschina.net/weharmony/blog/4990948)**
* [(汇编汇总篇) | 鸿蒙所有的汇编代码都在这里 ](https://weharmony.gitee.io/汇编汇总篇.html) **[< csdn](https://blog.csdn.net/kuangyufei/article/details/114597179) [ | oschina >](https://my.oschina.net/weharmony/blog/4977924)**
......@@ -94,7 +96,7 @@
### **进程线程**
* [(任务切换篇) | 逐行汇编分析TaskContext保存和恢复全过程 ](https://weharmony.gitee.io/任务切换篇.html) **[< csdn](https://blog.csdn.net/kuangyufei/article/details/114890180) [ | oschina >](https://my.oschina.net/weharmony/blog/4988628)**
* [(任务切换篇) | 汇编逐行注解分析任务上下文 ](https://weharmony.gitee.io/任务切换篇.html) **[< csdn](https://blog.csdn.net/kuangyufei/article/details/114890180) [ | oschina >](https://my.oschina.net/weharmony/blog/4988628)**
* [(CPU篇) | 内核是如何描述CPU的? ](https://weharmony.gitee.io/CPU篇.html) **[< csdn](https://blog.csdn.net/kuangyufei/article/details/113782749) [ | oschina >](https://my.oschina.net/weharmony/blog/4952034)**
......@@ -210,3 +212,5 @@
![公众号: 鸿蒙内核源码分析](https://gitee.com/weharmony/docs/raw/master/pic/other/so1so.png)
[进入 >> 百万汉字注解 百篇博客分析 精读鸿蒙源码 深挖地基工程](https://weharmony.gitee.io) **[< gitee ](https://gitee.com/weharmony/kernel_liteos_a_note)[| csdn](https://blog.csdn.net/kuangyufei) [ | oschina >](https://my.oschina.net/weharmony)**
......@@ -130,9 +130,9 @@ LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_hwiSpin); //注意全局变量 g_hwiSpin 是
#define HWI_LOCK(state) LOS_SpinLockSave(&g_hwiSpin, &(state))
#define HWI_UNLOCK(state) LOS_SpinUnlockRestore(&g_hwiSpin, (state))
size_t g_intCount[LOSCFG_KERNEL_CORE_NUM] = {0};//记录每个CPU core的中断数量
HwiHandleForm g_hwiForm[OS_HWI_MAX_NUM]; //记录每个硬件中断实体内容 @note_why 用 form 来表示?有种写 HTML的感觉
STATIC CHAR *g_hwiFormName[OS_HWI_MAX_NUM] = {0};//记录每个硬中断的名称 OS_HWI_MAX_NUM = 128 定义于 hi3516dv300
size_t g_intCount[LOSCFG_KERNEL_CORE_NUM] = {0};//记录每个CPUcore的中断数量
HwiHandleForm g_hwiForm[OS_HWI_MAX_NUM]; //中断注册表 @note_why 用 form 来表示?有种写 HTML的感觉
STATIC CHAR *g_hwiFormName[OS_HWI_MAX_NUM] = {0};//记录每个硬中断的名称
STATIC UINT32 g_hwiFormCnt[OS_HWI_MAX_NUM] = {0};//记录每个硬中断的总数量
VOID OsIncHwiFormCnt(UINT32 index) //增加一个中断数,递增的,所以只有++ ,没有--,
......@@ -158,7 +158,7 @@ VOID OsInterrupt(UINT32 intNum)//中断实际处理函数
UINT32 *intCnt = NULL;
intCnt = &g_intCount[ArchCurrCpuid()];//当前CPU的中断总数量 ++
*intCnt = *intCnt + 1;
*intCnt = *intCnt + 1;//@note_why 这里没看明白为什么要 +1
#ifdef LOSCFG_CPUP_INCLUDE_IRQ //开启查询系统CPU的占用率的中断
OsCpupIrqStart();//记录本次中断处理开始时间
......@@ -178,7 +178,7 @@ VOID OsInterrupt(UINT32 intNum)//中断实际处理函数
UINTPTR *param = (UINTPTR *)(hwiForm->uwParam);
func((INT32)(*param), (VOID *)(*(param + 1)));//运行带参数的回调函数
}
} else {//有参数的情况
} else {//有参数的情况
HWI_PROC_FUNC0 func = (HWI_PROC_FUNC0)hwiForm->pfnHook;//获取回调函数
if (func != NULL) {
func();//运行回调函数
......@@ -187,7 +187,7 @@ VOID OsInterrupt(UINT32 intNum)//中断实际处理函数
#ifndef LOSCFG_NO_SHARED_IRQ
}
#endif
++g_hwiFormCnt[intNum];//中断数量计数器++
++g_hwiFormCnt[intNum];//对应中断号计数器总数累加
*intCnt = *intCnt - 1; //@note_why 这里没看明白为什么要 -1
#ifdef LOSCFG_CPUP_INCLUDE_IRQ //开启查询系统CPU的占用率的中断
......
......@@ -261,7 +261,7 @@ typedef struct tagIrqParam { //中断参数
const CHAR *pName; //名称
} HwiIrqParam;
extern HwiHandleForm g_hwiForm[OS_HWI_MAX_NUM];
extern HwiHandleForm g_hwiForm[OS_HWI_MAX_NUM];//中断注册表
/**
* @ingroup los_hwi
......
......@@ -44,7 +44,7 @@ extern "C" {
#define OS_MP_GC_PERIOD 100 /* ticks */
typedef enum {//处理器之间发送消息
typedef enum {//核间中断
LOS_MP_IPI_WAKEUP, //唤醒CPU
LOS_MP_IPI_SCHEDULE,//调度CPU
LOS_MP_IPI_HALT, //停止CPU
......
......@@ -45,13 +45,13 @@ STATIC UINT32 g_curIrqNum = 0; //记录当前中断号
* 0b00: forward to the cpu interfaces specified in cpu_mask
* 0b01: forward to all cpu interfaces
* 0b10: forward only to the cpu interface that request the irq
*/
*///SGI软件触发中断(Software Generated Interrupt)通常用于多核间通讯
STATIC VOID GicWriteSgi(UINT32 vector, UINT32 cpuMask, UINT32 filter)
{
UINT32 val = ((filter & 0x3) << 24) | ((cpuMask & 0xFF) << 16) |
(vector & 0xF);
GIC_REG_32(GICD_SGIR) = val;
GIC_REG_32(GICD_SGIR) = val;//写SGI寄存器
}
//向指定核发送核间中断
VOID HalIrqSendIpi(UINT32 target, UINT32 ipi)
......@@ -107,7 +107,7 @@ VOID HalIrqClear(UINT32 vector)
//给每个CPU core初始化硬件中断
VOID HalIrqInitPercpu(VOID)
{
/* unmask interrupts */ //取消屏蔽中断
/* unmask interrupts */ //取消中断屏蔽
GIC_REG_32(GICC_PMR) = 0xFF;
/* enable gic cpu interface */ //启用gic cpu接口
......@@ -138,13 +138,13 @@ VOID HalIrqInit(VOID)
GIC_REG_32(GICD_ICENABLER(i / 32)) = ~0;
}
HalIrqInitPercpu();
HalIrqInitPercpu();//初始化当前CPU中断信息
/* enable gic distributor control */
GIC_REG_32(GICD_CTLR) = 1;
GIC_REG_32(GICD_CTLR) = 1;//使能分发中断寄存器,该寄存器作用是允许给CPU发送中断信号
#if (LOSCFG_KERNEL_SMP == YES)
/* register inter-processor interrupt *///注册寄存器处理器间中断处理函数,啥意思?就是当前CPU核向其他CPU核发送中断信号
/* register inter-processor interrupt *///注册核间中断,啥意思?就是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);//中断处理函数
......@@ -154,7 +154,7 @@ VOID HalIrqInit(VOID)
//硬中断处理函数,这里由硬件触发,调用见于 ..\arch\arm\arm\src\los_dispatch.S
VOID HalIrqHandler(VOID)
{
UINT32 iar = GIC_REG_32(GICC_IAR);
UINT32 iar = GIC_REG_32(GICC_IAR);//从中断确认寄存器获取中断ID号
UINT32 vector = iar & 0x3FFU;//计算中断向量号
/*
......@@ -165,12 +165,12 @@ VOID HalIrqHandler(VOID)
if (vector >= OS_HWI_MAX_NUM) {
return;
}
g_curIrqNum = vector;
g_curIrqNum = vector;//记录当前中断ID号
OsInterrupt(vector);//调用上层中断处理函数
/* use orignal iar to do the EOI */
GIC_REG_32(GICC_EOIR) = iar;
GIC_REG_32(GICC_EOIR) = iar;//更新中断结束寄存器
}
//获取中断控制器版本
CHAR *HalIrqVersion(VOID)
......
......@@ -63,7 +63,7 @@ enum {
#define GICC_PMR (GICC_OFFSET + 0x04) /* Interrupt Priority Mask Register */ //中断优先级屏蔽寄存器
#define GICC_BPR (GICC_OFFSET + 0x08) /* Binary Point 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_HPPIR (GICC_OFFSET + 0x18) /* Highest Priority Pending Interrupt Register */ //最高优先级挂起中断寄存器
#endif
......
git add -A
git commit -m '鸿蒙内核源码分析(中断概念篇) | 外人眼中权势滔天的当红海公公 | 百篇博客分析鸿蒙源码 | v43.01
git commit -m '鸿蒙内核源码分析(中断管理篇) | 硬中断的实现类似观察者模式 | 百篇博客分析鸿蒙源码 | v44.01
百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
https://weharmony.gitee.io
https://my.oschina.net/weharmony
'
git push origin master
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册