新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于RTX51的用户专用键盘软件设计

基于RTX51的用户专用键盘软件设计

作者:时间:2013-02-25来源:网络收藏

#define KEY 2/*任务2:按键码值查询*/

#define LIGHT 3/*任务3:串口数据处理*/

Init()_task_INIT{

Serial_init();

Os_create task(SCAN);

Os_create_task(KEY);

Os_create_task(LIGHT);

Os_delete-task(INIT);

}

以下对中断服务程序及各个任务分别予以介绍。

3.2 中断服务程序

串口接收、发送中断服务程序流程如图3所示。

由于中断可能由发送控制器或接收控制器引起,因此在程序中首先要判断是接收中断还是发送中断,然后分别进行处理。对于接收的数据,程序将其存入接收缓冲区,然后通知串口数据处理任务进行处理。

数据的发送在中断服务程序中完成,上一字节的数据发送完毕产生中断,进入中断服务程序继续完成下一字节的发送,而发送缓冲区中的数据由系统在按键码值查询任务中存入。简化的中断服务程序如下:

3.3 串口数据处理任务(TASK_LIGHT)

中断服务程序只处理串口缓存器SBUF的读取或写入,数据一旦接收完毕即存入缓冲区,并在专门的任务中进行处理。在多任务系统的程序中,串口数据处理任务在创建后即被“挂起”,此时该任务处于“等待”状态,不占用任何时间片,只有当任务接收到“唤起”信号后才继续执行。本程序中“唤起”信号来自中断服务程序。由于中断处理过程可以同任务互发信号或交换数据,因此,中断服务程序在接收到数据后立即发送信号量给串口数据处理任务,使后者处于“准备好”状态,当下一时间片来到时,串口数据处理任务继续执行,完成数据解析及控制指示灯等操作。由于该任务为循环操作,当所有接收的数据处理完毕后,任务再次进入“等待”状态,等待下一次串口数据接收后的处理。图3中,斜体部分即为中断服务程序发送信号至串口数据处理任务的过程。串口数据处理任务的简化程序如下:

3.4 按键状态扫描任务(TASK SCAN)

按键状态扫描为一个循环执行的任务,程序通过不断地读取单片机IO口的值获取每个按键的当前状态,然后将当前状态值与存储在内存中的上一次状态值进行比较,通过比较结果判断该按键状态是否发生变化。为消除按键按下时抖动造成的多次状态变化,在扫描到某个按键状态发生改变后,延时一段时间后进行第二次扫描,如果两次扫描结果相同则认为该按键状态确实发生改变,并转入下一步处理。按键状态扫描任务流程如图4所示。

下面给出按键状态扫描任务简化的源程序:

Scan()_task_SCAN{/*按键状态扫描任务*/

While(1){

Key_first_scan();/*第1次扫描*/

If(Keychanged=1){

Os_wait(K_TMO,2,0)/*延时*/

Key_second_scan();/*第2次扫描*/

If(first scan=second scan){/*如果两次扫描的按键状态一致*/

os_send_signal(2);/*发送信号至按键码值查询任务+/

}

}

}

}

程序中,采用等待超时信号(K_TMO)来实现两次扫描间的延时,这样的好处是,在延时期间,由于本任务处于“等待”状态,系统可以进行任务切换,使其它任务继续执行,从而在保证系统功能的前提下,提高整个系统的工作效率。需要注意的是,K_TMO是等待产生超时信号,当信号产生后,只是将相应的任务置上“准备好”标志位,任务并不是立即就能够运行,任务需要等到其它任务轮流执行,到自己的时间片后才会执行。这样,最后的延时效果是延时时间加上正在运行的任务的执行时间。在用户专用键盘中,同时可能在运行的任务只有“串口数据处理”。由于该任务运行时间与K TMO延时时间比较少很多,因此可以忽略不计,而认为两次扫描间的延时时间就是K_TMO的时间。假设同时运行的任务较多,并且每个任务占用的时间较长,则延时时间应该取K_TMO加上所有同时运行任务的执行时间之和,即按键按下的时间必须不小于此时间,才能保证每次按键操作都能正确响应。

3.5 按键码值查询任务(TASK KEY)

按键码值查询任务程序流程如图5所示。

由于发送数据在串口中断服务程序中完成,因此,在将数据存入发送缓冲区之前必须确认缓冲区中有数据即串口发送中断会被再次触发,否则只有将数据写入串口发送缓存器SBUF直接发送。

下面给出按键码值查询任务简化的源程序:

Encode()_task_KEY{

While(1){

Os_wait(K_SIG,0,0);/*等待键码查询信号*/

Keygetcode();/*获取键码值*/

If(sendempty=1){/*判断发送缓冲区是否为“空”*/

SBUF=keycode;/*发送缓冲区为”空”,则直接发送*/

}Else{

Outbuf[i++]=keycode;/*否则,将数据存入缓冲区,*/

/*待上一数据发送完后自动发送*/

}

}

}

4 结论

实践证明,在引入 Tiny实时操作系统后,开发周期缩短,程序结构更加清晰,系统实时性和并行性大大增强,开发出的程序具有较高的可维护性和可移植性。

DIY机械键盘相关社区:机械键盘DIY



上一页 1 2 下一页

评论


相关推荐

技术专区

关闭