微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于RTX51实时操作系统的用户专用键盘软件设计

基于RTX51实时操作系统的用户专用键盘软件设计

时间:08-02 来源:互联网 点击:

b.JPG


如图,任务1在检测到按键状态变化后向任务2发送信号,任务2随后由等待状态进入“准备好”状态,在本任务的下一个时间片,任务2开始进行指定位置按键的码值查询,然后通过串口完成码值发送。
同时,串口数据通过中断服务程序接收,串口数据接收后即发送信号给任务3,使后者进入“准备好”状态,并在下一个时间片到来后进行数据处理。
以上三个任务中,任务l始终处于“运行”或“准备好”状态,任务2、任务3大多数时间处于“等待”状态,任务2、任务3分别在接收到按键状态扫描任务、中断服务程序的信号后被“唤起”。另有任务0,负责创建任务1、2、3,然后删除自己。任务0简化程序如下所示:
#define INIT 0/*任务0:初始化及创建*/
#define SCAN 1/*任务1:按键状态扫描*/
#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所示。

e.JPG


由于中断可能由发送控制器或接收控制器引起,因此在程序中首先要判断是接收中断还是发送中断,然后分别进行处理。对于接收的数据,程序将其存入接收缓冲区,然后通知串口数据处理任务进行处理。
用户专用键盘数据的发送在中断服务程序中完成,上一字节的数据发送完毕产生中断,进入中断服务程序继续完成下一字节的发送,而发送缓冲区中的数据由系统在按键码值查询任务中存入。简化的中断服务程序如下:
f.JPG
3.3 串口数据处理任务(TASK_LIGHT)
中断服务程序只处理串口缓存器SBUF的读取或写入,数据一旦接收完毕即存入缓冲区,并在专门的任务中进行处理。在多任务系统的用户专用键盘程序中,串口数据处理任务在创建后即被“挂起”,此时该任务处于“等待”状态,不占用任何时间片,只有当任务接收到“唤起”信号后才继续执行。本程序中“唤起”信号来自中断服务程序。由于中断处理过程可以同RTX51任务互发信号或交换数据,因此,中断服务程序在接收到数据后立即发送信号量给串口数据处理任务,使后者处于“准备好”状态,当下一时间片来到时,串口数据处理任务继续执行,完成数据解析及控制指示灯等操作。由于该任务为循环操作,当所有接收的数据处理完毕后,任务再次进入“等待”状态,等待下一次串口数据接收后的处理。图3中,斜体部分即为中断服务程序发送信号至串口数据处理任务的过程。串口数据处理任务的简化程序如下:
g.JPG
3.4 按键状态扫描任务(TASK SCAN)
按键状态扫描为一个循环执行的任务,程序通过不断地读取单片机IO口的值获取每个按键的当前状态,然后将当前状态值与存储在内存中的上一次状态值进行比较,通过比较结果判断该按键状态是否发生变化。为消除按键按下时抖动造成的多次状态变化,在扫描到某个按键状态发生改变后,延时一段时间后进行第二次扫描,如果两次扫描结果相同则认为该按键状态确实发生改变,并转入下一步处理。按键状态扫描任务流程如图4所示。

h.JPG


下面给出按键状态扫描任务简化的源程序:
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所示。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top