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

请问:在中断里可以调用 原先定义的函数吗?为什么小弟我 调用,就出现警告呢

2012-03-31 
请教:在中断里可以调用 原先定义的函数吗?为什么我 调用,就出现警告呢?//功能:SD2,SD3,SD4显示//参数:LedN

请教:在中断里可以调用 原先定义的函数吗?为什么我 调用,就出现警告呢?
//功能:   SD2,SD3,SD4     显示      
//参数:   LedNumber表示是数码管的个数
//参数:   LedCoin   是显示的数码管内容

void   SD234Display(int   LedNumber   ,uchar8   *LedCoin)   //SD2,SD3,SD4   显示
{
       
    int   i;                           //数码管的个数
        int   j;                           //送出数据时的   8   次循环

    int     LedB;                   //真正的下标,是通过     Led   转换过来的
        uchar8     *Led595s;           //定义数码管内容指针
        uchar8     Led;                 //要显示的数字,也是   数组   Led595NoDot   或   Led595Dot   中被
                                                //选取元素的下标,不过这里得到的是字符
        uchar8       LedN;             //数组   Led595NoDot   或   Led595Do   中真正被选中的元素
       
       
          i   =   0;           //初始化   i   为   LedNumber   表示从字符串的最后一个开始处理,
                                              //也就是从最后一个开始输出
      Led595s   =     LedCoin   ;   //使   Led595   和     LedCoin   指向同一个地址

       
        while(i <LedNumber)       //当   i   小于   数码管个数
        {
             
                Led   =   *(Led595s+i);   //取出数据
                LedB   =   Led   -   '0 '   ;   //得到数组真正的下标     ,因为   Led   是   char   类型的
                i=i++;  
       
                //*****************************处理   Led   ****************
                LedN   =     Led595Dot[LedB];
               
            for   (j=0;   j <8;   j++)
                    {
                            if   (LedN   &   0x01)   //发送   1
                                      {
                                          CK1   =   0   ;    
                                  DIN2   =   1;


                                  _nop_();
                              _nop_();
                              CK1   =   1;
                          }
                        else                           //发送   0
                                  {
                                            CK1   =   0   ;      
                                  DIN2   =   0;
                                  _nop_();
                              _nop_();
                              CK1   =   1;
                          }
                      LedN   =   LedN   > >   1;                           //LedN   右移
                    }
                   
              //****************************处理   Led   ****************
      }//whie(i <LedNumber)
               
    //***************一次送出**********
          _nop_();
        _nop_();
       
        LATCH2   =   0;                           //在时钟下降沿把数据送出
        _nop_();
        _nop_();
        LATCH2   =   1;
    //***************一次送出**********          
}        

void   Jtimer1(void)   interrupt   3       //喂狗中断程序
{
    TH1   =   60536/256;           //重载计数初值   每   10   ms   中断一次
    TL1   =   60536%256;
                                                         
    if   (IsOrNoJs== 'Y ')//表示时间开始减
              {
              WDogZdJs   ++;
              if   (   WDogZdJs   > =   4610   )   //4600-4610   之间


                        {
                                  WDogZdJs   =   0;   //赋初值
                                TimeJNumber++;
                               
                        Sd4Numner   =   SD234Number[0]   -   '0 ';     //SD4   此时的值
                        Sd3Numner   =   SD234Number[1]   -   '0 ';     //SD3   此时的值
                        Sd2Numner   =   SD234Number[2]   -   '0 ';     //SD2   此时的值
                       
                        if     ((Sd4Numner!=0)   ||   (Sd3Numner!=0)   ||   (Sd2Numner!=0))   //时分不都为   0   ,也就是还最少有   1   分钟
                                      {
                                                      if   (Sd4Numner==0)     //
                                                          {
                                                                  Sd4Numner   =   9;
                                                                  Sd3Numner   =   Sd3Numner   -   1;   //减位
                                                          }
                                              else
                                                          {
                                                                  Sd4Numner   =   Sd4Numner   -1;
                                                          }


                                                     
                                              if   (Sd3Numner <0)
                                                          {//2
                                                                  Sd3Numner   =   9;
                                                                  Sd2Numner   =   Sd2Numner   -1;
                                                                  if   (Sd2Numner <0)
                                                                            {
                                                                                    Sd2Numner   =   9;
                                                                            }
                                                              }//2
                                                                                                   
                                  SD234Number[0]=Sd4Numner   +   '0 ';       //化为   char   类型
                                  SD234Number[1]=Sd3Numner   +   '0 ';       //化为   char   类型        
                                            SD234Number[2]=Sd2Numner   +   '0 ';       //化为   char   类型
                                            SD234Display(3,SD234Number);   //使数码管显示     这里有个警告


                                        }//if     ((Sd4Numner==0)   ||   (Sd3Numner==0)   ||   (Sd3Numner==0))                                        
                }//WDogZdJs   > =   60
                 
          }//IsOrNoJs== 'Y '  
               
}          


我在   void   Jtimer1(void)   interrupt   3     调用了
SD234Display(3,SD234Number);   //使数码管显示    
Build   target   'Target   1 '
assembling   STARTUP.A51...
compiling   MAIN.C...
linking...
***   WARNING   L15:   MULTIPLE   CALL   TO   SEGMENT
        SEGMENT:   ?PR?_SD234DISPLAY?MAIN
        CALLER1:   ?C_C51STARTUP
        CALLER2:   ?PR?JTIMER1?MAIN
Program   Size:   data=66.0   xdata=0   code=952
creating   hex   file   from   "PRO "...
"PRO "   -   0   Error(s),   1   Warning(s).


各位大哥,我是错在哪里?
谢谢!

[解决办法]
你在有可能同一时间调用了一个不可重入函数!!

热点排行