
没有固定的中断啊,更谈不上头文件啦。 arm在发生中断的时候会固定跳到0x18处执行一段code,所以你需要在0x18处放一段你自己的code,而我们通常的做法就是在这个放一个code使其执行0x38处的中断handler,这个handler是我们自己定义的,一般在这
摘录一段我写的程序供参考:
;------------------相关寄存器定义------------------------
AUXR EQU 8EH ;辅助寄存器
AUXR1 EQU 0A2H ;辅助寄存器1
CLK_DIV EQU 97H ;时钟分频器
S2CON EQU 9AH ;串口2控制寄存器
S2BUF EQU 9BH ;串口2数据缓冲区
BRT EQU 9CH ;波特率寄存器
IE2 EQU 0AFH ;中断控制寄存器2
;-----------------串行初始化程序-------------------------
UART_INIT:
ORL PCON,#80H ;使能波特率倍速位SMOD
MOV SCON,#50H ;8位数据,可变波特率
MOV S2CON,#50H ;8位数据,可变波特率
MOV BRT,#0FAH ;57600bps@110592MHz
ORL AUXR,#14H ;独立波特率发生器时钟为Fosc,即1T
ORL IE2,#01H ;允许串口2中断
ANL AUXR,#03FH ;定时器12时钟为Fosc,即12T
ANL AUXR,#0FEH ;串口1选择定时器1为波特率发生器
MOV TMOD,#21H ;设定定时器1为8位自动重装方式,0为16位定时器
MOV TL1,#0FFH ;57600bps@110592MHz
MOV TH1,#0FFH ;设定定时器重装值
MOV SERGET,#0 ;接收RS232 Pointer is 0
MOV SERPUT,#0 ;取值RS232 Pointer is 0
MOV RXGET,#0 ;接收RS485 Pointer is 0
MOV RXPUT,#0 ;取值RS485 Pointer is 0
CLR P44 ;485处于接收状态
ORL IPH,#10H ;
SETB PS ;串口1中断优先级11为最高
CLR ET1 ;禁止定时器1中断
SETB TR1 ;启动定时器1
CLR BUSY
RET
;-----------------串行通讯2中断服务程序-------------------------
SER2INT:
PUSH ACC
PUSH PSW
MOV A,S2CON
JNB ACC0,SER2INT1 ;S2RI
ANL S2CON,#NOT S2RI
MOV A,S2BUF
MOV B,A
MOV R0,#RXRAM
MOV A,RXPUT
ANL A,#0FH
ORL A,R0
MOV R0,A
MOV A,B
MOV @R0,A
LCALL SENDRXDAT
INC RXPUT
SJMP SERINT2
SER2INT1:
MOV A,S2CON
JNB ACC1,SERINT2 ;S2TI
ANL S2CON,#NOT S2TI
CLR BUSY
SERINT2:
POP PSW
POP ACC
RETI
;-----------------串行通讯1中断服务程序-------------------------
SER1INT:
PUSH ACC
PUSH PSW
PUSH DPL
PUSH DPH
SETB RS0
CLR RS1
JBC RI,SERTIRI1 ;是接收中断,清除此标志,转接收
CLR TI ;是发送中断,清除此标志,中断返回
SJMP SEREND
SERTIRI1:
MOV A,SBUF ;接收(读入)数据
MOV B,A
SERTIRI2:
MOV R0,#SERRAM
MOV A,SERPUT
ANL A,#1FH
ORL A,R0
MOV R0,A
MOV A,B
MOV @R0,A
INC SERPUT
MOV DLY03,A
SETB SERBIT
SEREND:
POP DPH
POP DPL
POP PSW
POP ACC
RETI
嗯,我猜你问的是PC的,不是单片机
一、汇编语言的中断分以下几种:
1BIOS中断,这是固化到BIOS程序中的,每次开机BIOS会自动加载到指定内存
2186下的DOS中断,在DOS系统被加载后,系统会延用BIOS的中断向量,并向里面添加一些新的向量,这些功能便是DOS系统自带的中断服务程序
3286及以上的系统中断,PC会进入保护模式,在OS被加载后,中断由IDT控制,这一机制类似于中断向量表,只不过中断向量换成了选择子。这样的中断机制对不同型号的CPU有略微的差别,这里不细说了,我自己也没全弄明白。
二、中断实现的方式(8086下的普通中断)
听说过“优先级编码器”没?——如果同时有两个信号被接收,会指定某一个信号的优先级高,先执行它。中断就是类似的处理方法。
当CPU获取到某一高 *** 作优先级的信号时(比如时钟,每固定时间就会触发一次;比如键盘响应,用户希望通过Ctrl+C来退出任何正在执行的DOS程序),CPU会将当前正在执行的程序挂起来,转而去处理该信号(类似于Call,但略有不同,你看的书应该会讲到)。
处理中断时,系统会将其解释为一个标号,比如int 9h、int 21h等等。这个标号是一个序号,在内存某处存放着连续的一个表格,这个标号便是表格中的“行号”,只不过,每一行是两列,包括了该中断的处理程序的段基址和偏移量。中断向量表是从0000:0000开始的,每4字节为一个表项。中断标号x4就是对应的中断向量表项所存的地址,高地址是基地址,低地址是偏移。
这么说不知道你懂不懂。。。
反正总结一下你的问题吧,中断服务程序是加载到内存中的,它在加载前可能是存在BIOS芯片上,也可能是存在硬盘里的;中断向量表里只能写上中断处理程序的入口地址,要知道每个表项只有4字节;具体的中断服务程序,我不信你学汇编的书上不讲,我大概讲一下:CPU的INTR引脚获得了中断信号,得到了标号,比方说是5号,中断向量表项为0000:000A,读取这个内存,得到中断程序入口地址比方说是AAAA:BBBB,那么它会将当前的CS/IP、Flags寄存器入栈,然后转到AAAA:BBBB处去执行一直到iret指令返回原任务(或许该中断结束了这个任务,就不会返回了)。
至于保护模式的中断,相信你暂时还没遇到。到后面还有 *** 控8259A芯片来实现高级中断的,这个就不是一般需要学的了。
61是神马?51单片机?
格式:void 函数名()interrupt 中断号 using 工作组
{
中断服务程序内容
}
注意:中断不能返回任何值,所以前面是 void 后面是函数名,名字可以自己起,但不要与c语言的关键字相同;中断函数不带任何参数,所以 函数名后面的 () 内是 空的,中断号是指单片机的几个中断源的序号。这个序号是单片机识别不同中断的唯一标志。所以一定要写正确。
后面的using 工作组 是指这个这个中断使用单片机内存中 4 个工作寄存器的哪一组, c51 编译后会自动分配工作组,因此最后这句话我们通常省略不写。 c51 中断写法实例void T1-time() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
}
上面的意思是定时器 1 的中断服务程序,定时器 1 的中断服务序号是 3 ,因此我们要写成 interrupt 3 ,服务程序的内容是给 两个初值寄存器装入新值。。
写中断前的准备 1 TMOD 赋值 确定工作方式。T0 还是T1 的工作方式。
2 计算初值 装入 TH0 TL0 或者 TH1 TL1
3 中断方式时 ,对 IE 赋值,开放中断。
4 使 TR0 和 TR1 置位,启动定时器/计数器 定时/计数。
以上就是关于C语言在ARM DS5中如何编写中断服务程序全部的内容,包括:C语言在ARM DS5中如何编写中断服务程序、使用stc12c5a60s2双串口单片机时 串口2的中断服务子程序怎么写呢、汇编语言的中断服务的中断服务程序是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)