ISR之不能做什么

中断嵌入式系统中重要组成部分,很多编译器开发商都让标准c支持中断,并引入关键字_interrupt.但是:
1、ISR不能有返回值
2、ISR不能传递参数;
3、ISR应该是短而高效的,在ISR中做浮点运算是不明智的;
4、ISR中不应该有重入和性能上的问题,因此不应该使用pintf()函数。

 

 

转自优快云

 

1.ISR 不能有返回值。为什么?
2.ISR 不能传递参数。为什么? 

 

裸奔的系统:硬件中断响应程序的运行插入时机是随机的,程序中不存在这样的调用语句:“value=interrupter( )”, 所以,即使有返回值也不知返回给谁。  同理,如果中断函数有形参,但因没有调用者,也就没有实参对形参赋值。所以,不可能有参数传递。

裸奔系统中,中断程序由硬件触发执行。这意味着中断函数没有具体的调用者,所以,中断函数无法将值返回给任何对象


   
  非裸奔系统:操作系统需要进行各种调度安排,所以接管了中断的入、出口;另外,还增加了许多软件中断。这些中断函数的运行插入时机已经不再是随机了。一个中断申请发生后,其运行时机取决于操作系统的确定安排和调用。也就是说,有了调用者,所以可以有返回值和参数传递。

嵌入式系统中,**中断服务程序(ISR)** 是一种特殊的函数,用于响应硬件中断事件。由于 ISR 运行在中断上下文中,系统资源受限、调度机制受限,因此对 ISR 的编写有诸多限制。 --- ## ✅ 中断服务程序(ISR)中**不能**的事情如下: --- ### 1. **不能调用阻塞函数** - **原因**:ISR不能等待某个操作完成,否则会冻结系统。 - **示例**: ```c delay(1000); // 延时函数(如果实现为忙等待或阻塞) semPend(); // 获取信号量(若不可得,会阻塞) ``` --- ### 2. **不能调用非可重入函数** - **原因**:某些标准库函数(如 `printf`、`malloc`、`strtok`)不是可重入的,可能在中断中被调用时导致数据损坏。 - **示例**: ```c printf("中断触发"); // 可能导致死锁或缓冲区混乱 strtok(); // 使用静态变量,非线程安全 ``` --- ### 3. **不能进行动态内存分配** - **原因**:`malloc()`、`free()` 操作堆内存,可能引起系统调度或资源竞争。 - **示例**: ```c int *p = malloc(100); // 不允许 ``` --- ### 4. **不能调用系统调度器相关函数** - **原因**:中断上下文中不能触发任务调度。 - **示例**(在 RTOS 环境中): ```c taskDelay(); // 延迟任务 taskResume(); // 恢复任务 ``` --- ### 5. **不能使用标准 I/O 函数(如 `printf`、`scanf`)** - **原因**:标准 I/O 函数可能使用缓冲区、锁机制、系统调用,不适用于中断上下文。 - **示例**: ```c printf("Interrupt occurred\n"); // 不安全 ``` --- ### 6. **不能进行复杂运算或长时间运行** - **原因**:中断服务程序应尽量“短小精悍”,否则会影响系统响应其他中断。 - **建议**:将复杂逻辑交给主循环或任务处理。 - **示例**: ```c for (i = 0; i < 100000; i++) { // 复杂计算 } // 不推荐 ``` --- ## ✅ 推荐法(ISR 中应该什么): | 操作 | 推荐程度 | 说明 | |------|----------|------| | 设置标志位 | ✅ 高 | 主循环中处理 | | 操作硬件寄存器 | ✅ 高 | 如清除中断标志 | | 发送信号量/事件 | ✅ 中 | 在 RTOS 中唤醒任务 | | 简单判断逻辑 | ✅ 中 | 不影响性能 | --- ## ✅ 示例代码:推荐的 ISR 写法 ```c volatile int int_flag = 0; interrupt void timer_isr(void) { int_flag = 1; // 设置标志位 TIMER_clearInt(TIMER0_BASE); // 清除中断标志 } void main() { while (1) { if (int_flag) { // 在主循环中处理复杂逻辑 process_interrupt(); int_flag = 0; } } } ``` --- ## 🧠 总结表格 | 操作 | 是否允许 | 原因 | |------|----------|------| | 调用 `printf` | ❌ | 非可重入、可能阻塞 | | 调用 `malloc` | ❌ | 动态内存分配不安全 | | 调用 `semPend` | ❌ | 阻塞函数 | | 延时函数 | ❌ | 占用 CPU,影响响应 | | 设置标志位 | ✅ | 安全高效 | | 清除中断标志 | ✅ | 必须操作 | | 发送信号量 | ✅(RTOS) | 唤醒任务 | | 复杂逻辑 | ❌ | 影响中断响应速度 | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值