单片机编程思想之消除阻塞

本人写单片机程序也有五六年了,其实在三年前我写的程序里几乎没有 delay() 了,如果你的程序没有 delay 那么整个程序执行起来会非常的快。下面我们来分析下平时写单片机程序中所遇到的阻塞,以及解决思路。

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

阻塞有:

  1.  按键程序判断会用到 delay 消抖,典型的消抖是 5ms。
  2.  动态显示时候显示一位数码管时候也会用到延时 5ms 左右。
  3.  等待串口发送完成。
  4.  好像就这些比较耗时的了。

解决方法:

  1. 像这样的程序,我们可以在定时中断里面判断按键的状态。
  2. 解决方法同上。
  3. 串口中断发送估计很多人没有用过,也有很多人觉得没有必要,我想说的是你没有写过大型项目,对实时性要求不高,如果你的程序很大,需要服务的地方很多,那你用阻塞式发送很可能会降低整个程序的实时性了,例如 9600 波特率发送一个字符 1ms时间,如果一次发送 50 个字符就是相当于执行 delay(50); 那怎么用中断发送呢?很简单,打开串口发送中断,第一个字符你程序发送,剩余的在发送中断里面发送即可。

 

以上是比较单一的情况,大部分情况下我们遇到的是一个完整型操作里面有的执行很快,有的又必须阻塞。例如一个温度传感器,它要求先下发转换命令然后等待一定时间后才能进行下一步操作,这个时候你该怎么去写呢?

我想说的解决方法有很多种,你需要把这个任务分解成两个部分,一个是启动转换,另一个是读。

程序形式如下:

  • startcov();
  • delay();
  • read();

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

那有人又说了我就想把

你可能感兴趣的:(单片机编程)