鸿蒙轻内核M核源码分析系列四 中断Hwi

在鸿蒙轻内核源码分析系列前几篇文章中,剖析了重要的数据结构。本文,我们讲述一下中断,会给读者介绍中断的概念,鸿蒙轻内核的中断模块的源代码。本文中所涉及的源码,以OpenHarmony LiteOS-M内核为例。


1、中断概念介绍

中断是指出现需要时,CPU暂停执行当前程序,转而执行新程序的过程。当外设需要CPU时,将通过产生中断信号使CPU立即中断当前任务来响应中断请求。在剖析中断源代码之前,下面介绍些中断相关的硬件、中断相关的概念。

1.1 中断相关的硬件介绍

与中断相关的硬件可以划分为三类:设备、中断控制器、CPU本身。

  • 设备

发起中断的源,当设备需要请求CPU时,产生一个中断信号,该信号连接至中断控制器。

  • 中断控制器

中断控制器是CPU众多外设中的一个,它一方面接收其它外设中断引脚的输入。另一方面,它会发出中断信号给CPU。可以通过对中断控制器编程来打开和关闭中断源、设置中断源的优先级和触发方式。

  • CPU

CPU会响应中断源的请求,中断当前正在执行的任务,转而执行中断处理程序。

1.2 中断相关的概念

  • 中断号

每个中断请求信号都会有特定的标志,使得计算机能够判断是哪个设备提出的中断请求,这个标志就是中断号。

  • 中断优先级

为使系统能够及时响应并处理所有中断,系统根据中断时间的重要性和紧迫程度,将中断源分为若干个级别,称作中断优先级。

  • 中断处理程序

当外设产生中断请求后,CPU暂停当前的任务,转而响应中断申请,即执行中断处理程序。产生中断的每个设备都有相应的中断处理程序。

  • 中断向量

中断服务程序的入口地址。

  • 中断向量表

存储中断向量的存储区,中断向量与中断号对应,中断向量在中断向量表中按照中断号顺序存储。

  • 中断共享

当外设较少时,可以实现一个外设对应一个中断号,但为了支持更多的硬件设备,可以让多个设备共享一个中断号,共享同一个中断号的中断处理程序形成一个链表。当外部设备产生中断申请时,系统会遍历中断号对应的中断处理程序链表,直到找到对应设备的中断处理程序。在遍历执行过程中,各中断处理程序可以通过检测设备ID,判断是否是这个中断处理程序对应的设备产生的中断。


接下来,我们再看看鸿蒙轻内核中断源代码。

2、鸿蒙轻内核中断源代码

2.1 中断相关的声明和定义

在文件kernel\arch\arm\cortex-m7\gcc\los_interrupt.c中定义了一些结构体、全局变量、内联函数,在分析源码之前,我们先看下这些定义和声明。全部变量g_intCount表示正在处理的中断数量,每次进入中断处理程序时,都会把该变量数值加1,完成中断处理退出时,该数值减1。对应的内联函数HalIsIntActive()用于获取是否正在处理中断,返回值大于0,则表示正在处理中断。

UINT32 g_intCount = 0;

inline UINT32 HalIsIntActive(VOID)
{
    return (g_intCount > 0);
}

我们在再看看中断向量表定义。
⑴处代码为系统支持的中断定义了数组g_hwiForm[OS_VECTOR_CNT],对于每一个中断号hwiNum,对应的数组元素g_hwiForm[hwiNum]表示每一个中断对应的中断处理执行入口程序。
⑵处的宏OS_HWI_WITH_ARG表示中断处理程序是否支持参数传入,默认关闭。如果支持传参,定义
⑶处的结构体HWI_HANDLER_FUNC来维护中断处理函数及其参数,还需要定义
⑷处g_hwiHandlerForm数组。如果不支持传参,使用
⑹处定义的g_hwiHandlerForm数组。对于每一个中断号hwiNum,对应的数组元素g_hwiHandlerForm[hwiNum]表示每一个中断对应的中断处理程序。
⑸、⑺处定义个函数OsSetVector()用于设置指定中断号对应的中断处理执行入口程序和中断处理程序。中断处理执行入口程序和中断处理程序的关系是,当中断发生时,会执行中断处理执行入口程序,这个函数会进一步调用中断处理程序。

⑴  STATIC HWI_PROC_FUNC __attribute__((aligned(0x100))) g_hwiForm[OS_VECTOR_CNT] = {0};

⑵  #if (OS_HWI_WITH_ARG == 1)

⑶  typedef struct {
        HWI_PROC_FUNC pfnHandler;
        VOID *pParm;
    } HWI_HANDLER_FUNC;

⑷  STATIC HWI_HANDLER_FUNC g_hwiHandlerForm[OS_VECTOR_CNT] = {
  
  { (HWI_PROC_FUNC)0, (HWI_ARG_T)0 }};

⑸  VOID OsSetVe
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值