深入了解Linux中wiringPi断的使用与原理 (linux中wiringpi断详解)
在Linux系统中,wiringPi是一个广泛使用的GPIO库。它为用户提供了简单易用的函数来控制树莓派等单板电脑上的GPIO引脚。除了基本的GPIO功能,wiringPi还提供了PWM、SPI、I2C等高级接口。在实践中,我们通常会需要控制一些外设,以及通过一些传感器获取数据,这就需要涉及到GPIO上的中断。
中断是处理器为了响应外部事件而采取的一项机制。当外部事件触发时,处理器会暂停当前任务,跳转到中断服务例程、执行相关操作,然后返回主任务。对于某些应用来说,使用中断可以显著改善程序效率,并且降低延迟。
在Linux中,wiringPi提供了对GPIO中断的支持,使得程序员可以更加方便地控制GPIO。但同时,理解wiringPi的中断机制也很重要。
让我们看一下wiringPi中中断的实现方式。wiringPi中的中断,实际上是利用Linux系统中的“/sys/class/gpio”文件系统。当wiringPi创建一个GPIO时,它会自动创建相应的”/sys/class/gpio/gpioX”目录。该目录包含一些文件,例如”direction”和”value”等。
在wiringPi GPIO库中,引入了一个专门的中断线程来处理GPIO的中断。其原理类似于一个轮询线程,它不停地检查GPIO的状态,并在GPIO状态改变时执行中断服务例程。同时,为了防止频繁地调用中断服务例程,wiringPi中还提供了一个中断去抖动的机制。
中断触发模式是指GPIO输入电平的改变方式,可以选择上升沿、下降沿、任意电平变化、低电平或高电平。wiringPi提供了三种中断触发模式:INT_EDGE_SETUP、INT_EDGE_FALLING、INT_EDGE_RISING。其中,INT_EDGE_SETUP表示中断不使用,此时GPIO为普通输入;INT_EDGE_FALLING表示当GPIO由高电平转变成低电平时触发中断;INT_EDGE_RISING表示当GPIO由低电平转变成高电平时触发中断。
在使用wiringPi中断时,需要借助一些API实现中断的注册和处理。下面是一些常用的函数和宏:
(1)wiringPiISR()
定义:int wiringPiISR(int pin, int mode, void (*function)(void))
该函数用于注册GPIO中断服务例程,并指定中断触发模式。其中,参数pin表示GPIO编号,函数function是中断服务例程的指针。
(2)piHiPri()
定义:int piHiPri(int priority)
该函数用于设置线程的优先级。参数priority是一个整数,取值范围为0~99。
(3)INT_EDGE_SETUP、INT_EDGE_FALLING、INT_EDGE_RISING
宏定义。分别代表中断触发模式:中断不使用、GPIO由高电平到低电平时中断、GPIO由低电平到高电平时中断。
下面是一个简单的例子,演示如何在树莓派上使用wiringPi中断来控制LED的闪烁:
“`
#include
#include
#define LED 0 // LED的引脚号
void ledBlink() // LED闪烁函数
{
digitalWrite(LED, HIGH); // 点亮LED
delay(500); // 延时500ms
digitalWrite(LED, LOW); // 熄灭LED
delay(500); // 延时500ms
}
void ledInterrupt() // 中断服务例程
{
ledBlink();
}
int mn(void)
{
if(wiringPiSetup() == -1){ // 初始化wiringPi
printf(“wiringPi初始化失败!\n”);
return 1;
}
pinMode(LED, OUTPUT); // 配置LED的引脚模式
wiringPiISR(1, INT_EDGE_FALLING, ledInterrupt); // 注册中断服务例程
while(1){
delay(1000); // 延时1s
}
return 0;
}
“`
在这个例子中,我们首先使用wiringPiSetup()函数初始化wiringPi库,并将LED的引脚配置为输出。然后,我们使用wiringPiISR()函数注册中断服务例程,其中指定的中断触发模式为INT_EDGE_FALLING,表示当GPIO由高电平转变成低电平时触发中断。我们使用一个死循环来保证程序的运行。