中断服务子程序 ISR
中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。
具代表事实是,产生了一个新的关键字 __interrupt。
下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf("\nArea = %f", area);
return area;
}
这个函数有太多的错误了,以至让人不知从何说起了:
1) ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。
2) ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。
3) 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。
此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。
4) 与第三点一脉相承,printf经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。
不能在中断服务程序中执行类似操作的原因是运算时间太长,不能在中段中作复杂的工作,你可以在中断服务程序中置一个标志位.然后在主程序中查询此位,判断是否执行计算子程序.当然这样做会在中断产生与实际的中断响应之间产生一定的延迟,如果你的系统对时间不太敏感还好,如果非常敏感可以考虑采用rtos。否则。。。多加几句对中断标志位的判断语句。。。。
在主程序中监测是否被置位来决定子程序是否执行.可能存在以下问题,就是,中断返回后要执行几个耗时比较长的子程序才能执行判断标志位的语句,这样,可能会有太长的时间间隔.如果你在几个耗时比较长的子程序之间加上一句判断语句,就会减小中断产生与中断响应之间的时间延迟.
中断活动的全过程大致为:
1、中断请求:中断事件一旦发生或者中断条件一旦构成,中断源提交“申请报告”,与请求CPU暂时放下目前的工作而转为中断源作为专项服务
2、中断屏蔽:虽然中断源提交了“申请报告”,但是,是否得到CPU的响应,还要取决于“申请报告”是否能够通过2道或者3道“关卡”(中断屏蔽)送达CPU(相应的中断屏蔽位等于1,为关卡放行;反之相应的中断屏蔽位等于0,为关卡禁止通行);
3、中断响应:如果一路放行,则CPU响应中断后,将被打断的工作断点记录下来(把断点地址保护到堆栈),挂起“不再受理其他申请报告牌”(清除全局中断标志位GIE=0),跳转到中断服务子程序
4、保护现场:在处理新任务时可能破坏原有的工作现场,所以需要对工作现场和工作环境进行适当保护;
5、调查中断源:检查“申请报告”是由哪个中断源提交的,以便作出有针对性的服务;
6、中断处理:开始对查明的中断源进行有针对性的中断服务;
7、清除标志:在处理完毕相应的任务之后,需要进行撤消登记(清除中断标志),以避免造成重复响应;
8、恢复现场:恢复前面曾经被保护起来的工作现场,以便继续执行被中断的工作;
9、中断返回:将被打断的工作断点找回来(从堆栈中恢复断点地址),并摘下“不再受理其他申请报告牌”(GIE=1),继续执行原先被打断的工作
中断服务子程序 ISR相关推荐
- 中断服务子程序(ISR)
中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展-让标准C支持中断.其代表事实是,产生了一个新的关键字 __interrupt(51即如此).下面的代码就使用了__interrup ...
- 32 引脚_函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频方波
void Time0_serve(void ) interrupt 1 using 1 { TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法 TL0=(81 ...
- 中断服务子程序c语言格式,中断服务子程序是如何被执行的 ?
前言 笔者在 <程序是如何在 CPU 中运行的(二)>中从 PC 指针寄存器的角度分析了一级函数调用和二级函数调用执行的过程,那么中断服务子程序又是如何被执行的呢?两者的相同点和不同点是什 ...
- c51语言中 如何定义一个中断服务子程序,51单片机中断服务子程序的设计
中断系统的运行必须与中断服务子程序配合才能正确使用.设计中断服务子程序需要首先明确以下几个问题. 中断服务子程序设计的任务 中断服务子程序设计的基本任务有下列4条: (1)设置中断允许控制寄存器IE, ...
- 中断向量,中断向量表 ,中断服务函数
所谓中断是指CPU在正常执行程序的过程中,由于内部/外部事件的触发或由程序的预先安排,引起CPU暂时中断当前正在运行的程序,而转去执行为内部/外部事件或程序预先安排的事件的服务子程序,待中断服务子程序 ...
- C语言中断服务程序指令,单片机C语言函数之中断函数(中断服务程序)
在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统. 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题. (1)中 ...
- 子程序入口参数是什么_三菱FX PLC | 什么是中断服务?没事多看几遍
戳上方蓝字 "技成电工课堂" 关注我们哦! "前面我先是分享了PLC程序流程转移中的条件跳转CJ,然后紧接着进攻了子程序调用CALL和循环FOR,这次,我要向" ...
- c语言 串口中断服务函数,GCC-AVR 编写中断服务函数的注意事项
//注意:本文使用的GCC-AVR版本为WinAVR20100110 中断不是C语言的一部分,中断的实现是由编译器实现的.所以,不同版本的编译器的中断的写法有很大的不同:即便同样是WinAVR,不同版 ...
- 嵌入式中断服务函数的一些特点
--------------------------------------------- -- 时间:2019-02-20 -- 创建人:Ruo_Xiao -- 邮箱:xclsoftware@163 ...
最新文章
- PyCharm_10个加速省时间技巧
- dedecms后台左侧菜单500错误怎么处理
- 使用Oauth2实现微服务的安全保护
- 医院计算机网络安全宣教,医院网络安全及解决方案
- Js判断下拉框是否为空值
- [leetcode]27.移除元素
- Spring Cloud配置–外部化应用程序配置
- 计算机模拟定点突变,分子模拟对接和定点突变提高10β–去乙酰巴卡亭-华南农业大学学报.PDF...
- MapReduce二次排序
- onlinezakladki 右键菜单还原
- layui 列表上面的switch开关切换
- [Java] 蓝桥杯 BEGIN-2 入门训练 序列求和
- Ubuntu20设置蓝牙
- AutoJs学习-自动添加微信群好友
- 台式电脑主板插线步骤图_图解电脑主机电源线接法图解
- App项目开发流程图解
- unity下载模型到本地并加载
- 全景图转换为天空盒图
- 一寸照纯红色底图片_一寸照纯红色底图片
- 在QQ音乐巅峰榜年度榜单中,听懂国人2022年的音乐记忆!
热门文章
- 基于RGB和LiDAR融合的自动驾驶3D语义分割
- 选对平台 ... 选对平台... 选对平台 ...
- SSL/TLS工作原理
- 温习翻阅必备---java筑基期知识大全--“基础不牢,地动山摇”
- Intel新CEO敲定,斯旺终”转正“ 1
- 从网页下载4399小游戏 下载flash游戏
- 【SPSS】单样本K-S检验和两独立样本K-S检验详细操作教程(附案例实战)
- [转载-FLUENT学习]流动仿真计算时湍流模型的选择
- 基于微信小程序的音乐播放器系统+后台管理系统(SSM+mysql)-JAVA.VUE【毕业设计、论文、源码、开题报告】
- modbus串口调试