C语言中不轮询如何处理中断?

[复制链接]
4525|14
 楼主| a5566255 发表于 2008-11-28 10:56 | 显示全部楼层 |阅读模式
汇编可以在中断地址放一个跳转指令,这样程序可以做自己的事有中断它才响应,C语言呢?
HWM 发表于 2008-11-28 11:01 | 显示全部楼层

有相应中断服务程序的具体写法,不同内核或编译器有自己

具体查看相应的技术手册。
孤星119 发表于 2008-11-28 11:22 | 显示全部楼层

跟汇编同理.比如:

void time0() interrupt 1 
{    
}
 楼主| a5566255 发表于 2008-11-28 13:02 | 显示全部楼层

比如51单片机,

HWM大虾所指的技术手册是什么?AT89S52的芯片手册中有写C语言中断函数么?

#include
#include
sbit P1_0=P1^0;
void int1(void) interrupt 2
{
P1_0=!P1_0;
}
void main(void)
{
IT1=1;EX1=1;EA=1;
}
我这样写就行了么?
还是要在MAIN中用WHILE(1)轮询int1函数?


如果如我上面所写是对的,那过程是不是这样:
在MAIN中打开了中断开关,MCU侦测到中断就自动运行INTERRUPT过程(之前运行处的程序指针压入堆栈),执行完中断程序自动跳到原来运行的地方(不用我手动引导吧)?
HWM 发表于 2008-11-28 13:11 | 显示全部楼层

看Keil C51的相关文档(如果你是用C51的话)

 楼主| a5566255 发表于 2008-11-28 13:14 | 显示全部楼层

嗯,我C51只看了些简易入门教程。。。。

以为这些就可以了,。。。。。。
HWM 发表于 2008-11-28 13:24 | 显示全部楼层

Keil/C51/HLP文件夹内有一大堆,可以参考其中的C51帮助文档

耕在此行 发表于 2008-11-28 20:17 | 显示全部楼层

按楼主说的没错.

中断函数已经指明了中断入口地址(interrupt 2)
其它跳转什么的的编译器会自动处理.
另外中断函数要指明所使用的通用寄存器组.
不过没使用的话不需指明.
 楼主| a5566255 发表于 2008-11-28 20:34 | 显示全部楼层

哦,谢谢耕在此行大虾!

又省了不少我明天看书的时间了哈哈~~
“不过没使用的话不需指明”何意?我写这个函数自然是为了使用,那就一定要using XX(XX忘了怎么写了)?可我百度搜到一些例子都没加啊??
zq1987731 发表于 2008-11-28 21:07 | 显示全部楼层

51有4组R0~R7寄存器

平时一般使用第一组,也就是using 0:

    void int1(void) interrupt 2 using 0
    { 
        P1_0 = !P1_0;
    }

在中断里你觉得有必要就避开下using 1/2/3好了,这样不至于破坏第一组R0~R7寄存器中的值。
但如果你的中断程序仅仅只是在做这种事:P1_0=!P1_0; 和R0~R7一点关系都没有,还加个using X,不就是多此一举么?
 楼主| a5566255 发表于 2008-11-28 23:34 | 显示全部楼层

哦,明白了,我之前是误解大虾的意思了~~

行了,谢谢LS各位,这样就算学习C语言处理中断啦哈哈~~
xhtxzxw 发表于 2008-11-28 23:57 | 显示全部楼层

嘿嘿

你那个妹n()函数,执行完了就完了,一会又从头开始了!
初始化做完了以后,应该是一个死循环.不错,就是死,别怕,怕死不革命.呵呵
耕在此行 发表于 2008-11-29 08:23 | 显示全部楼层

呵呵 楼上看得仔细

mymystery 发表于 2008-12-3 13:14 | 显示全部楼层

目前也只知道用main轮询,不会用其他方法

weishg 发表于 2008-12-3 14:43 | 显示全部楼层

关于using的使用

好像中断程序如果不用using x另外指明寄存器组,那么keil c编译器会自动在中断函数前头作寄存器内容入栈等保护,返回前再出栈,如果用using x指明了另外的寄存器组,则在中断函数中编译器就不用作入栈出栈保护了,而且using x所用的寄存器组不能和当前已经使用过的出现冲突,否则程序流程处理不当可能会出现运行失误等情况
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

218

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部