有什么办法可以改善这个ISR - STM32F401RE吗?

2019-07-14 17:23发布

我目前正在从头编写飞行控制器,目前我正在使用该模块来解码传入的PPM信号。请记住,这是一个ISR,我的功能仅限于从接收器读取通道值。它工作完全没问题,但我想要一些反馈和改进(如果可能的话)。ISR如下:
  1. void measureChannel(){
  2.    int elapsedtime = t.read_us();
  3.           //if any pulse shorter than 1000us, discard as garbage
  4.    if(elapsedTime < 900){
  5.         t.reset();
  6.         return;
  7.     }

  8.   else{
  9.         //if start/stop sequence, then set currentChannel = 1 and begin to read
  10.         if(elapsedTime > 2100) {
  11.                 currentChannel = 1;
  12.                 t.reset();
  13.                 return;
  14.             }
  15.         //read channel value
  16.         else if(elapsedTime >= 1000 && elapsedTime <= 2000){
  17.                 if(currentChannel == 1){
  18.                         channelVal[0] = elapsedTime;
  19.                         currentChannel = 2;
  20.                         t.reset();
  21.                         return;
  22.                     }

  23.                 else if(currentChannel == 2){
  24.                         channelVal[1] = elapsedTime;
  25.                         currentChannel = 3;
  26.                         t.reset();
  27.                         return;
  28.                     }

  29.                 else if(currentChannel == 3){
  30.                         channelVal[2] = elapsedTime;
  31.                         currentChannel = 4;
  32.                         t.reset();
  33.                         return;
  34.                     }

  35.                 else if(currentChannel == 4){
  36.                         channelVal[3] = elapsedTime;
  37.                         currentChannel = 5;
  38.                         t.reset();
  39.                         return;
  40.                     }

  41.                 else if(currentChannel == 5){
  42.                         channelVal[4] = elapsedTime;
  43.                         currentChannel = 6;
  44.                         t.reset();
  45.                         return;
  46.                     }

  47.                 else if(currentChannel == 6){
  48.                         channelVal[5] = elapsedTime;
  49.                         currentChannel = 0;
  50.                         t.reset();
  51.                         return;
  52.                     }
  53.             }
  54.       }
  55. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
msvdsufsdf
1楼-- · 2019-07-14 23:53
假设这些全局变量是在ISR之外访问的,那么它们应该被声明为volatile
sfafa
2楼-- · 2019-07-15 00:16
 精彩回答 2  元偷偷看……
随行者011011
3楼-- · 2019-07-15 04:45
不需要返回语句

为了清晰起见,最好使用一些数组来最小化代码

读取通道值部分可写为:

  //read channel value
  else if(elapsedTime >= 1000 && elapsedTime <= 2000)
  {
       if((currentChannel >= 1) && (currentChannel <= 6))
       {
             channelVal[currentChannel - 1] = elapsedTime;
             currentChannel = (currentChannel + 1) % 7;
       }
  }

一周热门 更多>