[应用方案] 关于如何提高代码的执行效率

[复制链接]
310|31
SolitudeSage 发表于 2025-10-18 08:08 | 显示全部楼层 |阅读模式
我要讲的提高代码效率的方法很简单,不涉及底层。简单讲就是程序非阻塞。
何为阻塞?阻塞就是程序停在那里一动不动,比如

  1. while(a==0);
又或者使用for循环做的延时
  1. void delay(int time)
  2. {
  3.      int i=0;
  4.      for(i=0;i<time;i++);
  5. }
要想程序执行效率高就不能使用毫秒级的阻塞写法,极短的阻塞是可以的比如IIC的电平翻转的间隔延时。非阻塞写法的一大重要方法就是状态机,以常用的LED闪烁为例。我们先准备三个函数。
  1. void DelayTimeCount_ms(uint16_t *DelayTime_Count)
  2. {
  3.      if(*DelayTime_Count==0)
  4.      {
  5.          *DelayTime_Count=0;
  6.      }
  7.      else
  8.      {
  9.          *DelayTime_Count-=1;
  10.      }
  11. }
  12. void Set_Delay_Time(uint16_t Time,uint16_t *DelayTime_Count)
  13. {
  14.      *DelayTime_Count=Time;
  15. }
  16. uint8_t CheckDelay(uint16_t *DelayTime_Count)
  17. {
  18.      if(*DelayTime_Count==0)
  19.      {
  20.          return 0;
  21.      }
  22.      else
  23.      {
  24.          return 1;
  25.      }
  26. }
我们再创建一个全局变量用于设置LED闪烁间隔
  1. uint16_t DelayTime_LED;
接下来写一个LED闪烁函数并把其放在大循环调用
  1. void LED_Twinkle(uint16_t HarfPeriod)
  2. {
  3.     static uint8_t Status=0;

  4.     switch(Status)
  5.     {
  6.         case 0:
  7.         {
  8.             LED(ON);
  9.             Set_Delay_Time(HarfPeriod,&DelayTime_LED);
  10.             Status++;
  11.         }break;
  12.         case 1:
  13.         {
  14.             if(CheckDelay(&DelayTime_LED) == 0)
  15.             {
  16.                 Status++;
  17.             }
  18.         }break;
  19.         case 2:
  20.         {
  21.             LED(OFF);
  22.             Set_Delay_Time(HarfPeriod,&DelayTime_LED);
  23.             Status++;
  24.         }break;
  25.         case 3:
  26.         {
  27.             if(CheckDelay(&DelayTime_LED) == 0)
  28.             {
  29.                 Status = 0;
  30.             }
  31.         }break;
  32.     }
  33. }
接下来我们还需要对DelayTime_LED进行处理
  1. DelayTimeCount_ms(&DelayTime_LED);
上边这条语句需要放在滴答中断里(51没有专用滴答定时器可以用普通定时器模拟一个或者直接扔到大循环里也行)。可以发现用这种方法程序会飞快地循环不会在某个地方停下来。
这玩意没啥技术含量无非就是多写几行代码。如果有兴趣的话可以看看我发的矩阵键盘驱动和modbus主机驱动里边有更详细的应用。




AquaWhisper 发表于 2025-10-18 09:50 | 显示全部楼层
代码效率这种,要每个步骤都注意细节很难了
作业天敌在此 发表于 2025-10-31 16:12 | 显示全部楼层
状态机的实现方式很巧妙,值得实践一下。
Labyrinth 发表于 2025-11-3 09:11 | 显示全部楼层
AquaWhisper 发表于 2025-10-18 09:50
代码效率这种,要每个步骤都注意细节很难了

是的如果是死扣的话也很花时间的
backlugin 发表于 2025-11-5 11:35 | 显示全部楼层
优先采用时间复杂度低的算法              
kkzz 发表于 2025-11-5 14:31 | 显示全部楼层
利用硬件加速模块              
uptown 发表于 2025-11-5 16:26 | 显示全部楼层
编译器通常将局部变量分配在寄存器或栈上,访问速度远快于全局变量。尽量将只在函数内使用的变量声明为局部变量。
juliestephen 发表于 2025-11-5 17:44 | 显示全部楼层
选择合适的主频与外设              
adolphcocker 发表于 2025-11-5 20:21 | 显示全部楼层
优先使用时间复杂度低的算法              
uiint 发表于 2025-11-6 20:53 | 显示全部楼层
效率源于设计和权衡              
jtracy3 发表于 2025-11-7 16:34 | 显示全部楼层
优化存储器访问              
sesefadou 发表于 2025-11-8 10:43 | 显示全部楼层
大多数低端单片机没有硬件FPU,浮点运算由软件库实现,极其缓慢。
timfordlare 发表于 2025-11-8 12:44 | 显示全部楼层
复杂度是关键              
mollylawrence 发表于 2025-11-8 15:09 | 显示全部楼层
循环是优化的重点,因为微小的改进都会被放大。
bartonalfred 发表于 2025-11-8 21:41 | 显示全部楼层
传递参数越多,调用开销越大。尽量传递指针或使用全局变量
zerorobert 发表于 2025-11-9 09:26 | 显示全部楼层
将循环内不随循环变化的计算移到循环外。
louliana 发表于 2025-11-9 11:16 | 显示全部楼层
使用位操作替代乘除法能显著提升运算速度
1988020566 发表于 2025-11-9 14:50 | 显示全部楼层
减少循环条件判断的次数。              
wilhelmina2 发表于 2025-11-9 16:36 | 显示全部楼层
核心理念:效率 = 速度 + 空间 + 功耗
juliestephen 发表于 2025-11-9 18:39 | 显示全部楼层
将大概率执行的分支放在if中,小概率放在else
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

64

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部