谁是此次中断服务程序(ISR)的调用者?

本文探讨了在多个中断向量指向同一ISR时,如何确定调用者的身份问题。介绍了在缺少参数传递的情况下,利用全局变量和中断标志来区分不同中断源的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是一个尚未解决的问题,关于多个中断向量指向同一个ISR时,ISR如何获得调用者身份的信息(即本次调用是哪个中断触发的),大概描述一下:

一颗IC,拥有N个相同类型的接口(比如多个I2C、UART、SPI、USB、McBSP、McASP等等),每个接口分别有一套独立的控制/数据寄存器组和一组独立的中断资源,比如SPI-0使用INT8/9(Tx/Rx),SPI-1使用INT10/11(Tx/Rx)。现在要求开发一个设备驱动,该类设备的每个实例将独占一个上述接口。但具体为哪个接口,将在初始化时决定。

通常情况下,我们总是为这一类设备开发一套驱动,而不会给每个实例编写分别写一套几乎一模一样的代码。于是编写ISR时问题出现了。由于中断服务程序并不能接受或返回参数,原型为void Fn(void)。一经调用,尽管可能是被不同的中断(比如SPI-0的Tx或SPI-1的Tx可能会调用同一个void ISR_spi_tx(void)),但这个函数还是无法知晓调用者是谁,因而无法正确地操作相应的寄存器组或外部数据。

既然无法通过入口参数给出实例信息,那是不是能通过全局变量传递呢?原理上似乎可行,比如进入不同的中断时将当前的中断号或相关中断标志压栈(如果有中断嵌套的话),然后调用对应的ISR,从栈顶获取当前调用者的身份。但这个方法我尚未验证过。不知是否会有什么问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值