
-
UID:1467984
-
- 注册时间2013-06-23
- 最后登录2023-10-28
- 在线时间165小时
-
-
访问TA的空间加好友用道具
|
大家好!我逛论坛一段时间了,学习到了很多知识,也见识到了很多网友的实力巨作,深感论坛提供的学习平台非常有意义。我虽不是资深单片机玩家,但我也发现,很多初学者在裸写单片机程序时有点混乱,并没有一个合理的程序框架支撑,这点我想谈谈我的个人看法。【仅个人意见,欢迎更多网友参与讨论】
我个人觉得,学习单片机程序要学会“跨平台”,而不是局限于单片机。我们应该多涉猎别的程序开发,比如面向对象的C++,JAVA,或者VB,Android开发。然后思考,我在单片机上应该如何借鉴这些编程开发架构,进而转为自己的程序架构风格。我认为具有这些程序开发经验的人去做嵌入式是得心应手的,因为他们已经有一套成熟的程序体系,写起代码会更有条理。
尤其是初学单片机者,往往思维很容易被教程所禁锢,不是说教程不够好,而是教程很多时候教得过于仔细,以至于大家都形成了一种先入为主的思想,开发时往往都倾向于向教程靠拢,而很长时间都走不出教程的影子。
我自己也是这样的。在接触其他编程语言时,我的编程风格都是教程的。但我经常会去对比其他的编程语言,思考,我的单片机程序要怎么写才能实现同样的目的呢!
这里我就抛砖迎玉,举一个我的裸跑的编程架构,不希望大家抄用,更希望大家从我的例程中发掘更优秀的编程思维,走出别人的编程影子。【当然,好的编程思路可以借鉴,取其精华嘛】
我的编程遵循6个字:【架构】想大一点,【细节】想少一点。 我裸写单片机程序不用什么时间轮询或操作系统,就是顺序执行。我的程序就只有一个大框架:main程序。主要是方便移植(不管什么单片机,用C总有一个mian函数)。好吧当时我其实没有考虑移植问题,纯粹是参考电脑运行系统。我的主框架按大方向只有2层:【硬件层】驱动程序,【接口层】服务程序,【上层】应用程序。驱动程序为服务程序和应用程序工作,任何时候按需调用。服务程序为主应用程序提供数据支撑,在程序每个执行周期必须执行,为上层应用按需调用。有人会说,那中断程序呢,算什么?这里我想说大家要想少一点,除了主main之外的程序,要么是底层驱动,要么是服务程序,别惦记着“中断程序”这种想法,甚至用中断程序模拟出双线程。
下面我举个例子来说说这个框架实现的一小部分。
很多程序设置离不开按键操作,大家是怎么将按键操作与应用程序结合起来的呢?
【想大一点】大的方向上看,按键检测属于输入性操作,不应属于应用层,应该属于大的输入管理服务层中的按键输入服务。(因为按键检测的作用是通过输入服务程序报告主逻辑,我这里检测到有按键按下啦,快来处理一下)而按键检测又涉及具体硬件,那么很清楚了,按键服务程序应该调用按键驱动程序。虽然按键很简单,希望大家对硬件保持一致的想法(即硬件应该含有驱动程序,并对应用程序提供服务接口程序),所有硬件外设都要遵循一致的程序框架,这样程序才合理。
接下来细分一下。先说说按键驱动程序。驱动是最底层的涉及硬件操作的,所以按键的驱动就应该只是:检测引脚低电平。与此提供一个服务程序就是不断的执行底层驱动,并向上层应用提供按键状态。很多人写按键还喜欢加上按键消抖和松键检测,也可以放在底层驱动,但是,一个简单的按键驱动和服务要如此占用主扫描周期明显是很糟糕的,也就是说,这样的驱动和服务属于占用CPU太高的驱动,不合理,那我们就来修改服务程序就好了,驱动还是只检测引脚电平。
服务程序对驱动反映上来的每个按键引脚状态进行计时,为0时负计时,为1时正计时,然后对计时做一个判断,引脚状态达到多久视为单击,长按,持续按,双击等等,然后按键服务程序将各键状态传入输入服务程序进行键码转换,通过键码向主逻辑汇报当前按键状态。因为只涉及状态检测和状态计时,该驱动程序和服务程序执行是非常高效的。为什么要做键码转换呢?前面说过,我们的主程序不应该存在说有:按键1按下啦该怎样怎样的,而是通过转为键码来处理。这么做也是根据目前PC机处理按键是一个意思,输入除了可以是按键,也可以是其它,比如串口控制,也可以通过输入服务程序转为键码实现同样的按键操作而不需要改动主逻辑!这就是底层+上层接口的作用。
那么说到状态计时,当然需要一个准确的时钟源,提供时钟脉冲来计时。那么就可以建立一个系统服务,专门在执行周期中提供时基脉冲服务。而主逻辑时间时不确定,不能直接产生脉冲,所以脉冲源可以由定时器产生,这个涉及到硬件,所以我们又要写一个定时器驱动程序,用来产生时间脉冲。 另外多啰嗦一下【想少一点】。在写按键驱动和服务时,不要想着我这个按键要实现什么功能。这是主逻辑接到键码后该考虑的事,不要一开始就想着这个按键实现诸如数值+1,这个按键实现返回等,把这些交给主逻辑吧!
当然对于按键驱动网上也有人是基于状态机的按键检测,而我做却不仅仅是状态机那么简单,而是基于驱动+服务的整体编程思想。 废话说了一堆,可能有点不清不楚,打字也挺累的。如果大家感兴趣,不要沉帖,欢迎讨论。看大家反应,需要时帖个源码给大家参考参考。如果还是在入门或者一直找不到编程架构到底该如何写,希望找人带带的话,我可以出个教程哦
另外在我贴源码之前,希望大家用自己的的思路,想想如何实现如下需求:
3个按键,如何实现检测:单个按键的单击,双击,长按,持续按,以及两两按键组合按(类似Ctrl+C),和三键同时按(类似Ctrl+Alt+Del),返回个按键代码
浅谈我的程序框架补充-按键示例 http://bbs.mydigit.cn/read.php?tid=1632365
|