wildone 发表于 2014-4-4 00:06:31

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;
                                                                }                                                                               
                                                               这样有影响吗?
       

xiakang 发表于 2014-4-4 00:28:35

1,能。2,如中断发生后不清除相关标志位,将不能再次进入中断函数。3和4无影响。另外你应该自己验证一下。

wildone 发表于 2014-4-4 01:18:08

xiakang 发表于 2014-4-4 00:28
1,能。2,如中断发生后不清除相关标志位,将不能再次进入中断函数。3和4无影响。另外你应该自己验证一下。 ...

谢谢回答问题
第一个问题:如果能,需不需要在头文件再声明这个中断?
第二个问题:定时器工作方式2是自动重装载,不用清除相关标志位,所以这个函数是可以写空的吧?
麻烦大侠了,我也会再验证一下

takashiki 发表于 2014-4-4 06:55:09

1、根本不能写到主函数里面,写在其他什么位置都可以。不需要在头文件再声明这个中断。
2、这个函数是可以写空。印象中,51就只有T2才需要考虑相关标志位,其他的都不用管。
3、你要注意作用域的问题,没有影响的。
4、没有影响。

xiaobendan 发表于 2014-4-4 08:25:22

昨晚看了一点STM32的定时器,写法和51的不一样,虽然都是KEIL
不过这点挺好的,打开51的工程,直接编译,都好使,然后换STM32的工程,也直接编译,同一个软件,用起来很方便
奔四的人了,脑袋不灵了,看东西一会儿就困啊,哎

wildone 发表于 2014-4-4 13:13:52

xiaobendan 发表于 2014-4-4 08:25
昨晚看了一点STM32的定时器,写法和51的不一样,虽然都是KEIL
不过这点挺好的,打开51的工程,直接编译,都 ...

哈哈,谢谢

wildone 发表于 2014-4-4 14:26:30

takashiki 发表于 2014-4-4 06:55
1、根本不能写到主函数里面,写在其他什么位置都可以。不需要在头文件再声明这个中断。
2、这个函数是可以 ...

{:loveliness:} 刚才实验了,你们说的都是对的

戒魔 发表于 2014-4-12 16:35:25

MARK一下

gosfon 发表于 2014-4-15 14:37:59

本帖最后由 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]
查看完整版本: 51的中断函数问题