PIC

Microchip社製品関連

MPLABX+XC32で「relocation truncated to fit: R_MIPS_GPREL16」エラー

MPLabX(v3.05)+XC32(v1.42)でPIC32MZ用のソースをビルドしたとき下記のエラーがでた。

c:/microchip/harmony/v1_11/apps/hoge/firmware/src/hoge.c:123:(.text.APP_Tasks+0x38): relocation truncated to fit: R_MIPS_GPREL16 against `hoge_hoge'
collect2.exe: error: ld returned 255 exit status

調べてみるとmips固有コンパイラオプション(-g)でエラーの様子。
<対策>
全体オプションかファイル固有のビルドオプションに「-g0」や「-g1」を付けてリビルド
  • (全体のとき)「プロジェクト」-「プロパティ」から「xc32-gcc」の「Additional options」に「-g0」等
  • (個別のとき)該当ファイル選択-「プロパティ」から「xc32-gcc」の「Additional options」に「-g0」等
<gオプションメモ>

どうやらgccのデフォルト(-g)は(-g8か-g9)相当みたい。

オプション内容
g0 デバッグ情報なし
g1 最小限のデバッグ情報
g2,g3,g4,g5,g6,g7 行番号、ソースファイル名、変数に関するデバッグ情報
g8 完全なデバッグ情報。変数は読み取り専用
g9 完全なデバッグ情報。変数の値をデバッガーで変更できる
<参考>

MicrochipHarmonyでUSB+SDCard+FS

Microchip HarmonyでUSB+SDカード処理がうまくいかなかった原因がわかったので自分メモ。旧Harmony(v1.04とか)ではSDカードドライバが未検証とかで放置していたのだが、いよいよPICでSDカードを扱いたいので試してみた。
<環境>
  • PIC32MZ2048ECG064
  • Harmony v1.11
  • XC32 v1.43
  • MHCにてUSB(MSD+CDC)+FS(FileSystem)の設定で作成したプロジェクトを使用
  • Windowsドライバ、USBデスクリプタ等はMicrochip標準を使用。
<目的>
  • PIC上のSPIモードで接続したSDカードをWindowsからも読み書きしたい
<症状>
  • Windowsからドライブ(PIC)は見えるがディスクなしとなっている
<確認など>
  • PIC内でSDの接続状態を確認(sysObj.drvSDCardのStatusを確認)すると問題なくSDカードは接続できている。
<原因>
  • system_config.h内設定のSDクライアント数不足
  • 恐らく、USBとFSで1ずつ計2のクライアントとなるため標準ではUSB側クライアントが数不足でNo Diskとなっていたと思われる。
  • Sampleの「usb/msd_sdcard」はFSを使っていないのでクライアント数1でOK。(役立たず)
  • Sampleの「usb/csc_msd_basic」はNVMサンプルなのでSD関係なし。(役立たず)
<対策>
  • MHCの「SD Card」項目で「Number of SD Card Driver Clients」 =2,「Maximum Driver Indeces」 = 2に設定
  • もしくはsystem_config.h内の下記項目を2へ変更してビルド
#define DRV_SDCARD_CLIENTS_NUMBER       2
#define DRV_SDCARD_INDEX_MAX            2
あとは簡単にデバッグできるとHarmonyも便利になるのになー。SYS_ASSERT()とか簡単に出力できるようになりますように。

PIC24FでSetCommStatusするとエラー

最近PICをいじっていてハマったことをメモします。
<前提となる環境>

  • PIC24F64GB002 +Microchip Solutions v2012-07-18でのMSD+CDCファームを作成
  • 後閑先生の「改定新板 PICで楽しむUSB機器 自作のすすめ」が参考書
  • usb_config.hでUSB_INTERRUPTにより割り込み処理設定済み
  • コンパイラはMPLAB8.84+C30(V3.25)

<現象>

  • TeraTermではなんの問題もなくCDC通信できてたので余裕かましていたら、自前アプリでの通信時にエラーで涙目
  • デバッガーで追いかけるとGetCommStatusは成功するがSetCommStatusでエラーが100%発生して終了している
  • GetLastError()値は 31(0x1F) システムに接続されたデバイスが機能していません。
  • 英語版なら「A device attached to the system is not functioning.」

<原因>

  • usb_function_cdc.cで定義されているUSBCheckCDCRequest();をどこからも呼び出していないのが問題。(SetCommStatusの応答処理を行う)
  • 「改定新板 PICで楽しむUSB機器 自作のすすめ」のMSDサンプル(GPSロガー)のコード(P.326)を鵜呑みにしたのが敗因。
  • TeraTermはSetCommStatusの戻り値(成功or失敗)にかかわらず処理をすすめるナイスな奴っぽい。だけどオーソドックスなAPI利用のシリアル通信だと今回のようにエラーで身動きがとれなくなる。
  • 先生のCDC動作確認もTeraTermなので多分気づかない
  • SetCommStatusは少なくない量のデータを送るので、低クロックなPICの場合問題になることがある。PIC24Fは32MHz駆動で特に問題はでてない。

<解決策>

後閑先生のコードを参考にしたのなら、main.cとかに存在するはずのUSBCBCheckOtherReqへUSBCheckCDCRequest();を追加することでスルっと幸せになれます。

void USBCBCheckOtherReq(void)
{
    USBCheckMSDRequest();
}

          ↓

void USBCBCheckOtherReq(void)
{
    USBCheckMSDRequest();
    USBCheckCDCRequest(); //これを追加。
}

ということで、PICに関係してない人には何が何やらな内容ですが、いつものように関連キーワードてんこ盛りなので、きっと誰かの役に立つはずと信じて終わります。

あと、「技術評論社か先生のページにでも修正(なんだろうか・・)依頼をだせyo」って声も感じなくはないのですが、畏れ多いのでここにこそっとメモします。つか、この問題で8時間もロスしたよ。USB動作の勉強にはなったけど・・・(T∇T)

<参考リンク>

カレンダー

  • keisan
無料ブログはココログ
2019年11月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30