- 締切済み
アトメルマイコンでISRを追加すると出てくるエラー
現在、アトメル社製のマイコンATxmega128A1Uでプログラミングを行なっています。 SPI通信でSPIFポートでの通信を行なっているコードで、受信のコードを割り込みルーチンのようなISRでのコードで受信データを配列に入れるようなコードにしたいと思っています。 そこで、 ISR(SPIF_INT_vect) { } https://github.com/KenjiMaehara/raspberryPiTCPClient/commit/89b4c85451febee0cd841acd531c34cac8112c60#diff-974068d932dfafd8f83f2ef729cab1a3 このような割り込みルーチンのSPIFベクタのコードを追加しましたが、次のようなエラーが発生します。 Error 2 Disabling relaxation: it will not work with multiple definitions 1 1 MainUnit Error 3 ld returned 1 exit status collect2.exe 0 0 MainUnit Error 1 multiple definition of `__vector_118' C:\Users\kmaeh_000\Documents\GitHub\raspberryPiTCPClient\testSpi161101\M1601A_20161205\MainUnit\Debug/.././event.c 87 1 MainUnit このエラーの回避方法をご教示いただきますよう、宜しくお願い致します。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- kaba__san
- ベストアンサー率45% (27/59)
エラーメッセージは「そのベクターが複数宣言されています」と言っています。 OSを使う場合は割り込み処理もタスクの一つとしてOSに任せるのが普通で、ベタに割り込み処理ルーチンを書こうとしたからOS側の処理とかぶったのでしょう。 根本的にOS勉強しないと、毎度行き当たりばったりでは解決しませんよ。
お礼
回答頂きありがとうございます。 返事が遅れて申し訳ありません。 コードに関していろいろと修正してみたところ、前回 event.cファイルで ISR(SPIF_INT_vect) この割り込みルーチンの関数を追加したところエラーとなったので、自分のコードのどこかで、 同様のコードが重複しているのではないかと思い、検索してみたところ、 app_vect.sというアセンブラコードファイル内で記述があるようで、 https://github.com/KenjiMaehara/raspberryPiTCPClient/commit/b077cd373412780115e0f9844239481feaf87be0#diff-cf6b05a8b7944fd0a50f7634b83dae83 vector_118: JMP spif_int ; 118 0x01D4 SPI F このような行の修正を行って なおかつ event.cファイルでは void spif_int(void)という関数を宣言してビルドしたところエラーは回避できましたが、 SPIFの割り込み時にはこのルーチンに飛んできませんでした。 この割り込みルーチンの書き方について、引き続きお助けいただけると幸いです。 また、このRTOSについてですが、 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/b077cd373412780115e0f9844239481feaf87be0/testSpi161101/M1601A_20161205/MainUnit/app_vect.s このRTOSの名前は”uC/OS-II”というようです。 https://www.micrium.com/rtos/kernels/ こちらのサイトが公式サイトのようですが、これらの割り込みに関するドキュメントとか こちらにないかも教えていただけると幸いです。