Raspberrypi割り込み処理


wiringPiISR関数を使って割り込み処理をする

例題で作成するが現状のままではエラーが出てコンパイルできない。
(最下段に最終的な例題掲載)

wiringPiISR関数が見つからない。==>wiringpi.cを新しくする
==>wiringPiISR関数が含まれている。

他にpiThread.c、piHiPri.cが必要である。
また”-pthread”オプションを付けないとコンパイルができない。

結果、以下の操作でコンパイルができた。

gcc -pthread int_test.c wiringPi.o piHiPri.o -o int_test

実行すると、今度は

 ”gpio: unable to open gpio edge interface for pin・・・・”
と表示される。
これはgpio.c内で出力している。
wiringpi.c内のwiringPiISR関数内にプリント分を入れてdebugすると
pid=0の時(子プロセス)に表示される。

結果、sysytemのupdateが必要だとわかった。
(https://projects.drogon.net/raspberry-pi/wiringpi/functions/)

以下の処理を行った。

# sudo apt-get update

# sudo apt-get upgrade

# sudo apt-get install git-core

# sudo wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update && sudo chmod +x /usr/bin/rpi-update

# sudo rpi-update

# reboot


★webのサンプルでは、”setup = wiringPiSetupSys();”となっているが、
これだと、wiringPiのconnector Pinが「BCM GPIO」Pinのアサインになってしまう為、
「wiringPiSetup();」を使用した。

★また、”wiringPiISR(pin_n,INT_EDGE_FALLING, &int_signal);”では
 ”edge: Invalid mode: fallin. Should be none, rising, falling or both”
のエラーが出た。
 ”wiringPi.c”"の
/**/ if (mode == INT_EDGE_FALLING)
                modeS = "fallin" ;

を      modeS = "falling" ;
に修正することでOKとなった。


// ###############################################
make コマンド

gcc -c wiringPi.c -o wiringPi.o

gcc -pthread int_test.c wiringPi.o piHiPri.o -o int_test

int_test.c ソースファイル
// ###############################################

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>

#include "wiringPi.h"
#include "pi_gpio.h"

#define pin_03  8       // rsp board pin:03
#define pin_05  9       // rsp board pin:05
#define pin_07  7       // rsp board pin:07
#define pin_08  15      // rsp board pin:08
#define pin_10  16      // rsp board pin:10
#define pin_11  0       // rsp board pin:11
#define pin_12  1       // rsp board pin:12
#define pin_13  2       // rsp board pin:13
#define pin_15  3       // rsp board pin:15
#define pin_16  4       // rsp board pin:16
#define pin_18  5       // rsp board pin:18
#define pin_19  12      // rsp board pin:19
#define pin_21  13      // rsp board pin:21
#define pin_22  6       // rsp board pin:22
#define pin_23  14      // rsp board pin:23
#define pin_24  10      // rsp board pin:24
#define pin_26  11      // rsp board pin:26

// ###############################################
void int_signal(void){
        printf("Signal-A\n");
}
// ###############################################
void int_noise(void){
        printf("Signal-B\n");
}
// ###############################################
int main(void){
        int i;
        printf("pi interrupt test start !!\n");
        if (wiringPiSetup() == -1){
                printf("wiringPiSetup init error\n");
                return(1);
        }
        pinMode(pin_22, INPUT); //
        pinMode(pin_26, INPUT); //

        pullUpDnControl(pin_22, PUD_UP);
        pullUpDnControl(pin_26, PUD_UP);

        wiringPiISR(pin_22,INT_EDGE_FALLING, &int_signal );
        wiringPiISR(pin_26,INT_EDGE_RISING, &int_noise );
//      wiringPiISR(pin_26,INT_EDGE_BOTH,  &int_noise  );

        i=0;
        while(1){
                sleep(2);
                printf("%d\n",i++);
        }
        return 0;
}

// ############################################################################