天天看点

单核单线程下的编程要点

单片机单核单线程下的编程要点

    • 一句话概括
    • 等待:占着茅坑不拉屎是不对的
    • 长任务:高速上不许开慢车
    • 状态机:下班了就打游戏,赢了这局就睡觉
    • 中断:老板来了提醒我
    • 凡事无绝对

一句话概括

多用switch、if和return,少用while,和for。用查询代替死等,尽一切可能减少大循环执行的时间,关键目标是为了不浪费CPU的时间,能够做更多判断,响应更多输入事件。

等待:占着茅坑不拉屎是不对的

避免等待!

大部分的问题出在死等,不管你是delay(),还是等某个信号while(XX_FLAG==1),通通不行。这会造成CPU宝贵时间的浪费。造成其它程序无法得到执行。应该转变思路,整个程序应该作为一种逻辑判断而非过程。在大循环中快速处理各种可能的逻辑。

长任务:高速上不许开慢车

避免长任务!

一个函数执行的时间太长也是不好的。道理一样,其它代码得不到执行。尽量用改变状态类的代码,而不是持续处理后才返回的代码。等待也可以理解为一种长时间的处理。

状态机:下班了就打游戏,赢了这局就睡觉

使用状态机!

实际上当你明白上面的思想,从程序执行效率的角度来说也没必要利用状态机了。状态机在单片机编程中使用原因有二:

1.并发

2.理清思路。

状态机的思想,规定了现态,跳转条件,次态。这样无形中就引导你要用if或者switch语句。如果你在状态机里用了死等。那状态机也救不了你。

状态机实际上是通过静态的变量保存了状态,这样就可以去干别的事情了,也就是释放了CPU。

用状态机画状态图可以理清业务逻辑,有助于组织代码避免混乱。

更一般的说(变量/成员/属性)即状态。就连函数调用的过程都是通过栈帧保存状态。

中断:老板来了提醒我

使用中断!

中断提供了在主循环之外执行代码的手段。中断的可以理解为一种事件处理机制,其等待触发的过程不占用CPU时间。

凡事无绝对

面对类似“软件实现I2C协议”这种不能被打断又必须有us级延时的需求。通常这种用普通IO口模拟时序的任务也只能用delay。因为你的整个大循环的执行时间做不到us级。并且在此过程中还要禁用中断,以免被打断。

继续阅读