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

来源:互联网 发布:编写软件测试报告 编辑:程序博客网 时间:2024/05/18 12:29

这是一个尚未解决的问题,关于多个中断向量指向同一个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,从栈顶获取当前调用者的身份。但这个方法我尚未验证过。不知是否会有什么问题。

原创粉丝点击