关于低端单片机的轮询思想

来源:互联网 发布:linux c语言网络编程 编辑:程序博客网 时间:2024/05/09 06:18

        本次介绍的是一款HR7P201FHD,芯片20个脚,该芯片和普通的IC芯片类似,但是也有不同,国产,集成了触摸按键驱动程序,

可以看出该芯片的强大的性价比。

       但是凡事有利有弊,既然将触摸按键的驱动程序嵌入单片机,必然会加大单片机的负荷。每次读取按键都要包含一系列的滤波算法等的处理,并还要对该值进行快速读取。将读取的值作为一个外部接口,就是我们平时使用的按键处理了,怎么处理都好说。但是他的读取值扫描是真的很耗时间,导致做的时间时基很难做的精准,以1ms为时基,若直接放在main的大循环中,100ms的时基变成110ms都有可能,所以注定了将他们按键驱动函数,不能单纯的放在while中,否则很难保证时基。

        操作系统的轮询思想,如果大家有了解的话,应该知道:它是对系统中的每个任务进行轮询,每隔几ms或几十ms执行一次任务。任务在规定的时间内执行,看起来和直接放在普通的while循环没有什么区别,也能完成任务。其实跑操作系统和不跑操作系统的区别在什么地方呢?都是执行任务,都是一个晶振来确定时基,没有什么不同的。但是一个指令到底是多长时间,一段代码是多长时间,很多人都不会关心,而这恰恰是操作系统的产生的原因。

        当你执行任务可能上百行甚至几百行代码却只有几百us的时间的时候,你有没有想过真正运行的任务时间这么短,那么其他的时间单片机在干什么?一般的普通低端单片机时基都是以10ms等为单位的,有的时基是100ms甚至s为单位的。其实这都可以证明一件事:你的单片机并未饱和,还有些资源可以开发,他还有时间可以干其他的事,如果你想的话,可以对自己的程序进行整理,使自己的程序有条不紊,甚至达到精准。

       那么单片机平时都在干什么呢?单片机都在重复做没有必要的扫描,比如一个按键扫描可能10ms,扫描一次各个单片机的端口就够用了,因为你的按键消抖至少也是30ms以上,按键的端口扫描任务函数执行时间一般不超过100us的时间吧。而你将该任务直接放在while中轮扫,你就不是10ms扫一次,而是10ms扫描几十次甚至上百次。如果将10ms扫一次算作必要任务,并在你的while中放个空闲任务来衡量你的系统的CPU使用率,你的CPU的使用率可能不超过10%。其他的任务执行作用和空闲任务一样,空闲而已,对整个程序没有任何意义。

     所以当你定性地执行按键扫描,定性地执行任何其他任务函数,30ms执行一次按键扫描,60ms执行一次显示扫描等等,将所有的任务时间量化,就接近操作系统的轮询思想了,从程序运行上来看,你的程序具备了立体结构。重要性不同的任务执行次数应该是不一样的,重要的任务会被一直调用了,而次要的会被较少的调用,这和实际也相符合。

      系统的任务轮询,可以从思想上来改变你的程序架构,但是它也有它的局限性。比如对任务实时性任务不能做到及时的跳转,虽然他可以根据任务的重要性来决定任务的执行次数,但是他却不能中断,不能在重要的任务来临时,立即放弃当前的任务去执行重要的任务。即便是自己在给每个任务确定一定能的任务等级,但是不做中断的话,不能将当前任务压栈和保存,也得等当前任务执行完之后,才能执行下一个任务等级较高的任务。

     感觉系统永远要考虑的是时间和内存。时间越精准,要求越高。大部分的数据结果都是围绕着内存来,步步发展的。(文中有些数据未被严格地验证,但的确用示波器测过TM1629的发送很多数据80位数据,也就是几十us,看上去也是很长一段代码呀,没有等待的函数基本上都是US为单位的。)

     

原创粉丝点击