2018年8月5日日曜日

PIC XC8 v2.0 Build Error (Timer Interrupt )

 最新の MPLAB IDE v5.00 で、初めてPICのプログラミングをしているのだが、Timer Interrupt のところで6時間位立ち往生してしまった。

interrupt_manager.h や interrupt_manager.c に下記の記述をしているのだが、

    void interrupt INTERRUPT_InterruptManager (void);

Buildしようとすると、下記のようなErrorが出てビルドできない。

    In file included from mcc_generated_files/interrupt_manager.c:49:
    mcc_generated_files/interrupt_manager.h:111:6: error: variable has incomplete type 'void'
    void interrupt INTERRUPT_InterruptManager (void);
         ^
    mcc_generated_files/interrupt_manager.h:111:15: error: expected ';' after top level declarator
    void interrupt INTERRUPT_InterruptManager (void);

・戻り値のvoidは incomplete type(不完全な型)だからだめ
・最上位の宣言文のあとは ";"が付くべき
と言っているようだ。本当なのか?
 昔はZ80や8086のアセンブラを結構やっていて、また、VBやC#はそこそこ使えている自分だが、Cはなぜか今回が初めて。ああ、自分はこんな程度のことが判らないのか、それともXC8の方言なのかと、英文のマニュアルを調べたりした。最新版のマニュアルなのに どうも interrupt の説明が古い感じ。どうしても納得できなくて、いろいろとGoogle検索もしてみたが、なかなか有効な情報が無い。最終的に、どうも interrupt というキーワードに関して、XC8 Compiler v2.0 にBugがありそうだという感触になった。そして、英語のサイトを検索していてようやくそれらしい情報を見つけた。
 結論としては、XC8 Compiler の Project Properties のなかで、C Standard という設定項目があって、そこを C99 -> C90 に変更すればよい、という情報を見つけ、それを試したところ、No error で Build 出来た。
これで解決。無事、Timer Interrupt で LEDの1secのblink(点滅)が出来た。たったこれだけのことをやるだけなのに、解決までが長かったなー。

13 件のコメント:

  1. C99使えるのにわざわざC90に戻してビルドするとはね。(笑)
    解決策はマニュアルに書いてある。
    あなたは何でもバグにしてしまうのかい?

    返信削除
    返信
    1. そういう風に言うなら具体的に教えりゃ良いだろ!
      批判してても自分の自慢話にしか聞こえない!!

      削除
    2. そう、マニュアルを見ても判らないから上記のようなことになったので、「xxというマニュアルのどこどこに書いてあるじゃん、そんなことも見つけられないのかい」みたいな、自慢話でもいいから教えてほしいんだよね。同じような問題にぶち当たった人たちで情報共有出来たらと思って投稿したので。

      削除
  2. 書き方が変わったみたいで、以下でビルド可能でした。
    void __interrupt () my_isr_routine (void)

    返信削除
  3. この情報によりmake errorが消えました。xc8 v2.05です。
    ありがとうございます。

    返信削除
    返信
    1. このブログが役に立ったみたいで、よかったです。

      削除
  4. ここをヒントに助かりました当分C90の方でやりそうです。
    ありがとうございました。

    返信削除
  5. 通りすがり2019年5月11日 18:05

    もうAVRに移ってPICは久しくやってなかったのですが、
    昔作ったの流用したら簡単に作れるものが出てきて、使ってないPIC ICの処分がてら
    MPLABとXC8をインストール、過去のプログラムをコンパイルしたら同じエラーになりました。

    匿名さんのvoid __interrupt () my_isr_routine (void) の書き方で通りました。

    提起してくださったスレ主様、情報をくださった匿名さん、感謝です。

    返信削除
  6. ビルドできずに困っていたのが解決しました。ありがとうございます!

    返信削除
  7. 助かりました。C90に変更するとビルドできました。

    返信削除
  8. 私も同じ点でぶつかり、このページの情報で解決しました。どうもありがとうございました。
    「マニュアルに載っている」という事だったので探してみましたところ、以下のところにそれらしい記述を見つけました。
    コンパイラのマニュアルは全編英語で量も多いので、思わず読まずに済ませたくなっちゃいますよね。私も今回の件で初めて開きましたので。

    マニュアルのタイトル:MPLAB® XC8 C Compiler User’s Guide for PIC
    該当の章:5.8.1 Writing an Interrupt Service Routine
    マニュアルのファイルがあるパス:C:\Program Files\Microchip\xc8\v2.30\docs

    返信削除
  9. 助けになります。ビルドできました。
    マニュアルにもありましたね。。
    本当にありがとうございます。

    返信削除
  10. 助かったぜ。ありがとうございます。

    返信削除