对按键的几种操作方式

来源:互联网 发布:js ajax跨域的解决办法 编辑:程序博客网 时间:2024/05/22 17:24

一、查询方式

在应用程序中直接使用while(1)死循环对按键的状态进行读取,这种方式所占的CPU很多,不推荐使用。

驱动:

ssize_t second_drv_read(struct file *file, char __user *buf, size_t size, loff_t *ppos){/* 返回4个引脚的电平 */unsigned char key_vals[4];int regval;if (size != sizeof(key_vals))   //这句话的意思是如果上层的buff没有sizeof(key_val)的话,就会错误返回,表示上层会接受四个按键的状态return -EINVAL;regval = *gpfdat;key_vals[0] = (regval & (1<<1)) ? 1 : 0;key_vals[1] = (regval & (1<<4)) ? 1 : 0;key_vals[2] = (regval & (1<<2)) ? 1 : 0;key_vals[3] = (regval & (1<<0)) ? 1 : 0;copy_to_user(buf, key_vals, sizeof(key_vals));return sizeof(key_vals);}

app:

while (1){read(fd, key_vals, sizeof(key_vals));if (!key_vals[0] || !key_vals[1] || !key_vals[2] || !key_vals[3]){printf("%04d key pressed: %d %d %d %d\n", cnt++, key_vals[0], key_vals[1], key_vals[2], key_vals[3]);}}

下面是cpu的占用情况:

Mem: 6348K used, 54848K free, 0K shrd, 0K buff, 2008K cachedCPU:  12% usr  87% sys   0% nice   0% idle   0% io   0% irq   0% softirqLoad average: 0.50 0.15 0.05  PID  PPID USER     STAT   VSZ %MEM %CPU COMMAND  776   767 0        R     1308   2%  99% ./seconddrvtest   777   767 0        R     3096   5%   0% top   767     1 0        S     3096   5%   0% -sh     1     0 0        S     3092   5%   0% init       759     2 0        SW<      0   0%   0% [rpciod/0]    6     2 0        SW<      0   0%   0% [khelper]  742     2 0        SW<      0   0%   0% [kmmcd]    2     0 0        SW<      0   0%   0% [kthreadd]    3     2 0        SWN      0   0%   0% [ksoftirqd/0]    4     2 0        SW<      0   0%   0% [watchdog/0]    5     2 0        SW<      0   0%   0% [events/0]   55     2 0        SW<      0   0%   0% [kblockd/0]   56     2 0        SW<      0   0%   0% [ksuspend_usbd]   59     2 0        SW<      0   0%   0% [khubd]   61     2 0        SW<      0   0%   0% [kseriod]   73     2 0        SW       0   0%   0% [pdflush]   74     2 0        SW       0   0%   0% [pdflush]   75     2 0        SW<      0   0%   0% [kswapd0]   76     2 0        SW<      0   0%   0% [aio/0]  707     2 0        SW<      0   0%   0% [mtdblockd]

可以看到这个程序占了99%的资源。