OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2270|回复: 2

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

[复制链接]

19

主题

31

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2019-6-16
在线时间
27 小时
发表于 2019-6-27 14:56:48 | 显示全部楼层 |阅读模式
10金钱
[ 本帖最后由 yuyan 于 2019-6-27 15:12 编辑 ]\n\n我把按键设置了外部中断,在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...        
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

31

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2019-6-16
在线时间
27 小时
 楼主| 发表于 2019-6-27 15:06:30 | 显示全部楼层
坛子好容易恢复了,现在排版怎么回事?
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4520
金钱
4520
注册时间
2018-5-11
在线时间
946 小时
发表于 2019-6-27 20:09:30 | 显示全部楼层
本帖最后由 warship 于 2019-6-27 22:07 编辑

case语句执行是非常快的,并不是一个一个地比较,是根据入口值直接跳转(通过查一张编译好的跳转地址表)
你可以把key_pressed = 0放在每个key_process()函数的后面试试。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-13 17:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表