switch...case中断开与关的疑惑

2019-07-20 23:26发布

[ 本帖最后由 yuyan 于 2019-6-27 15:12 编辑 ] 我把按键设置了外部中断,在while(1) 中放了switch...case 语句检查按键状态并进行相应处理(里面也是一些switch...case语句,从入口进去case下只有四五条简单语句),之后将按键状态置0以便下一次检测,实际跑的时候经常有卡顿(按键不灵),怀疑按键中断发生在switch..case 语句和按键置0语句之间,于是在这段前后关闭中断,果然变得非常流畅。可是当我把关中断单独放在switch...case语句前后或者按键置0语句前后,按键还是不灵敏。这就有点邪门,难道按键中断有那么高的几率正好发生在switch...case之后和按键置0之前的这个空当里?还是说switch...case语句执行效率实在太慢,以至于每次按键中断来临的时候,还在case语句中逐条检查按键状态?其实我是不希望在switch...case中关闭中断的,因为有些按键处理需要中断介入,有什么好办法不影响按键流畅度吗?

while(1)        
{                 
   value = __get_PRIMASK();                 
   __set_PRIMASK(1);                  
  switch(key_pressed)               
  {                        
    case KEY1_PRESS:                                
      key1_process();                                
      break;                        
    case KEY2_PRESS:                                
      key2_process();                                
      break;                        
    case KEY3_PRESS:                                
      key3_process();                                
      break;                        
    case KEY4_PRESS:                                
      key4_process();                                
      break;                        
    case KEY5_PRESS:                                
      key5_process();                                
      break;                        
    case KEY6_PRESS:                                
      key6_process();                                
      break;               
  }
  //按键中断正好发生在此处空当?               
  key_pressed = 0;                                                //清除按键标志               
  __set_PRIMASK(value);               
  lcd_show();
  other_statements...        
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
yuyan
1楼-- · 2019-07-21 03:44
坛子好容易恢复了,现在排版怎么回事?
warship
2楼-- · 2019-07-21 09:18
本帖最后由 warship 于 2019-6-27 22:07 编辑

case语句执行是非常快的,并不是一个一个地比较,是根据入口值直接跳转(通过查一张编译好的跳转地址表)
你可以把key_pressed = 0放在每个key_process()函数的后面试试。

一周热门 更多>