- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在基于 ARM 的 Linux 板(imx233 CPU)上使用 3.12 内核。我的目的是检测 GPIO 的引脚变化(1 到 0)。
我可以不断调用下面的函数读取引脚值(在 while(1) 循环中)
int GPIO_read_value(int pin){
int gpio_value = 0;
char path[35] = {'\0'};
FILE *fp;
sprintf(path, "/sys/class/gpio/gpio%d/value", pin);
if ((fp = fopen(path,"rb+")) == NULL){ //echo in > direction
//error
}
fscanf(fp, "%d", &gpio_value);
fclose(fp);
return gpio_value;
}
但它会导致 CPU 负载过大。我不使用 usleep
或 nanosleep
,因为引脚更改发生的时间非常短,这会导致我错过事件。
据我所知,不可能使用poll()
。是否有任何类似 poll()
的函数可用于检测 GPIO 的引脚变化?
编辑:以防万一,如果我做错了什么,这是我的 poll()
用法,它没有检测到引脚变化
struct pollfd pollfds;
int fd;
int nread, result;
pollfds.fd = open("/sys/class/gpio/gpio51/value", O_RDWR);
int timeout = 20000; /* Timeout in msec. */
char buffer[128];
if( pollfds.fd < 0 ){
printf(" failed to open gpio \n");
exit (1);
}
pollfds.events = POLLIN;
printf("fd opens..\n");
while (1)
{
result = poll (&pollfds, 0, timeout);
switch (result)
{
case 0:
printf ("timeout\n");
break;
case -1:
printf ("poll error \n");
exit (1);
default:
printf("something is happening..\n");
if (pollfds.revents & POLLIN)
{
nread = read (pollfds.fd, buffer, 8);
if (nread == 0) {
printf ("result:%d\n", nread);
exit (0);
} else {
buffer[nread] = 0;
printf ("read %d from gpio: %s", nread, buffer);
}
}
}
}
close(fd);
EDIT2:https://developer.ridgerun.com/wiki/index.php/Gpio-int-test.c 上的代码与 poll()
一起工作正常我需要定义中断的上升/下降沿,并对定义进行一些修复。它解决了我的问题,但是,听到/了解替代方法可能对我和其他一些人有好处。
最佳答案
我以前从未见过这 block 板,但我猜想这 block 板完全实现了 PIC(通常是这样),但你必须在 GPIO Controller 中额外配置中断(通常是这样)。有些部分应该作为内核模块完成,然后您必须将有关中断的信息传递给您的应用程序。
执行此操作的示例方法是将以下内容实现为内核模块:
设置 GPIO Controller 以在特定端口和级别上启用中断(你可以在这里找到如何做到这一点:http://cache.freescale.com/files/dsp/doc/ref_manual/IMX23RM.pdf 37.2.3.3 输入中断操作)
在 PIC 中启用 GPIO 中断(如何做到这一点:http://lwn.net/images/pdf/LDD3/ch10.pdf 第 10 章)
在你的申请中休息一下:
将有关中断的信息从内核传递到应用程序的最简单方法是在内核端使用信号量。在模块中,您可以实现一个 ioctl,它将休眠直到中断发生。因此应用程序将调用此 ioctl 并且其线程将被阻塞直到中断发生。
在模块内部,中断例程应该检查应用程序线程现在是否被阻塞,如果是的话,up() 信号量。
编辑*****
此 CPU 具有 SSP,该 SSP 具有 SPI 的工作模式。为什么不使用它??
关于c - 如何检测 Linux 板上 GPIO 的引脚变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25962574/
我是一名优秀的程序员,十分优秀!