51的中断函数问题
本帖最后由 wildone 于 2014-4-4 00:18 编辑请问各位高手,
问题1:C语言中,51中断函数不在主函数里面,写在其它文件,能顺利进入中断吗?
问题2:C 语言中,51中断函数里面不写吗?这样会不会出问题?
例如 void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数
{
}
问题3:C语言中,51主函数文件里面有个全局变量unsigned char TEMP=0;,其它模块文件里面有个子函数里面有个变量如voiddelay(unsigned int TEMP); 这样有影响吗?
问题4:C语言中,51主函数文件里面有个全局变量unsigned char TEMP=0;,其它模块文件里面有个子函数里面有个变量如
unsigned chardelay(unsigned int A)
{
return TEMP;
}
这样有影响吗?
1,能。2,如中断发生后不清除相关标志位,将不能再次进入中断函数。3和4无影响。另外你应该自己验证一下。 xiakang 发表于 2014-4-4 00:28
1,能。2,如中断发生后不清除相关标志位,将不能再次进入中断函数。3和4无影响。另外你应该自己验证一下。 ...
谢谢回答问题
第一个问题:如果能,需不需要在头文件再声明这个中断?
第二个问题:定时器工作方式2是自动重装载,不用清除相关标志位,所以这个函数是可以写空的吧?
麻烦大侠了,我也会再验证一下 1、根本不能写到主函数里面,写在其他什么位置都可以。不需要在头文件再声明这个中断。
2、这个函数是可以写空。印象中,51就只有T2才需要考虑相关标志位,其他的都不用管。
3、你要注意作用域的问题,没有影响的。
4、没有影响。 昨晚看了一点STM32的定时器,写法和51的不一样,虽然都是KEIL
不过这点挺好的,打开51的工程,直接编译,都好使,然后换STM32的工程,也直接编译,同一个软件,用起来很方便
奔四的人了,脑袋不灵了,看东西一会儿就困啊,哎 xiaobendan 发表于 2014-4-4 08:25
昨晚看了一点STM32的定时器,写法和51的不一样,虽然都是KEIL
不过这点挺好的,打开51的工程,直接编译,都 ...
哈哈,谢谢 takashiki 发表于 2014-4-4 06:55
1、根本不能写到主函数里面,写在其他什么位置都可以。不需要在头文件再声明这个中断。
2、这个函数是可以 ...
{:loveliness:} 刚才实验了,你们说的都是对的 MARK一下 本帖最后由 gosfon 于 2014-4-15 14:39 编辑
前两个问题大家都说了,不过问题1要注意一点,你得把包含中断程序的那个文件加入在Keil(假设你用这个)的工程中。
我补充一下问题3和问题4
问题3,如果一个函数中有一个变量与全局变量同名(设为Temp),运行时会这样处理,在进入函数前,
先保存全局变量Temp的值到堆栈中,进入函数内后就和全局变量Temp无关了,函数内只和内部定义的Temp有关,
退出函数后,将全局变量Temp的值从堆栈中还原。
#include <stdio.h>
unsigned int delay(unsigned int Temp ) {
while(Temp) {
Temp--;
}
printf("局部变量Temp = %u\n", Temp);
return Temp;
}
unsigned int Temp = 5; // 全局变量
void main(void){
printf("全局变量Temp = %u\n\n", Temp);
delay(Temp);// 调用函数,其中delay函数有个同名的变量Temp
printf("\n全局变量Temp = %u\n", Temp);
}
/* 运行结果
全局变量Temp = 5
局部变量Temp = 0
全局变量Temp = 5
*/
问题4,和问题3的解决方法一样,函数内部的同名变量不会影响外部的同名变量,各算各的,里面的不会修改外面的,外面的也不会修改里面的
页:
[1]