打印
[C语言]

中断与while(1)的效率

[复制链接]
3443|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xy123151|  楼主 | 2014-5-9 19:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近使用中断时有点疑惑,感觉在中断里面执行程序的效率要比while(1)高。
比如,我想用编码器采集转速,程序放在中断里采集的示数是50左右(PIT中断5ms/次)而放在while(1)中采集到的示数却是100多(while(1)里面只有两个函数,一个是OLED刷新,一个是堵转自动停止)。
我的想法是,1.可能采集的时候进入了中断干扰了采集。2.是其他函数占有了较多时间(OLED和堵转停止)
于是我想能不能当中断标志来的时候让程序返回while的第一句,可不知道要怎么实现,用GOTO?如果这样会不会影响到堆栈?
或者怎么在while里面设置个优先调度机制?

相关帖子

沙发
ayb_ice| | 2014-5-9 20:02 | 只看该作者
中断优先处理而已

使用特权

评论回复
板凳
NE5532| | 2014-5-9 22:35 | 只看该作者
效率是建立在功能正确的前提上的,你这个连功能都不对,谈不上效率。如果是很慢的事件(相对单片机运行速度而言),while里做(轮询)和中断都是可以处理的,楼主要检查自己的程序是不是有写错的地方。

使用特权

评论回复
地板
xy123151|  楼主 | 2014-5-10 11:56 | 只看该作者
NE5532 发表于 2014-5-9 22:35
效率是建立在功能正确的前提上的,你这个连功能都不对,谈不上效率。如果是很慢的事件(相对单片机运行速度 ...

刚学完C语言和接触单片机,有些地方还不是很明白
/*************************************
         PIT中断服务程序 (1ms)
**************************************/这是中断程序,就这一个中断

__interrupt void PIT_0()
{
  DisableInterrupt();
  
    PITTF_PTF0=1;//----------------------------------------清除中断标志
    g_pit_flag++;
    g_pit_counter++;

    switch(g_pit_counter)
    {
        case 5:
            get_cur_speed();//-----------------------------获取脉冲值
            get_AD_data();//-------------------------------采集电感的值
                    
            if(Out_Line_flag == 1)
               Out_line();
            else if((g_right_flag == 1)||(g_right_flag == 2))
                Right_angle();
            else
              Direction_Control();//-----------------------方向控制
           // Speed_Control();//-----------------------------速度控制
         
     
            g_pit_counter = 0;////---------------------------计数清零,5ms在进一次
           // OutPut_Data(); //------------------------------虚拟示波器
           PORTK_PK7 = 1;   //-----------------------------编码器清零
           PORTK_PK7 = 0;
           PORTB = 0x00;
           PACNT = 0x0000;
            break;
        default:break;
     }   
   
  EnableInterrupt();
}

这是for()循环的
for(;;)
   {
                 
      LCD_Get();  //---------------------------------------液晶显示
      key_control();//-------------------------------------按键扫描

      
      if(g_time_stop == 1)    //---------------------------调试停车
      {
          Delay_s(Stop_time);           
          PITCFLMT = 0x00;                    
          TSCR2_TOI = 0;
          Motor_stop();
          g_stop_time = 0;
      }     
           
     
      if(g_stop == 1)                //--------------------自动停车(速度为0时
         auto_stop();                  
     
   }
    _FEED_COP();                    //---------------------喂狗程序                 
}

本来是把switch里面的程序分部执行(case 1 case 2)后来感觉没差别就放一起了
如果把switch里的东西放到for()里面(不关闭总中断),编码器采集回来的示数是原来的2倍
好像中断里的程序执行时间会比5ms多,所以在中断末尾对编码器再清零一次
能否给点整改意见?谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

34

帖子

0

粉丝