質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
RTOS

RTOS(リアルタイムOS)は、リアルタイムシステムのためのOSです。実時間システムや実時間OSとも呼ばれ、時間的な制限のある処理を行うための機能・特性を備えています。組み込みシステムの制御に多く用いられています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

4011閲覧

ESP32のSPI通信線に2つのモジュール接続・タスク2つで動作させるとハングアップする

MaeharaKenji

総合スコア86

RTOS

RTOS(リアルタイムOS)は、リアルタイムシステムのためのOSです。実時間システムや実時間OSとも呼ばれ、時間的な制限のある処理を行うための機能・特性を備えています。組み込みシステムの制御に多く用いられています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2020/06/10 22:11

編集2020/06/12 01:40

現在、ESP32のSPI通信線上にTFTモジュールのILI9488とmicroSDのカードリーダーモジュールを接続しています。この2つを動作させるために、2つタスクを作り、それぞれを動作させるプログラムを作成しました。

https://github.com/KenjiMaehara/esp32_ILI9488Ctl/tree/e373fbd40e1af7dc4db7c2718b422b09c463b8d7/exsamples/20200610_rtosTest *6月10日時点のソースコード

ただ、このプログラムをコンパイル・書き込みで動作させてみると、数秒後にESP32がハングアップしてしまいます。
試しに、2つあるタスクの片方をコメントアウトして1つのタスクだけにしてみると、目的の動作をすることがわかりました。

この場合の解決方法などをご教示頂きますよう、よろしく御願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/06/10 23:06

コードを提示しましょう
guest

回答2

0

ベストアンサー

FreeRTOSはあまりいじってないので詳細は知りませんが、
SPIでぶつかっているところまで見当がついているのなら、mutexかなにかで排他処理をすればよいのではないでしょうか?

投稿2020/06/10 23:13

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MaeharaKenji

2020/06/11 07:43 編集

回答頂きありがとうございます。 FreeRTOSでマルチタスク (on ESP32) https://qiita.com/hideakitai/items/bd95d0db63097b8808f9 #Qiita こちらのサイトに掲載されたmutexのコードを参考に修正してみました。 https://github.com/KenjiMaehara/esp32_ILI9488Ctl/tree/master/exsamples/20200610_rtosTest しかし、コンパイル成功後動作させてみると、次のようなエラーが出てリブートを繰り返します。 Guru Meditation Error: Core 0 panic'ed (Unhandled debug exception) Debug exception reason: Stack canary watchpoint triggered (TASK_SDTest) Core 0 register dump: PC : 0x400848d5 PS : 0x00060e36 A0 : 0x00060e30 A1 : 0x3ffb8530 A2 : 0x00000000 A3 : 0x00060e23 A4 : 0x00060e20 A5 : 0x00000001 A6 : 0x00060e23 A7 : 0x00000000 A8 : 0x80081ed4 A9 : 0x3ffb85c0 A10 : 0x00000001 A11 : 0x3ffb8828 A12 : 0x00000001 A13 : 0x00000001 A14 : 0x00060e23 A15 : 0x00000000 SAR : 0x00000000 EXCCAUSE: 0x00000001 EXCVADDR: 0x00000000 LBEG : 0x400d719c LEND : 0x400d71fe LCOUNT : 0x00000002 Backtrace: 0x400848d5:0x3ffb8530 0x00060e2d:0x3ffb8600 0x40088025:0x3ffb8620 0x400d7d3d:0x3ffb8660 0x400d6761:0x3ffb8680 0x400d680a:0x3ffb86a0 0x400d35f2:0x3ffb86d0 0x400d1de4:0x3ffb86f0 0x400d1130:0x3ffb8720 0x400d1b99:0x3ffb8740 0x400885e9:0x3ffb8790 Rebooting... こんな感じの再起動時のエラーが出てきます。 このエラー内容から修正すべき点などはわかりますでしょうか?
thkana

2020/06/11 11:49

スタック破壊系のなにかみたいですね。 xMutexがNULLのままあちこち飛び交っているような気がするのだけれど、それって大丈夫なのかしら? 'FreeRTOS mutex'あたりでサンプルをぐぐってみると使用前にxSemaphoreCreateMutex()とか要りそうな気配ですけれど。
MaeharaKenji

2020/06/12 01:47

皆様回答頂きありがとうございます。 その後いろいろとググっていましたところ、 https://stackoverrun.com/ja/q/4053935 こちらのサイトの中で、同様の現象が起きているとのサイトを見つけ、”I have configured configMINIMAL_STACK_SIZE as 4096 in FreeRTOSConfig.h”スタックオーバーフローをこれで解決できたとの記事を読みました。 自分のところでもやってみたところ、確かに、再起動繰り返しの現象が解消され、2つのタスクがシンプルに動作するようになりました。
MaeharaKenji

2020/06/12 01:54

mutexなどが中途半端になってしまいましたが、SPI通信線に繋がるモジュールとの通信も、とりあえずは正常にできていることを確認できたため、今度トライしてみようと思います。
guest

0

そもそものはなしになりますが、一つの資源(SPIデバイス)をなにも考えずに2つのタスクで同時使用しようとすればフリーズするのは当たり前の話ですね

#もひとつ、そもそもSPIというのは基本的に1対1の通信方式ですが。

投稿2020/06/11 00:49

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問