gpt4 book ai didi

c - 尽管发生中断但未调用 WiringPi ISR?

转载 作者:行者123 更新时间:2023-11-30 16:18:39 26 4
gpt4 key购买 nike

我已将树莓派 1 的 GPIO 引脚 17(在 WiringPi Pin17 = Pin0)连接到中断源(IR-LED 发射器/接收器,每当红外线被某些障碍物中断时就会触发中断)。为了设置 ISR,我一直在使用 WiringPi 库(我也已经用 Pigpio 库尝试过,但我也遇到了同样的问题)。为了验证我是否确实在 Pin17 上接收到中断,我用逻辑分析仪对其进行了检查,正如您所看到的,该引脚上肯定发生了一些中断: enter image description here

这是我的代码:

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <wiringPi.h>
#include "MCP3008Driver.h"
#include "DHT11.h"

#define INT_PIN 0

volatile int eventCounter = 0;

void myInterrupt(void){
printf("hello ISR!\n");
eventCounter++;
}

volatile sig_atomic_t stopFlag = 0;
static void stopHandler(int sign) { /* can be called asynchronously */
stopFlag = 1; /* set flag */
}

int main(void) {
signal(SIGINT, stopHandler);
signal(SIGTERM, stopHandler);

// sets up the wiringPi library
if (wiringPiSetup () < 0) {
printf("Unable to setup wiring pi\n");
fprintf (stderr, "Unable to setup wiringPi: %s\n", strerror
(errno));
return 1;
}

// set Pin 17/0 to generate an interrupt on high-to-low transitions
// and attach myInterrupt() to the interrupt
if(wiringPiISR(INT_PIN, INT_EDGE_FALLING, &myInterrupt) < 0){
printf("unable to setup ISR\n");
fprintf(stderr, "Unable to setup ISR: %s\n", strerror(errno));
}

DHT11_data data;
configureSPI();

while(1){
if(stopFlag){
printf("\n Ctrl-C signal caught! \n");
printf("Closing application. \n");
return 0;
}

//read_dht_data(&data);
int analogBoiler = readChannel(0);
int analogHeater = readChannel(1);
int analogPress = readChannel(2);
int analogACS712 = readChannel(3);
int analogDynamo = readChannel(4);
printf("Channel 0 / Boiler = %f\n", evaluateChannelValue(ePT100_BOILER, analogBoiler));
printf("Channel 1 / Heater = %f\n", evaluateChannelValue(ePT100_HEATER, analogHeater));
printf("Channel 2 / Pressure = %f\n", evaluateChannelValue(ePRESS, analogPress));
printf("Channel 3 / Power ACS712 = %f\n", evaluateChannelValue(eACS712, analogACS712));
printf("Channel 4 / Power Dynamo = %f\n", evaluateChannelValue(eDYNAMO, analogDynamo));
//printf("Humidity Environment: %f\n", data.humidity);
//printf("Temperature (Celsius) Environment: %f\n", data.temp_celsius);

// display counter value every second.
printf("%d\n", eventCounter);



sleep(5);
}

return 0;
}

wiringPiSetup 和 WiringPiISR 方法已成功调用,并且未返回错误。

我使用以下链接选项构建此示例:-lwiringPi -lm -lpthread。也许我缺少链接选项?

我一直在使用this code here作为引用。那么我在这里做错了什么?感谢您给我的任何建议!

最佳答案

我不完全确定为什么,但我发现删除 wiringPiISR 的函数调用输入前面的一元运算符解决了我的问题。

所以不要调用

wiringPiISR(INT_PIN, INT_FALLING_EDGE, &MyInterrupt)

通话

wiringPiISR(INT_PIN, INT_FALLING_EDGE, MyInterrupt)

我的猜测是,这与 wiringPiISR 将该参数作为指针(*函数)有关,因此将调用的地址放在它前面会导致发生奇怪的事情它尝试调用 MyInterrupt 函数,对我来说它导致我的程序崩溃!

希望这会有所帮助/也许其他人能够详细说明为什么会发生这种情况。

关于c - 尽管发生中断但未调用 WiringPi ISR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55843898/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com