咱们运用单片机去做一些使命的时分,一般把程序写成次序结构,根本能够处理大部分的规划要求了。并且这种结构便于了解,并且程序易构成模块化,在各个模块中调用完成更杂乱的使命。
但是次序结构的写法,有时分避免不了沉重冗长的时刻等候。例如键盘扫描,你就给我弄了一个delay_20ms()函数,而在这延时的进程,其实 MCU能够做许多工作的,这不白白的糟蹋掉这段时刻吗?其实,delay的这段时刻用数码管显现替代,也就是在等候的进程,咱们能够做一下显现。但仅此而已?
之前,我在做3寸大数码钟的时分就遇到过一个时刻要求严苛的问题,我选用了17个数码管,分红两组来动态显现。为了不闪耀,那么改写频率最少大于 50Hz。而单片机还有其他使命,比方说读DS1302实时时钟,串口收发数据,按键扫描,读DS18B20等等,而其间最要命的是读取DS18B20温度传感器的数据,咱们都知道其间等候温度转化的时刻,根本要到达900ms了,这样一来,数码管就会闪耀得很厉害了。
所以,我网上找了一些材料学习。咱们都选用“时刻片轮询”算法的程序架构来写,这样既确保了实时,也充分利用了使命等候的时刻。
下面简略来看看,关于时刻片轮调的程序思维,而依照这种思路,能够衍生出许多程序结构。
假定,单片机要履行的使命有task_1(); task_2(); task_3(); ……task_n(); 各个使命对时刻要求不同。
下面是我对时刻片轮调的相关知道。
体系基准时刻片:
咱们选用守时器中止来发生体系的基准时刻片,也叫体系的基准节拍,例如每4ms中止一次。这能够形象的比方成脉息心跳。
使命(事情)的轮调:
每一次心跳,咱们就给使命履行的时刻标志计数。当标志计数到了,就履行该使命函数!
事情的要求:
1.每一个事情的履行时刻不允许超越一个时刻片。
2.事情中不运用较长的delay();函数,能够运用守时延时等候,但永久有必要恪守第一条要求。
3.履行时刻较长的使命,或许较为杂乱的使命,能够分割到多个时刻片内履行。
实时性使命要求:
关于实时性要求较高的使命。比方串口收发事情,能够考虑放在主循环调用,或许再守时中止中调用。
参数传递要求:
各个使命函数之间参数传递,主张运用全局变量。使命中的内部函数,能够运用局部变量。
程序结构:
剖析一下上面的程序结构,运用了一个守时器发生体系时钟滴答,然后时钟滴答到了,就更新时刻标志,然后统一用一个事情函数来依据时刻标志分时的履行各个使命函数。
但使命履行完后,时刻标志被重置,并从头计数。那么这个使命函数就相当于被调度在了使命行列的结尾了!(感觉是不是有点使命调度办理的意思了?)
当然,各个使命函数调用的时刻不同,就造成了使命履行频率的不同。这也是时刻片的巨细商定,以及时刻片散布的问题,这需求从实践的使命考虑,并获得一个最佳的时刻片,以及合理的组织各个使命函数的联系。
别的一种时刻片轮调程序结构
其实,原理大致相同。履行机制不同算了,各种程序结构有它优缺点,有最适合运用的当地。
下面,简略了解。
程序结构:
关于时刻片轮询法的程序结构,无疑有比次序结构程序更多的长处,但使命函数有时分被拆分红多段,不方便了解程序全体思路。