当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]有限状态机的嵌入式Linux按键驱动设计

0  引言

一般的按键驱动程序通常非常简单。在程序中一旦检测到按键输入口为低电平时,就采用软件延时10 ms后再次检测按键输入口。如果仍然是低电平则表示有按键按下,便转入执行按键处理程序;否则,当按键输入口为高电平,就会放弃本次按键的检测,重新开始一次按键检测过程。这种方式不仅由于采用了软件延时而使得MCU的效率降低,同时也不容易同系统中其他功能模块协调工作,且系统的实时性也差。本文把单个按键作为一个简单的系统,根据状态机的原理对其动作的操作和确认的过程进行分析,并用状态图表示出来,然后根据状态图编写出按键接口程序。   

1  基于状态机的简单按键驱动设计

在一个嵌入式系统中,按键的操作是随机的。为了提高CPU的工作效率,在设计按键驱动的时候,利用S3C2440的外部中断来实现对按键的处理。很明显,系统的输入信号与按键连接的I/O口电平,“1”表示按键处于开放状态,“0”表示按键处于闭合状态。而系统的输出信号则表示检测和确认到一次按键的闭合操作,用“1”表示。

图1给出了一个简单按键状态机的状态转换图。



在图中,将1次按键完整的操作分解为3个状态。其中,状态0为按键的初始状态,当按键输入为“1”时,表示按键处于开放,输出“0”(I/0),下一状态仍为状态0;当按键输入为“0”时,表示按键闭合,但输出还是“0”(没有经过消抖,不能确认按键真正按下),下一状态进入状态1。

状态1为按键闭合确认状态,它表示在10 ms前按键为闭合的,因此当再次检测到按键输入为“0”时,可以确认按键被按下了(经过10 ms的消抖);输出“1”则表示确认按键闭合(0/1),下一状态进入状态2。而当再次检测到按键的输入为“1”时,表示按键可能处在抖动干扰;输出为“0”(I/0),下一状态返回到状态0。这样,利用状态1,实现了按键的消抖处理。状态2为等待按键释放状态,因为只有等按键释放后,一次完整的按键操作过程才算完成。

对图1的分析可知,在一次按键操作的整个过程中,按键的状态是从状态0→状态1→状态2,最后返回到状态0的,并且在整个过程中,按键的输出信号仅在状态1时给出了唯一的一次确认按键闭合的信号“1”,其他状态均输出“0”。因此,图1状态机所表示的按键系统,不仅克服了按键抖动的问题,同时也确保在一次按键的整个过程中,系统只输出一次按键闭合信号(“1”)。

2  具有连发功能的按键驱动设计

上面介绍的是最简单的情况,不管按键被按下的时间保持多长,在这个按键的整个过程中都只给出了一次确认的输出。但是有些场合为了方便使用者,根据使用者按按键的时间多少来确定是否按键“连发”。例如,在设置时钟时,按按键的时间较短时,设置加1;按按键时间较长时,设置加10,这时就需要根据按按键的时间长短来确定具体输出。图2是将按键驱动设计为具有连发功能状态机的状态转换图。



当按键按下后1 s内释放了,系统输出为1;当按键按下后1 s没有释放,那么以后每隔0.5 s,输出为2,直到按键释放为止。如果系统输出1,应用程序将变量加1;如果系统输出2,应用程序将变量加10。这样按键驱动就有了处理连发按键的功能了。

3  程序设计

由于篇幅所限,下面只给出按键驱动的关键程序,按键中断处理程序和时间处理函数:[!--empirenews.page--]




这里的定时函数使用了Linux的内核定时器。使用内核定时器可以方便地实现每个状态的特定定时时间,并且安全释放CPU,提高CPU的效率。程序的基本思路是,首先按键被按下进入按键中断服务程序buttons_interrupt(),在中断服务程序里确定按键状态是否为初始态。如果是,则进行kbd_timer初始化且使按键状态转为消抖状态。当kbd_timer定时到以后,按键检测按键状态是否仍处于按下时转换状态为按键确定状态,如果不是则恢复初始态。当定时器1 s到达后,判断按键是否仍是按下。如是则转换为连发状态,否则恢复初始态。当0.5 s到达后,重新判断按键是否仍是按下。如是,则继续为连发状态,输出值加10;如果按键抬起,则恢复初始态。

4  实验结果

该驱动程序经过gcc-arm-liunx-3.4.4编译,并在Micro2440SDK开发板上运行(开发板上的系统版本为linux2.6.13),运行结果如图3所示。



从运行结果可以看出,如果按下按键并在1 s抬起,输出值每次只加1;如果按下按键超过1 s,系统的输出值每隔0.5s将加10。说明本驱动运行正常,且具有了连发功能。

结  语

本文主要分析了按键有限状态机的工作过程,并利用Liunx内核定时器实现了状态机的状态转换时间间隔,最后给出了基于有限状态机的具有连发功能Linux驱动编写代码,实现了具有连发功能的按键驱动,为基于有限状态机按键驱动提供了一种解决思路。
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭