谁是此次中断服务程序(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,从栈顶获取当前调用者的身份。但这个方法我尚未验证过。不知是否会有什么问题。

### 中断服务程序与子程序调用的区别 在嵌入式系统或操作系统中,中断服务程序ISR, Interrupt Service Routine)和子程序调用是两种不同的机制,尽管它们都涉及代码的执行跳转。以下是两者的主要区别: #### 1. 触发方式 - **中断服务程序**:由硬件中断触发,当处理器接收到外部设备或内部事件的中断请求时,会暂停当前任务并跳转到相应的中断服务程序[^1]。 - **子程序调用**:由软件指令显式调用,通常通过函数调用语句实现,例如 `call` 指令或高级语言中的函数调用语法。 #### 2. 执行优先级 - **中断服务程序**:具有较高的优先级,能够打断当前正在执行的任务,确保实时响应外部事件或内部异常[^1]。 - **子程序调用**:属于正常任务流的一部分,按照程序逻辑顺序执行,不会打断其他任务。 #### 3. 上下文切换 - **中断服务程序**:需要保存和恢复被中断任务的上下文(如寄存器状态、堆栈指针等),以保证任务在中断处理完成后能正确恢复执行。 - **子程序调用**:无需保存完整的上下文信息,仅需将返回地址压入堆栈,并在子程序结束时弹出返回地址继续执行。 #### 4. 响应时间 - **中断服务程序**:设计为快速响应中断请求,通常要求尽量简短,避免长时间占用处理器资源。 - **子程序调用**:没有严格的响应时间限制,可以执行复杂计算或处理逻辑。 #### 5. 调度影响 - 在抢占式调度的操作系统中,中断服务程序可能会导致任务调度的变化。如果中断服务程序与应用程序之间存在通信,某些等待状态的任务可能变为就绪状态,从而需要重新调度[^2]。 - 子程序调用不会直接影响任务调度,它只是当前任务的一部分,执行完毕后继续当前任务的后续代码。 #### 6. 编程约束 - **中断服务程序**:由于其高优先级和实时性要求,编写时需要特别注意避免阻塞操作(如等待资源、延迟等)。此外,在多任务环境中,还需考虑与任务间的同步问题[^2]。 - **子程序调用**:相对自由,可以包含任意复杂的逻辑,只要满足程序设计需求即可。 ```c // 示例:简单的子程序调用 void subRoutine() { // 子程序逻辑 } void main() { subRoutine(); // 显式调用子程序 } // 示例:中断服务程序 void interrupt ISR() { // 快速处理中断逻辑 } ``` #### 7. 应用场景 - **中断服务程序**:用于处理外部设备信号(如键盘输入、定时器到期)、内部事件(如错误检测)等实时性要求高的场景。 - **子程序调用**:适用于任何需要模块化编程、代码复用的场景,无特殊实时性要求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值