中断系统分析
中断向量表
在 SylixOS 中,系统默认存在一张大小为 256(可以手动配置)的中断向量表,中断向量表用于管理 SylixOS 中的每一个中断向量。该向量表存在于 k_globalvar.h 文件中,其定义格式如下所示:
LW_CLASS_INTDESC _K_idescTable[LW_CFG_MAX_INTER_SRC];
LW_SPINLOCK_DEFINE (_K_slVectorTable);
_K_idescTable 是大小为 256 的数组,数组元素为 256 个中断向量;K_slVectorTable 是一个自旋锁,用于控制对中断向量表的互斥访问。
_K_idescTable 的类型为 LW_CLASS_INTDESC ,该类型是 SylixOS 的中断向量表结构,其详细描述如下:
#include <SylixOS.h>
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;
- IDESC_plineAction:用于管理中断服务函数的链表,通常情况下,一个中断号对应一个中断服务函数,该链表内只有一个成员;但在某些特殊情况下,一个中断号可以对应多个中断服务函数,则该链表有多个成员。
- IDESC_ulFlag:中断向量选项。
- IDESC_slLock:中断向量自旋锁。
中断向量选项如下表所示。
宏名 | 含义 |
---|---|
LW_IRQ_FLAG_QUEUE | 支持单向量,多服务 |
LW_IRQ_FLAG_PREEMPTIVE | 允许中断抢占 |
LW_IRQ_FLAG_SAMPLE_RAND | 可用作系统随机数种子 |
LW_IRQ_FLAG_GJB7714 | 支持 GJB7714 国军标体系 |
中断描述符
在 SylixOS 中,一个中断服务函数对应一个中断描述符结构,SylixOS 将该中断描述符结构加入到中断向量表对应的表项中。如果一个中断向量对应多个中断服务函数,则这些中断服务函数对应的中断描述符就组成了一个链表,并由中断向量表对应的表项来进行管理(即 9.5.1 小节所讲的中断向量表项内的 IDESC_plineAction 成员)。中断描述符结构如下所示:
#include <SylixOS.h>
typedef struct {
LW_LIST_LINE IACT_plineManage; /* 管理链表 */
INT64 IACT_iIntCnt[LW_CFG_MAX_PROCESSORS];
PINT_SVR_ROUTINE ACT_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:中断服务函数名称。