串口服务器中断,串行口中断服务的程序是什么?

编中断服务程序举例

这里先举一个完整的自己能上机练习的中断服务程序例子。在第六章中介绍完可编程计数器/定时器8253后再举一例(在Pc系列机中加入一个用户中断源——可编程定时中断),说明在PC系列机中加入一个用户中断源应做的工作。

例 利用1CH软中断作定时处理——每次进入1CH中断时显示一个“*”,18次后显示一个字符串“second”(秒)。

关于1CH软中断,前面已经介绍,是留给用户进行定时处理的“软接口”。在软时钟中断(中断类型号为08H)处理过程中,要调用一次INT 1CH软中断。系统本身(指DOS)在1cH中断服务程序中仅安排了一条中断返回指令,即什么也没有做,直接返回。所以,用户可重新编写1CH的中断服务程序,在其中加入自己所需的定时处理。下面是用Turbo C编写的1CH中断服务程序以及对1CH中断进行设置的主程序的清单。编译、连接,形成可执行文件后便可运行(DOS环境下)。

#include

union REGS in,out;

int U=0;

char fg=0;

void interrupt(*old intlc)(void); /*定义old_intlc为中断函数指针*/

void interrupt new_intle() /*自编的1CH中断服务程序*/

{in.h.ah=OxOe; /*调用BIOS功能显示字符'*'*/

in.h.al='*':

in.h.bh=0;

int86(0x10,&in,&out);

n++;if(n>=18){n=0;fg=1;}

}

main()

{old_intle=getvect(Oxlc); /*取原ICH中断向量*/

setveet(0xlc,new_intlc); /*置新的1CH中断向量*/

for(;;)

{if(fg==1){pfinff("second");fg=0;}

if(bioskey(1)!=0) /*按任一键,恢复原1CH中断向量,程序结束*/

{setvect(0xlc,old_intle);exit(O);{

}

程序中已作了一些注解,但还需要说明几点:

①程序的第二行定义in,out为union(联合)REGS类型的变量,一个用作C语言BIOS功能调用(int86)的输入变量,另一个作输出变量。联合REGS在头文件dos.h中作了定义(所以要引用DOS.H),定义如下:

struct WORDREGS

{unsigned int ax,bx,cx,dx,si,di,cflag,flags;}

struct BYTEREGS

{unsigned char al,ah,bl,bh,cl,ch,dl,dh;

union REGS

{struct WORDREGS x;

struct BYTEREGS h;

}

可见,REGS是结构WORDREGS和结构BYTEREGS的联合。这样,在c语言中可直接对寄存器进行操作。例如,通过in.x.ax可引用16位寄存器Ax,通过in.h.ah可引用8位寄存器AH。

②在turbo c中,中断服务程序是用类型为interrupt的函数表示的,函数名即为中断服务程序入口地址。所以在Turbo c中编写中断服务程序是相当方便的。

③在上述程序清单中没有见到保护现场和恢复现场,实际上这是由 Turbo C编译程序自动安排的(从编译的目标代码中可看到保护现场和恢复现场,且现场考虑得较全)。

④自编的中断服务程序开始的4行为调用BIOS功能显示字符“*”,这相当于下面的汇编语言程序段:

MOV AH,OEH

MOV AL.'*'

MOV BH,O

INT 10H ;在当前光标处显示一个字符

⑤软中断服务结束不需要发中断结束命令。中断结束命令只有外部可屏蔽硬中断才需要。

这个是 你需要的么?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值