单片机单核单线程下的编程要点
-
- 一句话概括
- 等待:占着茅坑不拉屎是不对的
- 长任务:高速上不许开慢车
- 状态机:下班了就打游戏,赢了这局就睡觉
- 中断:老板来了提醒我
- 凡事无绝对
一句话概括
多用switch、if和return,少用while,和for。用查询代替死等,尽一切可能减少大循环执行的时间,关键目标是为了不浪费CPU的时间,能够做更多判断,响应更多输入事件。
等待:占着茅坑不拉屎是不对的
避免等待!
大部分的问题出在死等,不管你是delay(),还是等某个信号while(XX_FLAG==1),通通不行。这会造成CPU宝贵时间的浪费。造成其它程序无法得到执行。应该转变思路,整个程序应该作为一种逻辑判断而非过程。在大循环中快速处理各种可能的逻辑。
长任务:高速上不许开慢车
避免长任务!
一个函数执行的时间太长也是不好的。道理一样,其它代码得不到执行。尽量用改变状态类的代码,而不是持续处理后才返回的代码。等待也可以理解为一种长时间的处理。
状态机:下班了就打游戏,赢了这局就睡觉
使用状态机!
实际上当你明白上面的思想,从程序执行效率的角度来说也没必要利用状态机了。状态机在单片机编程中使用原因有二:
1.并发
2.理清思路。
状态机的思想,规定了现态,跳转条件,次态。这样无形中就引导你要用if或者switch语句。如果你在状态机里用了死等。那状态机也救不了你。
状态机实际上是通过静态的变量保存了状态,这样就可以去干别的事情了,也就是释放了CPU。
用状态机画状态图可以理清业务逻辑,有助于组织代码避免混乱。
更一般的说(变量/成员/属性)即状态。就连函数调用的过程都是通过栈帧保存状态。
中断:老板来了提醒我
使用中断!
中断提供了在主循环之外执行代码的手段。中断的可以理解为一种事件处理机制,其等待触发的过程不占用CPU时间。
凡事无绝对
面对类似“软件实现I2C协议”这种不能被打断又必须有us级延时的需求。通常这种用普通IO口模拟时序的任务也只能用delay。因为你的整个大循环的执行时间做不到us级。并且在此过程中还要禁用中断,以免被打断。