首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

关于C51中 中断子函数 调用其它函数 使用using 的有关问题?

2012-03-28 
关于C51中 中断子函数 调用其它函数 使用using 的问题???各位好:我今天晚上下班后又研究MCU了,呵呵,发现一

关于C51中 中断子函数 调用其它函数 使用using 的问题???
各位好: 

我今天晚上下班后又研究MCU了,呵呵,发现一个问题: 
我在中断子函数中,调用了其他的显示函数(其他的函数又调用其他的函数,是一个通信协议差不多4.5级调用吧),悲催的是不能正常显示,除非有两种办法: 
1. 把定时器0中断子函数interrupt 1 using 2的using 2给去掉,让程序按照入栈出栈变量的方式。 
2. 把被中断子函数调用的那个显示函数,以及被它调用的那些4.5级函数,有局部变量的统统加上using 2 选择一个寄存器组,才能正常工作。 

我想请问一下: 
1. 为什么要把有局部变量的加using 2,没有局部的就不加?我在网上搜了一下,没有符合这个话题的。 
2. 我让程序单步运行一下,发现单步运行时,在添加using 2 的中断服务子程序 和 未添加using 2 的被中断调用的程序中psw中的rs寄存器都是2,也就是说没添加也已经默认using 2了,请高手给与解答 

如下是被调用的那些函数:

C/C++ code
void CT1642_Wr_Bit( bit level )  // 显示函数调用的函数, 这个函数只有形参没有局部变量,就可以不加using {      if( CT1642_Choose_HIGH_Flag )      {           CT1642_CLK_H = LOW;           CT1642_DAT_H = level;           CT1642_CLK_H = HIGH;      }      else      {           。。。。。      } } void CT1642_Wr_Command( U8 dig1642, U8 dat1642 ) // 这个函数中有局部变量,就必须加using 才能被中断函数调用 {      U8 i;      for( i = 0; i < 4; i ++ )      。。。。。 } void CT1642_Show( void ) // 这个函数中有局部变量,就必须加using 才能被中断函数调用 {      U8 i;      U8 multi_temp = 0;      Key_Value = CT1642_NO_KEY;      for( i = 0; i < 8; i ++ )      {           。。。。。      } } void Is_Timer0( void ) interrupt 1 using 2 {      static U8 i;      TH0 = 0xB1;      TL0 = 0xE3;      TR0 = 1;      i ++;      if( i == 50 )  // 定时20ms      {           i = 0;           Display_Hex_Number ++;      }      Load_Display( );//要显示的数字装载函数      CT1642_Show( );// 显示函数 } main() {      P3 = 0xff;      Display_Hex_Number = 0;      PT0 = 0;      ET0 = 1;      EA = 1;      TMOD = 0x01;      TH0 = 0xB1;      TL0 = 0xE0;      TR0 = 1;      while( 1 )      {           ;      } }


[解决办法]
你这样搞,一个中断得执行多久才能执行完?还要不要为其它的中断服务了?
你可以在中断里设置个标志位,然后在主流程中查询这个标志位是否置位,如果置位了,就调用显示函数。
[解决办法]
中断处理函数中调用的其他函数,应该定义为可重入的(reentrant)

热点排行