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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

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

Q&A

解決済

1回答

4252閲覧

ESP32でタイマー割り込みイネーブル後にWifi接続したい

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

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

1グッド

1クリップ

投稿2020/09/16 01:10

前提・実現したいこと

ESP32-DevKitCでタイマー割り込みイネーブル後にWifi接続(接続監視・再接続)したい

タイマー割り込みはデータの一定時間の収集や通信タイミングに使用したい
wifi通信は接続後も切断した場合に再接続する処理を行いたいのでタイマー割り込みイネーブル後にも接続処理をできるようにしたい
(できれば別タスクで)

発生している問題・エラーメッセージ

タイマー割り込み処理イネーブル後にWifi接続するとリブートを繰り返してしまう
ただし条件としてタイマー割り込み内の処理で他のファイルの関数を呼び出した場合
例えば.inoファイル内で宣言された変数や関数を呼び出した場合は起きない

Rebooting... ets Jun 8 2016 00:22:57 rst:0x3 (SW_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0018,len:4 load:0x3fff001c,len:1216 ho 0 tail 12 room 4 load:0x40078000,len:9720 ho 0 tail 12 room 4 load:0x40080400,len:6364 entry 0x400806b8 Guru Meditation Error: Core 1 panic'ed (Cache disabled but cached memory region accessed) Core 1 register dump: PC : 0x40139b30 PS : 0x00060034 A0 : 0x800812f4 A1 : 0x3ffbe790 A2 : 0x3ffbecd8 A3 : 0x20000000 A4 : 0x00000400 A5 : 0x00000000 A6 : 0x3ffc15f8 A7 : 0xffffffff A8 : 0x80080f4d A9 : 0x00000001 A10 : 0x00060e23 A11 : 0x00000000 A12 : 0x3ffba264 A13 : 0x0000abab A14 : 0x3ffc3248 A15 : 0x00000001 SAR : 0x00000012 EXCCAUSE: 0x00000007 EXCVADDR: 0x00000000 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000 Core 1 was running in ISR context: EPC1 : 0x40086ac7 EPC2 : 0x00000000 EPC3 : 0x00000000 EPC4 : 0x40139b30 Backtrace: 0x40139b30:0x3ffbe790 0x400812f1:0x3ffbe7b0 0x40084809:0x3ffbe7d0 0x40086ac4:0x3ffba190 0x40082c23:0x3ffba1b0 0x40088c15:0x3ffba1d0

該当のソースコード

sketch_sep15a.ino

#include <WiFi.h> #include "testtest.hpp" const char* ssid = "***"; const char* password = "***"; hw_timer_t * timer = NULL; void IRAM_ATTR lOOusecTimer(){ test(); } void setup() { Serial.begin(115200); while (!Serial); timer = timerBegin(0, 80, true); timerAttachInterrupt(timer, &lOOusecTimer, true); timerAlarmWrite(timer, 100, true); timerAlarmEnable(timer); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); } } void loop() { delay(1000); }

testtest.cpp

void test(){ }

testtest.hpp

void test();

試したこと

・サンプルでは同一タスクで接続してるが、別タスクにしてCPUコアをPRO_CPU_NUMやAPP_CPU_NUMなど指定を変えてメインタスクと別にすることで回避できないか試したが同じ結果になった
・Wifi接続処理に使用しているタイマーがあり競合しているのではないかと、タイマーを0~3まで変更してみたが同じ結果になった
・タイマーイネーブル前だと問題なくWifi接続

補足情報(FW/ツールのバージョンなど)

Arduino Ver1.8.13

できるだけシンプルな形にしたつもりですが、問題解決の糸口が見つけられませんでした。他のサイトでもTimer割り込みとWifi接続を両立しているサンプルはありましたが、Timerイネーブル前に接続してその後は通信の監視はしていないものばかりで行き詰まってしまいました。どなたか思い当たる点がありましたら宜しくお願い致します。

ozwk👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

あまりちゃんとスジを通した調査はしてませんが、
'Cache disabled but cached memory region accessed'でググってみるとつまり割り込みルーチン内での処理はIRAM_ATTRをつけろみたいな話で、(もしかしたらWifiの接続処理中に何らかの理由でキャッシュを切るというとこなのかも知れないけれど)

C++

1//testtest.h 2#pragma once 3void IRAM_ATTR test();

C++

1//testtest.cpp 2#include <esp_system.h> 3void IRAM_ATTR test(){ 4}

としてみるとリセットはかからなくなるみたいです。

投稿2020/09/16 13:10

thkana

総合スコア7610

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

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

退会済みユーザー

退会済みユーザー

2020/09/17 01:15

回答がありがとうございます。 試したところ無事動きました。 逆に同一ファイル内でtest()を書いてコンパイルした場合ではIRAM_ATTRが無くても動いたのは、コンパイラが割り込みから呼び出された関数はIRAMに配置するからでしょう。辻褄があいますのでご指摘頂いた理由で間違いないと思います。 Wifi接続時にキャッシュがDisableにされるのかどうかについては自分で調査を 続けたいと思います。 大変助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問