interrupt using
interrupt 表示中断优先级,using表示所用工作寄存器组。
interrupt x using y
跟在interrupt 后面的xx 值得是中断号,就是说这个函数对应第几个中断端口,一般在51中
0 外部中断0
1 定时器0
2 外部中断1
3 定时器1
4 串行中断
其它的根据相应得单片机有自己的含义,实际上c在编译的时候就是把你这个函数的入口地址放到这个对应中断的跳转地址
using y 这个y是说这个中断函数使用的那个寄存器组就是51里面一般有4个 r0 -- r7寄存器,如果你的终端函数和别的程序用的不是同一个寄存器组则进入中断的时候就不会将寄存器组压入堆栈返回时也不会弹出来 节省代码和时间
外部中断INT0
void intsvr0(void) interrupt 0 using 1
定时/计数器T0
void timer0(void) interrupt 1 using 1
外部中断INT1
void intsvr1(void) interrupt 2 using 1
定时/计数器T1
void timer1(void) interrupt 3 using 1
串口中断
void serial0(void) interrupt4 using 1
interrupt 和 using 都是 C51 的关键字。C51 中断过程通过使用 interrupt 关键字和中断号(0 到 31)来实现。中断号指明编译器中断程序的入口地址中断序号对应着 8051中断使能寄存器IE 中的使能位,对应关系如下: 有了这一声明,编译器不需理会寄存器组参数的使用和对累加器A、状态寄存器、寄存器B、数据指针和默认的寄存器的保护。只要在中断程序中用到,编译器会把它们压栈,在中断程序结束时将他们出栈。C51 支持所有 5 个 8051 标准中断从 0 到 4 和在 8051 系列(增强型)中多达 27 个中断源。 关于using: 如果在中断服务函数 ISR 中使用寄存器,那么必须处理好 using 的使用问题: |
直接访问寄存器和端口 定义 sfr P0 0x80 操作 ADCON = 0x08 ; /* Write data to register */ io_status = P0 ; /* Read data from Port */ 在使用了interrupt 1 关键字之后,会自动生成中断向量 在 ISR中不能 与其他 "后台循环代码"(the background loop code) 共享 局部变量 因为 连接器 会复用 在RAM中这些变量的 位置 ,所以 它们会有不同的意义,这取决于当前使用的不同的函数 复用变量对 RAM有限的51来将 很重要。所以,这些函数希望按照一定的顺序执行 而不被中断。 timer0_int() interrupt 1 using 2 "interrupt"声明 表示 向量生成在 (8*n+3),这里,n就是interrupt参数后的那个数字 "using" tells the compiler to switch register banks on entry to an interrupt routine. This "context" switch is the fastest way of providing a fresh registerbank for an interrupt routine's local data and is to be preferred to stacking registers for very time-critical routines. Note that interrupts of the same priority can share a register bank, since there is no risk that they will interrupt each other. 'using' 告诉编译器 在进入中断处理器 去切换 寄存器的bank。这个"contet"切换是 注意:同样优先级别的中断 可以共享 寄存器bank,因为 他们每次将中断 没有危险 If a USING 1 is added to the timer1 interrupt function prototype, the pushing of registers is replaced by a simple MOV to PSW to switch registerbanks. Unfortunately, while the interrupt entry is speeded up, the direct register addressing used on entry to sys_interp fails. This is because C51 has not yet been told that the registerbank has been changed. If no working registers are used and no other function is called, the optimizer eliminiates teh code to switch register banks. 不幸的是,当一个中断入口被加速时。用在入口的 直接寄存器寻址 将失败。 Logically, with an interrupt routine, parameters cannot be passed to it or returned. When the interrupt occurs, compiler-inserted code is run which pushes the accumulator, B,DPTR and the PSW (program status word) onto the stack. Finally, on exiting the interrupt routine, the items previously stored on the stack are restored and the closing "}" causes a RETI to be used rather than a normal RET. 逻辑上,一个中断服务程序,不能传递参数进去,也不可返回值。 中断源的矢量位置 中断源 Keil中断编号 矢量地址 1. 2. 3. 4. 默认keil c51中的函数使用的是0寄存器组,当中断函数使用using n时,n = 1,2,3或许是对的,但n=0时,程序就已经存在了bug(只有中断函数及其所调用的函数并没有改变R0 ---- R7的值时,这个bug不会表现出来)) 一个结论是,在中断函数中如果使用了using n,则中断不再保存R0----R7的值。 由此可以推论出,一个高优先级的中断函数及一个低优先级的中断函数同时使用了using n,(n = 0,1,2,3)当n相同时,这个存在的bug 是多么的隐蔽。(这恰是使人想象不到的) 使用不同寄存器组的函数(特殊情况外)不能相互调用 如果中断程序不重要,using关键字 能忽略。 1) 在进入 函数 这样就不会使用 "绝对地址定位" 2) 用这个指定告诉当前使用的 bank 用NOAREGS指令 移除 MOV R7,AR7 中断服务例程 /* Timer 0 Overflow Interrupt Service Routine */ 被调用的函数 #pragma SAVE // Rember current registerbank 如果中断服务例程使用了 USING,被中断服务例程 调用的函数一定要 为了函数 "reentrant"(可重入) interrupt 和 using 都是 C51 的关键字。C51 中断过程通过使用 interrupt 关键字和中断号(0 到 31)来实现。中断号指明编译器中断程序的入口地址中断序号对应着 8051中断使能寄存器IE 中的使能位,对应关系如下: 有了这一声明,编译器不需理会寄存器组参数的使用和对累加器A、状态寄存器、寄存器B、数据指针和默认的寄存器的保护。只要在中断程序中用到,编译器会把它们压栈,在中断程序结束时将他们出栈。C51 支持所有 5 个 8051 标准中断从 0 到 4 和在 8051 系列(增强型)中多达 27 个中断源。 |
8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的 64K 字节可寻址数据和代码区。中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务 处理程序。中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。8051的中断向量表如下: 中断源 中断向量 --------------------------- 上电复位 0000H 外部中断0 0003H 定时器0 溢出 000BH 外部中断1 0013H 定时器1 溢出 001BH 串行口中断 0023H 定时器2 溢出 002BH interrupt 和 using 都是 C51 的关键字。C51 中断过程通过使用 interrupt 关键字和中断号(0 到 31)来实现。中断号指明编译器中断程序的入口地址中断序号对应着 8051中断使能寄存器IE 中的使能位,对应关系如下: 有了这一声明,编译器不需理会寄存器组参数的使用和对累加器A、状态寄存器、寄存器B、数据指针和默认的寄存器的保护。只要在中断程序中用到,编译器会把它们压栈,在中断程序结束时将他们出栈。C51 支持所有 5 个 8051 标准中断从 0 到 4 和在 8051 系列(增强型)中多达 27 个中断源。 关于using: 如果在中断服务函数 ISR 中使用寄存器,那么必须处理好 using 的使用问题: |
interrupt using相关推荐
- (Interrupt Latency) 中断延迟
中断延迟 (Interrupt Latency) 中断延迟 是指从硬件中断发生到开始执行中断处理程序第一条指令之间的这段时间. 也就是: 计算机接收到中断信号到操作系统作出响应,并完成换到转入中断服务 ...
- Linux中断(interrupt)子系统之一:中断系统基本原理【转】
转自:http://blog.csdn.net/droidphone/article/details/7445825 这个中断系列文章主要针对移动设备中的Linux进行讨论,文中的例子基本都是基于AR ...
- typedef interrupt void (*PINT)(void)的分析
今天写程序时,在DSP2833x_PieVect.h看到typedef interrupt void (*PINT)(void)突然一愣,上网查了下发现在这是加了interrupt 中断关键字的函数指 ...
- 从一道面试题分析Thread.interrupt方法
阿里面试题: public class TestThread {public static void main(String[] args) {Thread t1 = new Thread() {@O ...
- 【高并发】又一个朋友面试栽在了Thread类的stop()方法和interrupt()方法上!
来自:冰河技术 写在前面 新一轮的面试已经过去,可能是疫情的原因吧,很多童鞋纷纷留言说今年的面试题难度又提高了,尤其是对并发编程的知识.我细想了下,也许有那么点疫情的原因吧,但无论面试的套路怎么变,只 ...
- Java多线程(九)—— interrupt()和线程终止方式
一.interrupt() 说明 interrupt()的作用是中断本线程. 本线程中断自己是被允许的:其它线程调用本线程的interrupt()方法时,会通过checkAccess()检查权限.这有 ...
- Android Thread interrupt 中断JAVA线程(转)
转载自:http://hi.baidu.com/%E3%C6%CE%C4%B7%E5/blog/item/d8959f1b6716c8168618bfbb.html 假如我们有一个任务如下,交给一个J ...
- Java线程状态及 wait、sleep、join、interrupt、yield等的区别
Java中的线程状态(详见Java线程状态及转换-MarchOn): wait:Object类的实例方法,释放CPU执行权,进入等待状态,直到 被中断.被拥有该对象锁的线程唤醒(notify或not ...
- Java Thead.interrupt 方法没有使线程停止工作
有问题的interrupt package com.xinyu.test;public class TestInterrupt {public static void main(String[] ar ...
- interrupt分析
转载自 https://blog.csdn.net/zhangliangzi/article/details/52485319 interrupt简述 interrupt() 方法只是改变中断状态而已 ...
最新文章
- Git 常用命令集锦
- plsql连接oracle无响应,求教 pl/sql连接本机数据库是未响应问题
- 用C语言解“混合类型数据格式化输出”题
- 嵌入式开发之hi3519---PCIE DMA
- myeclipse2014下卸载,安装maven插件。
- Visual Entity 手册
- hadoop的HA高可用配置(没有搞完)
- mysql取得列类型_Mysql列类型
- 配置Xmanager 连接AIX服务器
- 旺财速啃H5框架之Bootstrap(六)
- 公安网络安全部门封杀的2000家淘宝钓鱼网站
- 十大经典排序算法系列
- 端口扫描php,php-批量端口扫描
- 使用Asp.net的TreeView来构建用户选择输入
- 值得收藏 | 关于机器学习,这可能是目前最全面最无痛的入门路径和资源!
- 如何快速解决 Mybatis 异常:Invalid bound statement (not found)
- GBase 8a 集群维护工具C3介绍
- Contiki学习笔记——Cooja启动失败
- 在 SQL 中计算总行数的百分比
- [案例2-5]石头 剪刀 布小游戏