一、查询方式
在应用程序中直接使用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 cached
CPU: 12% usr 87% sys 0% nice 0% idle 0% io 0% irq 0% softirq
Load 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%的资源。