WiringPi ISR ​​не вызывается, хотя происходят прерывания? - PullRequest
0 голосов
/ 25 апреля 2019

Я подключил вывод GPIO 17 (в WiringPi Pin17 = Pin0) моего Raspberry Pi 1 к источнику прерывания (ИК-светодиод / приемник, который запускает прерывание всякий раз, когда ИК-луч прерывается каким-либо препятствием).Для настройки ISR я использовал библиотеку WiringPi (я уже пробовал ее с библиотекой pigpio, но у меня там тоже есть такая же проблема).Чтобы убедиться, что я действительно получаю прерывания на выводе 17, я проверил его с помощью логического анализатора, и на этом выводе определенно есть прерывания, как вы можете видеть: 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.Может быть, мне не хватает опции связывания?

Я использовал этот код здесь в качестве ссылки.Так что я тут делаю не так?Спасибо за любой совет, который вы можете дать мне!

1 Ответ

0 голосов
/ 11 июля 2019

Я не совсем уверен, почему, но я обнаружил, что удаление унарного оператора перед входом вызова функции в wiringPiISR решило мои проблемы.

Поэтому вместо звонка

wiringPiISR(INT_PIN, INT_FALLING_EDGE, &MyInterrupt)

звоните

wiringPiISR(INT_PIN, INT_FALLING_EDGE, MyInterrupt)

Я предполагаю, что в этом есть чем занятьсяс тем фактом, что wiringPiISR принимает этот аргумент в качестве указателя (* функция), поэтому размещение адреса вызова перед ним вызывает нечто странное, когда он пытается вызвать функцию MyInterrupt, для меня это вызвало мойпрограмма для сбоя!

Надеюсь, это поможет / возможно, кто-то еще сможет более подробно рассказать, почему это произойдет.

...