前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于ISR

关于ISR

作者头像
Taishan3721
发布2020-10-19 09:39:57
1.4K0
发布2020-10-19 09:39:57
举报
文章被收录于专栏:这里只有VxWorks这里只有VxWorks

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这里只有VxWorks 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档