基于ADSP-BF561的嵌入式键盘设计
指针(如图 3所示)。通过移动读指针和写指针就可以实现缓冲区的数据读取和写入。当一个按键被按下时,键值将被放置在环形队列的写指针指向的位置。而应用程序则是通过读指针去读取缓冲区中的键值。若缓冲区已满,则任何下一个按键都将被丢弃。若缓冲区为空,则读进程阻塞。使用环形的缓冲区可以使得读写并发执行,读进程和写进程可以采用 "生产者和消费者"的模型来访问缓冲区,从而方便了缓冲的使用和管理,确保系统的安全性。
图3环形缓冲区
应用层中使用了 select系统调用,select会在一个循环中对每个需要监听的设备调用它们各自的 poll支持函数以使得当前进程被加入各个设备的等待队列。若当前没有任何被监听的设备就绪,则内核进行调度(调用 schedule),当前进程让出 CPU进入阻塞状态,schedule返回时将再次循环检测是否有操作可以进行,如此反复;否则,若有任意一个设备就绪,select都立即返回。
poll 函数中利用等待队列,实现了应用程序对缓冲区读操作的同步。因此,只需再定义
两个信号量,用于实现同步和互斥:
static DECLARE_MUTEX(mutex_sem); /*定义用于互斥的信号量,初值为1*/
/*定义控制驱动程序写缓冲区的信号量,初值为 KEYBUF_SIZE-1,表示缓冲区中的空位
数 */
struct semaphore empty_sem;
sema_init (&empty_sem, KEYBUF_SIZE-1);
驱动程序填写缓冲区过程的伪代码如下:
down(empty_sem); //保证缓冲区中有空位,否则进程挂起
down(mutex_sem); //申请互斥信号量,保证对缓冲区的互斥访问
键值送往环形缓冲写指针所指地址;
char_buf_write =( char_buf_write +1) mod KEYBUF_SIZE;//修改写指针
up(mutex_sem); //释放互斥信号量
wake_up(&key_wait); //唤醒等待队列中的进程
应用程序读缓冲区过程的内核实现伪代码如下:
down(mutex_sem); //申请互斥信号量,保证对缓冲区的互斥访问
环形缓冲读指针所指地址的值送往用户空间;
char_buf_read =( char_buf_read +1) mod KEYBUF_SIZE;//修改读指针
up(mutex_sem); //释放互斥信号量
4 结束语
本文设计并实现了基于 ADSP-BF561的嵌入式矩阵键盘。利用 GPIO口直接扫描矩阵键盘,简化了扫描电路的设计,降低了成本;软件实现上,利用定时器消抖,避免忙等,提高系统效率;利用环形缓冲管理按键信息,使用等待队列和信号量实现缓冲的同步操作。
目前,此设计已经成功应用于一款网络视频电话终端,测试表明,该方案在一定的要求 下完全符合性能要求,并具有较好的稳定性和实时性。
本文作者创新点:本设计利用定时器消抖,避免忙等,提高系统效率;利用环形缓冲管理按键信息,使用等待队列和信号量实现缓冲的安全同步。
ADSP-BF561 嵌入式键盘 BF561 相关文章:
- 基于ADSP-BF561的H.264视频编码器的实现(01-10)
- 基于ADSP-BF561处理器的视频编码器平台(01-16)
- 基于ADSP-BF561的H.264视频编码器系统的实现(03-05)
- 无线键盘及工业键盘的9个实用设计,附电路图、原理(09-12)
- BF561 SPORT口异步通信的软件模拟(05-08)