欢迎关注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,你知道表示什么意思吗