我要讲的提高代码效率的方法很简单,不涉及底层。简单讲就是程序非阻塞。
何为阻塞?阻塞就是程序停在那里一动不动,比如又或者使用for循环做的延时- void delay(int time)
- {
- int i=0;
- for(i=0;i<time;i++);
- }
复制代码 要想程序执行效率高就不能使用毫秒级的阻塞写法,极短的阻塞是可以的比如IIC的电平翻转的间隔延时。非阻塞写法的一大重要方法就是状态机,以常用的LED闪烁为例。我们先准备三个函数。- void DelayTimeCount_ms(uint16_t *DelayTime_Count)
- {
- if(*DelayTime_Count==0)
- {
- *DelayTime_Count=0;
- }
- else
- {
- *DelayTime_Count-=1;
- }
- }
- void Set_Delay_Time(uint16_t Time,uint16_t *DelayTime_Count)
- {
- *DelayTime_Count=Time;
- }
- uint8_t CheckDelay(uint16_t *DelayTime_Count)
- {
- if(*DelayTime_Count==0)
- {
- return 0;
- }
- else
- {
- return 1;
- }
- }
复制代码 我们再创建一个全局变量用于设置LED闪烁间隔
接下来写一个LED闪烁函数并把其放在大循环调用
- void LED_Twinkle(uint16_t HarfPeriod)
- {
- static uint8_t Status=0;
- switch(Status)
- {
- case 0:
- {
- LED(ON);
- Set_Delay_Time(HarfPeriod,&DelayTime_LED);
- Status++;
- }break;
- case 1:
- {
- if(CheckDelay(&DelayTime_LED) == 0)
- {
- Status++;
- }
- }break;
- case 2:
- {
- LED(OFF);
- Set_Delay_Time(HarfPeriod,&DelayTime_LED);
- Status++;
- }break;
- case 3:
- {
- if(CheckDelay(&DelayTime_LED) == 0)
- {
- Status = 0;
- }
- }break;
- }
- }
复制代码 接下来我们还需要对DelayTime_LED进行处理
- DelayTimeCount_ms(&DelayTime_LED);
复制代码 上边这条语句需要放在滴答中断里(51没有专用滴答定时器可以用普通定时器模拟一个或者直接扔到大循环里也行)。可以发现用这种方法程序会飞快地循环不会在某个地方停下来。
这玩意没啥技术含量无非就是多写几行代码。如果有兴趣的话可以看看我发的矩阵键盘驱动和modbus主机驱动里边有更详细的应用。
|