对按键的几种操作方式

一、查询方式

在应用程序中直接使用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%的资源。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值