为什么我的单片机不是“跑车”而是“牛车”,过来人告诉你

大家好我是华维蔵鹰,我从业单片机这个行业也有些年头了,刚开始我写的程序跑起来也像老爷车一样慢吞吞的,在整个程序的载入过程中大概要一分多钟,而同事做的另一个版本的比我快上20秒左右。我们都是参考老版本代码做出来的东西,这个差距无疑是非常大的。

后面通过在网上收集了很多的资料和查看一些大神的代码,我发现里面也是有一些门道的。大概在两三年前我写的程序里已经几乎找不到 delay() 了,因为程序中没有 delay 你会发现整个程序跑起来会明显的发现会比之前带有delay的快。下面我们来聊一下平时写单片机程序中一些可以让我们加速的地方。

我们的程序框架是 main 函数里先初始化,然后 while(1),前台程序是各种中断。

以下几种情况是导致我们程序运行久的常见原因:一种是按键程序判断会用到 delay 消抖,最典型的消抖需要耗时5ms。一种是动态显示时候显示一位数码管时候也会用到延时 5ms 左右。还有一种是等待串口发送完成。单片机处理的速度在“微秒”级,而按键抖动的时间至少在“毫秒”级,这对于单片机来说是一个非常“漫长”的过程。

像消抖和数码管的延时问题我们可以这样处理,我们可以在定时中断里面判断按键的状态,用定时中断服务程序或利用标志位的方法来实现软件消抖。

串口中断发送这个功能我估计很多人没有用过,很多人觉得没有必要,因为不是每个人都遇到过大型项目的开发,当项目对实时性要求很高,你的程序又很大,需要服务的地方很多,那你用非常耗时的方式发送就会降低整个程序的实时性。

我们简单的举个例子就能体现出来,9600 波特率发送一个字符 1ms时间,如果一次发送 50 个字符就是相当于执行 delay(50); 如果我们用中断发送,整个过程很简单,打开串口发送中断,第一个字符是程序发送,剩余的在发送中断里面发送就可以了。

上面我们聊到的是属于单种情况的解决方法,我们在实际情况中遇到的通常是一个完整型操作里面有的需要执行速度很快,有的又必须使用慢的方式。

例如一个温度传感器,它要求先下发转换命令然后等待一定时间后才能进行下一步操作。这个时候我就会这样处理,把这个任务分解成两个部分,一个是启动转换,另一个是读。

程序形式如下:

startcov();

delay();

read();

当然上述的 delay 并不是执行一些无关命令,而是在一个标志位。

也可以把上面所说的的三个函数封装到一个函数里面。

例如取个名字叫HUAWEI():

voidHUAWEI()

{

static u8 state=0;


switch(state)

{

case 0:

startcov();

state++;

break;

case 1:

if(flag_500ms)

state++;

break;

case 2:

read();

state=0;

break;

}

}

}

然后在 while(1) 里不断的调用HUWWEI() 函数即可。

我们的程序中只要没有了 delay 你就会发现执行速度飞快,因为我们绝大部分程序都是赋值和 if 判断,因此执行速度会非常的快。


单片机的编程世界是很简单的,你要想它想跑车一样的运行的快,只要你为它消除道路上的障碍,让它运行的道路平坦,它自然能以它最快的速度去运行,给出它最出色的表现。

希望以上的知识能够给大家提供帮助,这期我们先分享到这里,觉得有用的可以给个三连!


想要一起学习单片机的朋友,评论”我要入门“,有惊喜,加入我们,就可以与导师一对一互动,快速成长


举报
评论 0