关于ISR

2020-10-19 09:39:57 浏览数 (1)

欢迎关注VxWorks567

如转发,请标明出处!

硬件通过中断将外部事件告诉系统,因此如果处理中断,就是RTOS的重中之重。ISR,中断服务程序或中断处理程序,就是用来响应中断的。当硬件触发中断时,ISR就会立即执行。

在大多数架构里,所有中断使用同一个栈。这个中断栈是在系统启动时初始化,其尺寸由宏ISR_STACK_SIZE定义。下文是默认值,可以在BSP中再重新定义

CPU

ISR_STACK_SIZE

AM29XXX

10000

COLDFIRE

1000

I960

1000

MC680X0

1000

MIPS

5000

PPC

5000

SH

1000

SIMNT

50000

SPARC

10000

X64

8192

X86

4096

中断栈里默认进行了填充,因此可以使用checkStack()进行查看。

为了更好的性能,也可以通过VX_GLOBAL_NO_STACK_FILL取消填充。另外,还可以通过INCLUDE_PROTECT_INTERRUPT_STACK,打开中断栈的溢出保护。

使用命令isrShow(),可以查看已安装的所有ISR

Tag默认表示的是中断向量vector,而这个vector是中断号通过宏INUM_TO_IVEC()转换得到的

代码语言:javascript复制
/* ARM */
#define IVEC_TO_INUM(intVec)    ((int)(intVec))
#define INUM_TO_IVEC(intNum)    ((VOIDFUNCPTR *)(intNum))

/* PPC */
#define IVEC_TO_INUM(intVec)    ((int)(intVec))
#define INUM_TO_IVEC(intNum)    ((VOIDFUNCPTR *)(intNum))

/* MIPS */
#define IVEC_TO_INUM(intVec)    ((int)(intVec) >> 2)
#define INUM_TO_IVEC(intNum)    ((VOIDFUNCPTR *)((intNum) << 2))

/* x86 */
#define IVEC_TO_INUM(intVec)    ((int)(intVec) >> 3)
#define INUM_TO_IVEC(intNum)    ((VOIDFUNCPTR *)((intNum) << 3))

/* x64 */
#define IVEC_TO_INUM(intVec)    ((long)(intVec) >> 4)
#define INUM_TO_IVEC(intNum)    ((VOIDFUNCPTR *)((intNum) << 4))

/* SIMNT */
#define IVEC_TO_INUM(intVec)    (intVec)
#define INUM_TO_IVEC(intNum)    ((VOIDFUNCPTR *)intNum)

例如上图中isr5的tag是1248,在X86中表示中断号是0x9c (1248>>3 = 156 = 0x9c)。在BSP的configInum.h文件中可以看到

代码语言:javascript复制
#define INT_NUM_IOAPIC_IRQ4 0x9c
#define INT_NUM_COM1       (INT_NUM_IOAPIC_IRQ4)

在hwconf.c文件中可以看到

代码语言:javascript复制
#ifdef DRV_SIO_NS16550
/* vxBus resource files for onboard UARTS */
const struct hcfResource pentiumi82501Resources[] =
    {
        { "regBase",     HCF_RES_INT, {(void *)COM1_BASE_ADR} },
        { "irq",         HCF_RES_INT, {(void *)(INUM_TO_IVEC(INT_NUM_COM1))} },
        { "regInterval", HCF_RES_INT, {(void *)UART_REG_ADDR_INTERVAL} },
        { "irqLevel",    HCF_RES_INT, {(void *)COM1_INT_LVL} },
        { "clkFreq",   HCF_RES_INT, {(void *)PCI_CLK_FREQ} },
        { "fifoLen",     HCF_RES_INT, {(void *)8} }
    };

    { "ns16550", 0, VXB_BUSID_PLB, 0, pentiumi82501Num, pentiumi82501Resources },
#endif /* DRV_SIO_NS16550 */

因此,可以得到isr5是用来响应COM1的。那它对应的HandlerRtn是10056950,你知道表示什么意思吗

0 人点赞