前提・ 実現したいこと
MHC(MPLAB Harmony Core)のTCP/IPスタックを用いてPIC32MX170F256BとENC28J60の組み合わせでTCPサーバソケットの構築を目指しています。
PIC32MX170F256BとENC28J60はSPIモジュールによって動かしており、一応ARP、Ping(IPv4)サーバ/クライアント、TCPサーバソケットの構築はできましたが、接続中にTCP/IPスタックが異常停止する問題が発生してます。
発生している問題・エラーメッセージ
DEBUGモジュールが有効の時はコンソール出力は以下のようになりました。
1.通信がないときは何も表示されない(正常)※今回は後付けで@:check stack signalsが出力されるようにしている
2.通信があるときは"Transfer Handle Expired"が全文表示される(正常)
※以下の文面より動作としては正常ですがoffにする必要があるとのこと。
https://github.com/Microchip-MPLAB-Harmony/net/blob/master/release_notes.md
SYS_DEBUG module needs to be removed in demos with external Ethernet controllers ENCx24J600 and ENC28J60:
3.ある程度動かしていると、通信が停止し(wiresharkにてパケットの送受信ができてないこと確認、RJ45のステータスLEDが消灯状態となる)
その時のコンソール出力は下記のように通信が行われてないにもかかわらず"Transfer Handle Expired"が出力される。(異常)
また、"Transfer Handle Expired"が完全に表示されない("Transfer Handle E"等)箇所が多数出没する。
@:check stack signals //これは後付けしたSYS_CONSOLE_MESSAGE("@:check stack signals\r\n");関数であり、パケットの送受信がない限り通常はメッセージは出ない @:check stack signals @:check stack signals @:check stack signals Transfer Handle Expired //これはPCからボードに対してpingを打った時の受信と送信動作時のコンソール出力 Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired @:check stack signals @:check stack signals @:check stack signals @:check stack signals @:check stack signals ping 192.168.0.2 //これはボードからPCにpingを打つコマンド //以下はpingの送信から受信までの動作(最後にreply[1] from 192.168.0.2: time = 39msの応答あり)×4 >Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Ping: reply[1] from 192.168.0.2: time = 39ms Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Ping: reply[2] from 192.168.0.2: time = 39ms Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Ping: reply[3] from 192.168.0.2: time = 49ms Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Ping: reply[4] from 192.168.0.2: time = 39ms Ping: done. Sent 4 requests, received 4 replies. @:check stack signals @:check stack signals @:check stack signals @:check stack signals @:check stack signals Transfer Handle Expired //これはPCからボードに対してpingを打った時の受信と送信動作時のコンソール出力 Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired Transfer Handle Expired //ここまでは正常に動いている Transfer Handle E //ここから"Transfer Handle Expired"が崩れるとともにPCからpingの送信を停止しても以下の出力が出続ける Transfer Handle Expired Transfer Handle E Transfer Handle Expired Transfer Handle Expired Tr Transfer Handle Expired Transfer Handle E Transfer Transfer Handle Expired Transfer Handle E Transfer Handle Expired Transfer Handle E Transfer Transfer Handle Expired
DEBUGモジュールが有効の場合は"Transfer Handle Expired"が際限なく出力され、他のステータスが確認できません。
そこでDEBUGモジュールを無効にして、以下の項目を確認しました。
1."netinfo":エラーの前後で特に変化なし。※エラー後もLINKはUPのまま
<出力>
---------- Interface <eth0/ENC28J60> ----------
Host Name: MCHPENC28_E - NBNS disabled
IPv4 Address: 192.168.0.13
Mask: 255.255.255.0
Gateway: 192.168.0.1
DNS1: 192.168.0.1
DNS2: 0.0.0.0
MAC Address: 00:04:a3:12:34:56
default IP address is ON
Link is UP
Status: Ready
2.”macinfo”:エラーが発生する前は特に問題ないが、エラー発生後には送信バッファ(nTxPendBuffers)に送信できなかったパケットが溜まっている。
<出力(正常時)>
nterface: ENC28J60 Driver Statistics
Receive Statistics
nRxOkPackets: 6
nRxPendBuffers: 0
nRxSchedBuffers: 1
nRxErrorPackets: -1
nRxFragmentErrors: -1
nRxBuffNotAvailable: -1
Transmit Statistics
nTxOkPackets: 6
nTxPendBuffers: 0
nTxErrorPackets: -1
nTxQueueFull: -1
Interface: ENC28J60 Hardware Register Status
not supported
<出力(異常時)>
Interface: ENC28J60 Driver Statistics
Receive Statistics
nRxOkPackets: 52
nRxPendBuffers: 1
nRxSchedBuffers: 0
nRxErrorPackets: -1
nRxFragmentErrors: -1
nRxBuffNotAvailable: -1
Transmit Statistics
nTxOkPackets: 52
nTxPendBuffers: 20
nTxErrorPackets: -1
nTxQueueFull: -1
Interface: ENC28J60 Hardware Register Status
not supported
3.”objinfo”:エラー前からDRV_ENCにて-1となっている、エラー後にも特に変化なし
<出力>
-- Object Status--
ERROR_EXTENDED:-10
ERROR :-1
UNINIT :0
BUSY :1
READY :2
READY_EXTENDED:10
OBJ DRV_SPI:2
OBJ DRV_ENC:-1
OBJ TCPIP:2
4."ps":エラー前後でスタックオーバーフローの発生はなし
<出力>
SYS_CMD_TASKS X 1 114 1
TCPIP_STACK_Tas R 1 536 2
IDLE R 0 88 5
APP0_Tasks B 2 883 3
APP1_Tasks B 4 77 4
コマンドの説明
1、2はTCPIP CMDモジュールに登録されているデフォルトのコマンドとなります。
3はDRV_ENC28J60_Status、DRV_SPI_Status、TCPIP_STACK_Statusの戻り値を出力する自作関数です。
4はvTaskListをコンソールに出力する自作関数です。
他に調査するべき箇所がありましたらご教授願います。
補足情報(FW/ツールのバージョンなど)
各モジュールのバージョンは以下となります。
mhc_version: v3.8.5
mplabx_version: v5.45 # if MPLAB X plugin only
plugin_version: v3.6.4 # if MPLAB X plugin only
compiler: XC32 (4.00)
modules:
- {name: "core", version: "v3.10.0"}
- {name: "csp", version: "v3.11.0"}
- {name: "dev_packs", version: "v3.11.2"}
- {name: "wolfssl", version: "v4.7.0"}
- {name: "net", version: "v3.7.4"}
- {name: "crypto", version: "v3.7.5"}
- {name: "CMSIS-FreeRTOS", version: "v10.3.1"}
あなたの回答
tips
プレビュー