天嵌 ARM开发社区

 找回密码
 注册
查看: 2271|回复: 8

tq2440 按键中断 是轮询么?

[复制链接]
wanlijunjun 发表于 2013-11-4 11:46:20 | 显示全部楼层 |阅读模式
TQ2440 结合按键中断驱动代码与测试代码,我看着是测试代码里使用FOR来查询有没有中断,是这样么?
那如果想不使用查询方式,像LINUX的定时器那样,中断来了,自动调用中断函数进行处理事务,这种方式能行么?
TQ-ZQL 发表于 2013-11-4 14:31:38 | 显示全部楼层
linux是用中断的
 楼主| wanlijunjun 发表于 2013-11-4 14:46:29 | 显示全部楼层
        for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++)
        {
                if (button_irqs[i].irq < 0)
                        continue;
                free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);
        }

这段代码 先判断一下if (button_irqs[i].irq < 0)
这是为什么?
button_irqs[i].irq  是设的数组里的:
EIN0
EIN1
EINT2
EINT4

不可能<0啊,这不是多此一举么?
 楼主| wanlijunjun 发表于 2013-11-4 14:47:52 | 显示全部楼层
TQ-ZQL 发表于 2013-11-4 14:31
linux是用中断的

        for (;;)
        {

                char key_value_temp[4];
                int ret;



                /*开始读取键盘驱动发出的数据,注意key_value和键盘驱动中定义为一致的类型*/

                ret = read(buttons_fd, key_value_temp, sizeof(key_value_temp));

                if (ret != sizeof(key_value_temp))
                {

                        perror("read buttons:");

                        exit(1);

                }

                /*打印键值*/

                for (i = 0; i < sizeof(key_value); i ++)
                {
                        if(key_value != key_value_temp)
                        {
                                key_value = key_value_temp;
                                printf("K%d is %s%s", i+1, key_value == '0' ? "up" : "down", first ? ", " : "");
                        }
                }
                first = 0;
                if(first == 0)
                        printf("\n");
        }


测试代码里的这段不是轮询是什么?
TQ-ZQL 发表于 2013-11-5 09:30:51 | 显示全部楼层
本帖最后由 TQ-ZQL 于 2013-11-5 09:32 编辑

中断轮询是针对驱动来讲的不是应用,这对应用来讲的透明的,应用只要读取数据而不关心数据是通过什么方式来的
 楼主| wanlijunjun 发表于 2013-11-5 10:41:26 | 显示全部楼层
TQ-ZQL 发表于 2013-11-5 09:30
中断轮询是针对驱动来讲的不是应用,这对应用来讲的透明的,应用只要读取数据而不关心数据是通过什么方式来 ...

哦。也就是说,无论linux底层数据在驱动里是怎么得到的,应用程序里想要得到数据只能使用不停的read这样的查询方式是不是? 如果不想在read的时候被阻塞,还得修改驱动程序与应用程序是吧?
TQ-ZQL 发表于 2013-11-5 17:33:31 | 显示全部楼层
如果不要阻塞可以打开时试下用O_NONBLOCK
 楼主| wanlijunjun 发表于 2013-11-7 10:27:22 | 显示全部楼层
是我提的问题表达不清楚还是怎么的,怎么没有人说一下:
中断方式和poll方式都是应用程序主动去查询按键状态。那么有没有一种机制可以实现驱动程序主动提醒应用程序按键的状态?答案是肯定的!这就是异步通信机制。

我想要的就是这个答案。

无语了。。。
mugeryang 发表于 2015-12-17 16:17:27 | 显示全部楼层
         for (i = 0; i < sizeof(key_value); i ++)
                {
                        if(key_value != key_value_temp)
                        {
                                key_value = key_value_temp;
                                printf("K%d is %s%s", i+1, key_value == '0' ? "up" : "down", first ? ", " : "");
                        }

我对这一段的理解是:去抖动。 key_value与前面按下一样时,就不打印了。
                }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-17 21:24 , Processed in 1.031244 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表