Stm32中C语言if如何跳出或怎么组合

2019-12-13 18:25发布

用stm32做一个扫描程序,扫描要快,现在写好后速度不够,要提速度,下面这个代码怎么优化?

if(((rg>>1) & 0x01) && (dH1L0 == 1) )
  {
    if(RGn == 0)  RD0_H;
    if(RGn == 1)  RD1_H;
    if(RGn == 2)  RD2_H;
    if(RGn == 3)  RD3_H;
    if(RGn == 4)  RD4_H;
    if(RGn == 5)  RD5_H;
    if(RGn == 6)  RD6_H;
   ......
   if(RGn == 99)  RD99_H;


如上面代码所示,每次扫描这个代码都要把99个都跑完,每次扫描其中只会一个有效,网上找了下if没有break语句,用return的话后面的代码就没法执行了,现在求助大家,有没有好的办法,
考虑过绑定的问题,但不知道怎么绑语句,

现在想绑变量的方式就不用跑99次了,一次就可以,但不会用

类似   RD##RGn##_H;

大家看下,怎么优化这个语句,其中C语言编译已经使用的速度优化了,系统时钟也开到最高了

39条回答
maxking
1楼 · 2019-12-14 06:05.采纳回答
用switch比if快
jianfengxixi
2楼-- · 2019-12-16 05:53
指针数组
sq0101
3楼-- · 2019-12-16 10:55
 精彩回答 2  元偷偷看……
sq0101
4楼-- · 2019-12-16 14:24
flash3g 发表于 2019-2-21 21:56
RGn是顺序的可以用函数指针数组直接索引跳转是最快的

另外你的RDx_H 是什么? ...

是宏定义,替代把io置位的操作。
firewind
5楼-- · 2019-12-16 16:11
加个判断?这样的话平均下来,应该可以少很多,很坏就20多次判断。

if (RGn <=20)
{
    if(RGn == 0)  RD0_H;
.....
    if(RGn == 20)  RD3_H;
}

if (RGn > 20 &&RGn <= 40)
{
    if(RGn == 21)  RD0_H;
.....
    if(RGn == 40)  RD3_H;
}
canspider
6楼-- · 2019-12-16 19:40
用位带来做
__IO uint32_t*  const io_op[] = {
   BIT_BAND( GPIOA->BSRR, 1),
   BIT_BAND( GPIOC->BSRR, 4),
   BIT_BAND( GPIOB->BSRR, 3),
   ....
};

*io_op[RGn] = 1;
heyj6969
7楼-- · 2019-12-16 20:45
试下
do{
    if(RGn == 0)  {
        RD0_H;
        break;
    }
    ...
}while(0);
当然,最坏情况还是要if99次

一周热门 更多>