• 締切済み

アトメルマイコンで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 このエラーの回避方法をご教示いただきますよう、宜しくお願い致します。

みんなの回答

  • kaba__san
  • ベストアンサー率46% (27/58)
回答No.1

エラーメッセージは「そのベクターが複数宣言されています」と言っています。 OSを使う場合は割り込み処理もタスクの一つとしてOSに任せるのが普通で、ベタに割り込み処理ルーチンを書こうとしたからOS側の処理とかぶったのでしょう。 根本的にOS勉強しないと、毎度行き当たりばったりでは解決しませんよ。

techhouse
質問者

お礼

回答頂きありがとうございます。 返事が遅れて申し訳ありません。 コードに関していろいろと修正してみたところ、前回 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/ こちらのサイトが公式サイトのようですが、これらの割り込みに関するドキュメントとか こちらにないかも教えていただけると幸いです。

関連するQ&A

  • アトメルマイコンのSPI通信ISRルーチン書き方

    現在、ATxmega128A1Uのマイコンのプログラムを作成しています。プログラム内でSPI通信のSPIFポートでデータの送受信を行わせている箇所があります。 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/master/testSpi161101/M1601A_20161205/MainUnit/event.c 現在、SPIFポートでのデータ受信は無限ループ内で、 if(SPIF.STATUS & 0x80) このコードでデータ受信の有無を確認して、受信バッファの配列変数に確保するようなやり方を在しています。 しかし、このコードだと受信とデータの送信のタイミングなどを考慮した書き方をしないとけなくて、プログラムが複雑になってしまうような気がしていて、もう少しスッキリさせたいと思い、ATMELのC言語で受信時の割り込み時にSPIFの割り込み時にその割り込みの割り込みルーチンのISR関数に飛ぶようにして、そこで受信データを配列変数に入れていくようにすれば、コードがスッキリするんじゃないかと思っています。 そこで、ISRを描きたいのですが、ISR(SPIFの受信ベクタ名)このSPIFの受信ベクタ名をご教示いただきますよう、宜しくお願い致します。 以前、ATmega88PマイコンでUARTの受信をISRのルーチンで同様のことをやった際のコードを見返してみたら、 ISR(USART_RX_vect) このようなベクタ名を書いていたのですが、この”USART_RX_vect”この文字列がどこのプログラムとリンクしているのか、プロジェクト全体で検索をかけてみても見つかりませんでした。 このベクタ名はどこで確認すれば良いかも教えて頂けると幸いです。

  • RT58iの拠点間VPNでファイル共有できない

    前回、こちらのサイトで同様の拠点間VPN接続をYAMAHAのルータRT58iで設定するための方法を質問して、実際できるようになりました。 http://okwave.jp/qa/q9299183.html ただ、2拠点のうち、1拠点のプロバイダを交換(かもめインターネットからGMOとくとく)したいと思い、同様の拠点間VPN接続設定をしたつもりなのですが、なぜかwindowsのファイル共有が拠点間でできない状態です。 拠点1:アサヒネット 拠点1のRT58i Config https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/testBranch20170201_02/testSpi161101/RT58i_config/GMO_ASAHINET_config/asahi_config.txt 拠点2:かもめインターネット -----> GMOとくとく 拠点2のRT58i Config https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/testBranch20170201_02/testSpi161101/RT58i_config/GMO_ASAHINET_config/GMO_config.txt このConfig設定で拠点間VPN接続でwindowsファイル共有ができるようにするにはどう修正すれば良いのか、ご教示頂きますよう宜しくお願い致します。

  • 拠点間VPNでのwindowsファイル共有の現象

    現在、YAMAHAのルータRT58i2台を使用して、2箇所の拠点間でVPN接続を行いました。 この時に、ローカルネットワーク内でwindows10を搭載したPC1とPC2で通常のwindowsファイル共有ができているものを、拠点1にPC1(例 IP:192.168.30.203)を、拠点2にPC2(例 IP:192.168.1.43)を配置して、PC1からエクスプローラウィンドウで”¥¥192.168.1.43”でファイル共有を覗こうとすると、共有されているフォルダを閲覧することができませんでした。 しかし、PC2側に搭載されているソースネクスト社のスーパーウイルスセキュリティとwindowsファイアーウォールの機能をどちらも無効にするとフォルダを閲覧することができます。 このように、ローカルネットワークでは通常閲覧できるのに、拠点間VPNでの環境ではファイアーウォールの無効などが必要なのか? また、この現象の対策などをご教示頂きますよう宜しくお願い致します。 また、各拠点のRT58iのconfig設定も掲載させて頂きます。 拠点1 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/testBranch20170201_02/testSpi161101/RT58i_config/area1_config 拠点2 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/testBranch20170201_02/testSpi161101/RT58i_config/area2_config どうぞ、宜しくお願いいたします

  • RT58iの拠点間VPNでファイル共有ができない

    現在、YAMAHAのルータRT58iを使用した2拠点をVPN接続しています。拠点1から拠点2に対してのローカルIPでのpingやTCPでの通信アクセスはできることを確認しました。 しかし、拠点それぞれにあるwindows PCの共有フォルダに設定しているファイルなどのファイル共有ができません。 例えば,拠点1にあるPC(IP:192.168.1.80)エクスプローラで、拠点2のPC ¥¥192.168.30.120¥test この拠点2にあるPCの共有フォルダに設定したtestというフォルダを覗くことができません。 ”VPN ファイル共有 できない”などをググってみると、この手の問題がよく発生することがあるようで、net-biosあたりのポートのrejectを両拠点のRT58iのconfig設定から外してみたりしているのですが、まだうまくいきません。 この現象を解消する方法をご教示頂きますよう、宜しくお願い致します。 現在の拠点1のRT58iのconfig設定 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/testBranch20170201_02/testSpi161101/RT58i_config/area1_config 現在の拠点2のRT58iのconfig設定 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/testBranch20170201_02/testSpi161101/RT58i_config/area2_config VPNと今までの修正の差分(左側:修正前   右側:修正後) https://github.com/KenjiMaehara/raspberryPiTCPClient/commit/6e9fcb77035ad198553c0b92e2a5e72a63c2ebc8#diff-a56b715a57730314ee887cffe029f585

  • ラズパイ3のSPI通信で文字列出力

    現在、ラズパイ3とアトメルのマイコン搭載の基板とをSPI通信で通信するためのコードをpythonで作成しています。 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/master/testSpi161101/test20161202.py 前回まで、サンプルのコードを参考に”hello”とい文字列をラズパイ3のSPI1ポートから出力していたのですが、 (中略) print "writing data" #hello spi (ASCII) data = [104, 101, 108, 111, 32] #str(spi.xfer2(data)) spi.xfer2(data) (中略) 文字列をSPIポートから出してみたいと思い、次のようにコードしました。 (中略) print "writing data" #hello spi (ASCII) data = "abcdefg" spi.xfer2(data) (中略) しかしこの場合、 $ sudo python test20161202.py test20161202.py:16: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings. GPIO.setup(16, GPIO.OUT) writing data このようなエラーがでてpythonでコードを実行できません。 data = "abcdefg" このような文字配列で文字列を出力するコードを書くことはできないのか、ご教示よろしくお願い致します。

  • アトメルのマイコンで、SPI通信で送信ができない

    現在ラズパイ3とAtmelのマイコンATxmega128A1を乗せた基板とをSPI通信させようとしています。 (簡易的な通信の仕様) ・簡易的なパケットデータをラズパイ3側からSPI1の通信ポートからデータを送信。 ・ATxmega128A1側のSPIFポートでデータを受信して、受信内容に応じて1バイトデータをラズパイ3に返送します。 ・ラズパイ3側はパケットデータ3バイトで順番に0x02 -> 0x16 -> 0x00 と送信します。 ・ATxmega128A1側はこのパケットでATxmega128A1のPK1(76番ピン)の入力のH or Lの値をラズパイ3側に返送します。 ATxmega128A1にAtmel-ICEでデバッグしながらプログラムを作っていてわかったのは、ラズパイから送信されてきた3バイトのデータは配列のcmd_data[]の cmd_data[0] = 0x02 cmd_data[1] = 0x16 cmd_data[2] = 0x00 このようにデータが入ってきていて、この部分のSPI通信は問題ないと思うのですが、 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/master/testSpi161101/M1601A_20161205/MainUnit/event.c こちらの140行目付近の case INPUT_CH18: testtest = get_ch18_Input(); if(testtest==0) { txdata=0x55; } else { txdata=0xaa; } get_ch18_Input()で入力ピンのPK1(76番ピン)のH or Lの値をとって、それによって、txdataに0x55 or 0xaaを入れているのですが、 そのデータを実際に送信しようと SPIF.DATA = txdata; while(!(SPIF.STATUS & 0x80)); dummy = SPIF.DATA; このようにコーディングしたのですが、データ送信されません。 SPIF.DATA = txdata; この部分をデバッガでレジスタの設定などを見ていくと、txdata = 0x55と入っていても SPIF.DATAの内容は全く0x55に書き換わらないのですが、この場合、何かSPI通信の設定で確認したほうがよい内容などをご教示頂きますよう、よろしくお願い致します。

  • githubのwebの差分で比較rev選択できる?

    githubでコーディング内容を修正した際に、WEB上で差分を表示させたい時があり、githubのプロジェクトページに差分表示機能があるので便利だと思いよく使っています。 この差分表示で、例えば特定のrevisionとrevisionとを比較した結果のWEBページを出力して、WEB上で共有するような機能ないでしょうか? 現在この差分機能を使った場合、revision元から一つ前のrevisionとを比較差分結果しか表示できないのですが、 (現在の比較差分ページ area1_config area2_configの更新差分ページ) https://github.com/KenjiMaehara/raspberryPiTCPClient/commit/6e9fcb77035ad198553c0b92e2a5e72a63c2ebc8#diff-a56b715a57730314ee887cffe029f585 もうすでに、こちらの差分ページのarea1_configなどは、何度も更新を行っているのですが、比較対象のrevisionを選択する機能はこのWEBページにはありませんでしょうか? どうぞ、ご教示頂きますよう、宜しくお願い致します。

  • pythonのargparseで引数の数の可変

    現在、pythonのプログラムで、コマンドにオプションを付けて、それによって戻ってくる結果を表示するようにしたいと思い作成しています。 それで、次のようなプログラムを作ることができました。 $ python pythonProg.py -s 5 5 5 5 5 5 5+5+5 == 15 (githubでの現在のソースコード内容) https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/testBranch20170201_02/testSpi161101/pythonProg.py 現在、-sのオプションと3つの引数x,y,zを渡すと、x,y,zの総和を表示するようにしているのですが、 引数の数を2つにした場合、次のようなエラーが出てきます。 $ python pythonProg.py -s 5 5 usage: pythonProg.py [-h] [-v | -q | -s] x y z pythonProg.py: error: too few arguments ”argumentsが少ない”というエラーなのでしょうが、引数を3つ以外でも総和を計算できるようにすることはできますでしょうか? 現在のソースコード内容な下記のような感じです。 (pythonProg.pyのファイル内容) import argparse parser = argparse.ArgumentParser() group = parser.add_mutually_exclusive_group() group.add_argument("-v", "--verbose", action="store_true") group.add_argument("-q", "--quiet", action="store_true") group.add_argument("-s", "--sum", action="store_true") parser.add_argument("x", type=int, help="the base") parser.add_argument("y", type=int, help="the exponent") parser.add_argument("z", type=int, help="the exponent") args = parser.parse_args() answer = args.x+args.y answer02 = args.x+args.y+args.z (中略) どうぞ、宜しくお願い致します。

  • H8Sマイコンに新規printfを追加でエラー

    前回、 http://okwave.jp/qa/q9191153.html こちらのサイトでH8S2368にprintfを追加したい内容の質問をした時の続きです。 現在、 イチから作って丸ごと学ぶ! H8マイコン道(12):シリアル通信でオリジナルprintf関数を作ろう (3/3) - MONOist(モノイスト) http://monoist.atmarkit.co.jp/mn/articles/1003/26/news096.html こちらのサイトの内容を参考に、printfのサンプルコードを追加してみました。 https://github.com/KenjiMaehara/ios_apply_test/blob/20150720_test/H8S2368_console/console/console.c しかし、コード追加後にコンパイルを実施すると次のようなエラーが発生します。 (コンパイルエラー内容) HMAKE MAKE UTILITY Ver. 2.1.00.000 Copyright (C) 2001,2006 Renesas Technology Europe Ltd. Copyright (C) 2001,2006 Renesas Technology Corp. and Renesas Solutions Corp. Executing Hitachi H8S,H8/300 C/C++ Library Generator01 phase set CH38TMP=C:\Users\KMAEH_~1\AppData\Local\Temp set PATH=c:\program files (x86)\renesas\hew\tools\renesas\h8\6_2_2\bin set CH38=c:\program files (x86)\renesas\hew\tools\renesas\h8\6_2_2\include Executing Hitachi H8S,H8/300 C/C++ Compiler02 phase "c:\program files (x86)\renesas\hew\tools\renesas\h8\6_2_2\bin\ch38.exe" -ws=C:\Users\KMAEH_~1\AppData\Local\Temp\hmk6689.tmp Executing Hitachi H8S,H8/300 Assembler03 phase Executing Hitachi OptLinker04 phase "c:\program files (x86)\renesas\hew\tools\renesas\h8\6_2_2\bin\LnkSpawn.exe" -subcommand=C:\Users\KMAEH_~1\AppData\Local\Temp\hmk6A82.tmp ** L2310 (E) Undefined external symbol "_mprint_test_sci1" referenced in "..\myproject\obj\main.obj" Optimizing Linkage Editor Abort ERROR: Process failed with return code: 1 mprint_test_sci1という関数の宣言は #include "all_includes.h" こちらのヘッダーファイルに (all_includes.hの内容の一部) extern void outs_sci1(char *, short); extern void outc_sci1(char, short); extern void outn_sci1(char, unsigned long, short); extern void mprint_test_sci1(char *fmt, ...); extern void charput_sci1(char OutputChar); このような形で宣言しています。 しかし、エラーが出てくるのですが、これをどのように解決すればよいのかご教示頂きますよう、よろしくお願い致します。

  • vectorを引数として使いたいのですがエラーが出てしまいます

    vectorを引数として使いたいのですがエラーが出てしまいます 以下のようなコードでコンパイルでエラーが出てしまうのですがどうしたら良いでしょうか。 class car{ public: int tire; int engine; } というクラスを作ります。 main関数内で function(car a[]);//関数の宣言 int main(){ std::vector<car> car1(0);//car型のcar1を作成 std::vector<car>::reference car1rf=car1.front(); function(car1rf);//関数に代入 } function(car a[]){ car test; test.tire=1; a.push_back(test); } としてpush_backを外部関数で行いたいのですが、エラーが出てしまいます。 どうしたら良いでしょうか。