深入了解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由高电平转变成低电平时触发中断。我们使用一个死循环来保证程序的运行。

相关问题拓展阅读:

树莓派怎么安装wiringpi库

1.简介wiringPi

wiringPi , 安装好这个库后可以直接 调用函数配型岩置和控制GPIO功能

下图中左边是wiringPi封装好后的引脚销简,右边是树莓派本身的引脚(bcm2835库也使用它)

还有一张图可以参考:

2.树莓派中安装wiringPi方法:

mkdir temp

cd temp

wget

tar xf wiringPi.tgz

cd wiringPi/wiringPi/

make

make install

测试LED的程序:#include

#include

#include

int main (int argc,char* argv)

{

if (argc

printf(“Usage example: ./led 4 \n”亏租裤);

return 1;

}

int pinNumber = atoi(argv);

if (-1 == wiringPiSetup()) {

printf(“Setup wiringPi failed!”);

return 1;

}

pinMode(pinNumber, OUTPUT); // set mode to output

while(1) {

digitalWrite(pinNumber, 1); // output a high level

delay(800);

digitalWrite(pinNumber, 0); // output a low level

delay(800);

}

return 0;

}

3.相关问题

使用wiringPi的程序进行测试编译时出现了如下问题:

/usr/lib/gcc/arm-linux-gnueabi/4.6/../../../ libwiringPi.so: undefined reference to `i2c_bus_write_byte’

/usr/lib/gcc/arm-linux-gnueabi/4.6/../../../ libwiringPi.so: undefined reference to `i2c_bus_read_byte’

/usr/lib/gcc/arm-linux-gnueabi/4.6/../../../ libwiringPi.so: undefined reference to `i2c_bus_write_byte_data’

/usr/lib/gcc/arm-linux-gnueabi/4.6/../../../ libwiringPi.so: undefined reference to `i2c_bus_write_word_data’

/usr/lib/gcc/arm-linux-gnueabi/4.6/../../../ libwiringPi.so: undefined reference to `i2c_bus_read_word_data’

/usr/lib/gcc/arm-linux-gnueabi/4.6/../../../ libwiringPi.so: undefined reference to `i2c_bus_read_byte_data’

collect2: ld returned 1 exit status

网上少个相关资料,发现 是少装了库的原因:

需要安装这几个库: i2c-tools, libi2c-dev ,python-bus

执行命令 sudo apt-get install libi2c-dev ,会自动安装这三个。

然后重新编译就可以了。

make clean

sudo make uninstall

make

sudo make install

关于linux中wiringpi断详解的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 深入了解Linux中wiringPi断的使用与原理 (linux中wiringpi断详解)