SylixOS 中断系统分析

SylixOS中断系统分析

中断向量表

在SylixOS中,系统默认存在一张大小为256(可以手动配置)的中断向量表,用于管理SylixOS中的每一个中断向量。该向量表存在于k_globalvar.h文件中,其定义格式如程序清单1-1所示。

程序清单1-1 系统中断向量表定义

/*********************************************************************************************************
  系统中断向量表
*********************************************************************************************************/
__KERNEL_EXT  LW_CLASS_INTDESC        _K_idescTable[LW_CFG_MAX_INTER_SRC];
__KERNEL_EXT  LW_SPINLOCK_DEFINE     (_K_slVectorTable);

_K_idescTable是大小为256的数组,数组元素为256个中断向量,_K_slVectorTable是一个自旋锁,用于对中断向量表的互斥访问。

_K_idescTable的类型为LW_CLASS_INTDESC,该类型是SylixOS的中断向量表结构,定义如程序清单1-2所示。

程序清单1-2 中断向量表结构定义

typedef struct {
    LW_LIST_LINE_HEADER   IDESC_plineAction;                            /*  判断中断服务函数列表        */
    ULONG                 IDESC_ulFlag;                                 /*  中断向量选项                */
    LW_SPINLOCK_DEFINE   (IDESC_slLock);                                /*  自旋锁                      */
} LW_CLASS_INTDESC;
typedef LW_CLASS_INTDESC *PLW_CLASS_INTDESC;

LW_CLASS_INTDESC类型的原型分析如下:

  • IDESC_plineAction是用于管理中断服务函数的链表,通常情况下,一个中断号对应一个中断服务函数,那么该链表内只有一个成员;但有些特殊情况,一个中断号可以对应多个中断服务函数,则该链表有多个成员。
  • IDESC_ulFlag 中断向量选项。
  • IDESC_slLock 中断向量自旋锁

中断向量的选项如表1-1所示。

表1-1 中断向量类型


宏名


含义


LW_IRQ_FLAG_QUEUE


支持单向量,多服务


LW_IRQ_FLAG_PREEMPTIVE


允许中断抢占


LW_IRQ_FLAG_SAMPLE_RAND


可用作系统随机数种子


LW_IRQ_FLAG_GJB7714


支持GJB7714国军标体系

1.2中断描述符

在SylixOS中,每一个中断服务函数对应一个中断描述符结构,并将该中断描述符结构加入到中断向量表对应的表项中,如果一个中断向量对应多个中断服务函数,则这些中断服务函数对应的中断描述符就组成了一个链表,并由中断向量表对应的表项来进行管理。中断描述符结构如程序清单1-3所示。

程序清单1-3 中断描述符结构体定义

typedef struct {
    LW_LIST_LINE          IACT_plineManage;                             /*  管理链表                    */
    INT64                 IACT_iIntCnt[LW_CFG_MAX_PROCESSORS];          /*  中断计数器                  */
    PINT_SVR_ROUTINE      IACT_pfuncIsr;                                /*  中断服务函数                */
    VOIDFUNCPTR           IACT_pfuncClear;                              /*  中断清理函数                */
    PVOID                 IACT_pvArg;                                   /*  中断服务函数参数            */
    CHAR                  IACT_cInterName[LW_CFG_OBJECT_NAME_SIZE];
} LW_CLASS_INTACT;                                                      /*  中断描述符                  */
typedef LW_CLASS_INTACT  *PLW_CLASS_INTACT;

中断描述符类型的原型分析:

  • IACT_plineManage 管理链表,用于将中断描述符加入到中断向量表表项
  • IACT_iIntCnt 中断计数器,每一次中断该数值加1
  • IACT_pfuncIsr 中断服务函数
  • IACT_pfuncClear 中断清理函数
  • IACT_pvArg 中断服务函数参数
  • IACT_cInterName 中断服务函数名字

1.3SylixOS中断服务函数流程

1.3.1总中断服务函数

以ARM体系为例,当ARM内核检测到中断时,会自动将PC指向中断异常入口处去执行中断异常函数,SylixoS的中断异常函数定义为archIntEntry,它是由汇编语言编写,可以用ctrl+h来全局查找该函数进行详细分析。这就是SylixOS的总中断服务函数,也就是说,无论是哪一个中断向量产生中断,都会先进入archIntEntry函数。实际上,在执行工程师自己定义的中断服务函数之前,需要进行一些准备工作,比如上下文的保存,中断嵌套的判断等;执行完工程师自己定义的中断服务函数后,还需要进行上下文的恢复等操作;这些都是由archIntEntry函数来完成,archIntEntry函数就相当于一层外壳,它对底层工程师隐藏了整个中断响应复杂的细节。

那么,archIntEntry函数,来查找中断服务函数。是如何找到工程师自己定义的中断服务函数呢?通过分析archIntEntry函数的源代码可知, archIntEntry函数通过调用bspIntHandle函数,bspIntHandle函数调用archIntHandle函数,来查找中断服务函数。

1.3.2查找中断服务函数

archIntHandle函数定义如程序清单1-4所示。

程序清单1-4 archIntHandle函数定义

LW_WEAK VOID  archIntHandle (ULONG  ulVector, BOOL  bPreemptive)

archIntHandle函数原型分析:

  • 参数ulVector是中断向量号
  • 参数bPreemptive表示是否允许中断抢占,这里只是根据是否允许抢占来判断是否打开中断,中断嵌套上下文的保存是在archIntEntry函数中处理的。

archIntHandle函数的大体流程如图1-1所示。

图1-1 中断服务函数流程

1.3.3中断服务函数返回值

archIntHandle函数在遍历中断服务函数链表时,会根据中断服务函数的返回值判断是否需要结束遍历,它的返回值有三种选项,如表1-2所示。

表1-2 中断服务函数返回值选项


宏名


含义


LW_IRQ_NONE


不是本中断服务函数产生的中断,继续遍历


LW_IRQ_HANDLED


是本中断服务函数产生的中断,结束遍历


LW_IRQ_HANDLED_DISV


中断处理结束,并屏蔽本次中断

可参考SylixOS GIT上的文档《TN0032_SylixOS共用中断号机制》,来对中断服务函数返回值做更详细的了解。

2.SylixOS中断的连接与释放

在SylixOS中,中断的连接与释放的函数分别是API_InterVectorConnect函数和API_InetrVectorDisable函数,下面介绍SylixOS中断的连接和释放过程。

2.1SylixOS中断连接函数简介

API_InterVectorConnect函数定义如程序清单2-1所示。

程序清单2-1 中断连接函数

LW_API ULONG            API_InterVectorConnect(ULONG                 ulVector,
                                               PINT_SVR_ROUTINE      pfuncIsr,
                                               PVOID                 pvArg,
                                               CPCHAR                pcName);
                                                                        /*  设置指定向量的服务程序      */

函数API_InterVectorConnect原型分析:

  • 函数返回为连接成功或失败
  • 参数ulVector是中断向量号
  • 参数pfuncIsr是中断服务函数
  • 参数pvArg是中断服务函数参数
  • 参数pcName是中断服务名称

API_InterVectorConnect函数的功能是将中断向量号与中断服务函数进行连接。

API_InterVectorConnect函数的大体流程如图2-所示。

图2- 1 中断服务连接函数流程

SylixOS中断释放函数简介

API_InterVectorDisable函数的定义如程序清单2-2所示。

程序清单2-2 中断释放函数

LW_API ULONG    API_InterVectorDisconnect(ULONG                 ulVector,
                                          PINT_SVR_ROUTINE      pfuncIsr,
                                          PVOID                 pvArg);
                                                                        /*  删除指定向量的服务程序      */

API_InterVectorDisable函数原型分析:

  • 函数返回值是释放成功或失败
  • 参数ulVector是中断向量号
  • 参数pfuncIsr是中断服务函数
  • 参数pvArg是中断服务函数的参数

API_InterVectorDisable函数仅仅只是释放与参数pfuncIsr和参数pvArg相对应的中断服务函数,当一个向量对应多个函数时,它并不会释放该向量的所有中断服务函数。

如果要想一次性释放所有中断服务函数,SylixOS提供了另外的接口,API_InterVectorDisconnectEx函数,它的定义如程序清单2-3所示。

程序清单2-3 中断释放扩展函数

LW_API ULONG    API_InterVectorDisconnectEx(ULONG             ulVector,
                                            PINT_SVR_ROUTINE  pfuncIsr,
                                            PVOID             pvArg,
                                            ULONG             ulOption);
                                                                        /*  删除指定向量的服务程序      */

API_InterVectorDisconnectEx函数原型分析:

  • 该函数的前三个参数与API_InterVectorDisable函数参数相同,实际上API_InterVectorDisable就是调用了该函数。
  • 参数ulOption是删除选项

删除选项的选项如表2- 1所示。

表2- 1 中断释放函数的删除选项


宏名


含义


LW_IRQ_DISCONN_DEFAULT


解除匹配函数和函数参数的中断服务连接


LW_IRQ_DISCONN_ALL


解除所有中断服务连接


LW_IRQ_DISCONN_IGNORE_ARG


解除匹配函数的中断服务连接(忽略函数参数)

API_InterVectorDisconnectEx函数的大体流程如图2-2所示。

图2-2 中断释放函数流程

时间: 2024-10-11 02:56:14

SylixOS 中断系统分析的相关文章

SylixOS 中断流程

说明 本文章分析了ARM架构下SylixOS内核中断流程,共包含三部分: 分析SylixOS运用数组和双向链表实现中断服务函数的注册 阐述ARM硬件中断机制 分析SylixOS中断处理流程 SylixOS中断注册 SylixOS中断注册是通过数组和双向链表实现的. 系统中断向量结构索引数组 _K_idescTable [256]是SylixOS内核中的系统中断向量结构索引数组,用于索引注册的中断服务函数,其类型如清单 21所示 清单 21 typedef struct {     LW_LIST

SylixOS 中断响应时间测试

1.应用场景 在一些情况下,对于一些紧急的中断任务,系统需要为其提供稳定可靠的中断响应时间,但一般的中断服务函数,它的响应时间可能会受到其他中断向量的影响,延迟响应.在SylixOS中有两种解方案. 1.提高该中断向量优先级,打开中断嵌套来确保紧急中断的响应时间. 2.对于多核处理器,可以采用中断绑核的形式,即将紧急中断绑定到某一核上,该核只处理紧急任务. 下面通过测试正常情况下.中断嵌套情况下.中断绑核情况下的中断响应时间,来对比采用上述两种方式的优点. 2.中断响应时间测试方案 使用示波器自

SylixOS周期定时抖动分析

1.概述 自动化与控制行业中有很多场景需要循环周期控制,而运动控制领域对循环周期控制的时间确定性要求尤为严格,周期抖动的时间确定性和周期控制的极限范围直接影响运动控制产品的质量和性能.SylixOS作为一款嵌入式实时操作系统,针对不同循环周期和不同程度的时间确定性要求均有对应的周期控制方式,其中就有为周期性任务解决多任务调度冲突并且时间确定性良好的速率单调调度(Rate Monotonic Scheduling RMS),还有传统的以硬件平台定时器作为中断源,以中断服务程序作为实时任务运行载体的

uCOS-II的嵌入式串口通信模块设计

在嵌入式应用中,使用RTOS的主要原因是为了提高系统的可靠性,其次是提高开发效率.缩短开发周期.uCOS-II是一个占先式实时多任务内核,使用对 象是嵌入式系统,对源代码适当裁减,很容易移植到8~32位不同框架的微处理器上.但uCOS-II仅是一个实时内核,它不像其他实时操作系统(如嵌入式 Linux)那样提供给用户一些API函数接口.在uCOS-II实时内核下,对外设的访问接口没有统一完善,有很多工作需要用户自己去完成.串口通信是 单片机测控系统的重要组成部分,异步串行口是一个比较简单又很具代

(转载)uCOS-II的嵌入式串口通信模块设计

在嵌入式应用中,使用RTOS的主要原因是为了提高系统的可靠性,其次是提高开发效率.缩短开发周期.uCOS-II是一个占先式实时多任务内核,使用对象是嵌入式系统,对源代码适当裁减,很容易移植到8~32位不同框架的微处理器上.但uCOS-II仅是一个实时内核,它不像其他实时操作系统(如嵌入式Linux)那样提供给用户一些API函数接口.在uCOS-II实时内核下,对外设的访问接口没有统一完善,有很多工作需要用户自己去完成.串口通信是单片机测控系统的重要组成部分,异步串行口是一个比较简单又很具代表性的

SylixOS中GIC通用中断控制器(二)——GIC实现

1.概述 本篇文档主要介绍IMX6UL平台上基于SylixOS集成开发环境中GIC通用中断控制器的实现流程和方法. 2.GIC控制器基地址获取 GIC控制器基地址通过调用armPrivatePeriphBaseGet函数获得.如图 2.1所示,Ctrl+h局搜索armPrivatePeriphBaseGet函数,搜索结果如图 2.2所示. 图 2.1全局搜索armPrivatePeriphBaseGet函数 图 2.2 armPrivatePeriphBaseGet函数搜索结果 参考DDI046

SylixOS 共用中断号机制

1.原理概述 SylixOS开发人员在编写中断驱动时经常会遇到多个中断源共用一个中断号的情况,但在驱动中为了保证代码独立性,各个外设的中断服务函数应该放在各自的C文件中编写,用统一的中断服务函数是不合理的.为了适应这种情况,SylixOS支持队列类型中断向量,即SylixOS内核将同一中断向量号的多个中断服务函数链接成队列,执行时依次执行. 2.技术实现 2.1应用举例 下面以at91sam9x25处理器为例,该处理器的调试串口,tick时钟等外设共用1号中断向量.如图2-1所示. 图2-1 中

SylixOS Zynq平台私有中断绑定

1. 概述 本篇主要介绍在Zynq平台编写中断相关的驱动程序时,涉及CPU私有中断的相关绑定办法. 2. 私有中断简介 私有中断是多核CPU上特有的中断,私有中断只能被其所有者核心获取和响应,不会被其他核发现.常见的私有中断有全局定时器,私有看门狗定时器,私有定时器等,Zynq平台上还有来自PL的FIQ\IRQ. 3. 私有中断的绑定方法 3.1      常规共享中断绑定 Zynq平台使用的是GIC通用中断框架,常规的共享中断绑定和普通的中断绑定没有区别,在SylixOS上直接调用API_In

SylixOS中GIC通用中断控制器(一)——GIC简介

1. GIC简介 操作系统中,中断是很重要的组成部分.有了中断系统才可以不用一直轮询(polling)是否有事件发生,系统效率才得以提高.一般在系统中,中断控制分为三个部分:模块.中断控制器和处理器.其中模块通常由寄存器控制是否使能中断和中断触发条件等:中断控制器可以管理中断的优先级等,而处理器则由寄存器设置用来响应中断. 1.1 GIC结构 作为 ARM 系统中通用中断控制器的是 GIC(Generic Interrupt Controller),目前有四个版本,V1-V4(V2最多支持8个A