Всем привет! Необходимо решить задачу с активным соединением по WiFi c одновременной обработкой внешних прерываний на одном устройстве ESP32. Вопрос собственно следующий: возможно ли разделить по ядрам эти два процесса? Вроде по умолчанию WiFi работает на ядре 0. Попытка при активном соединении WiFi обработать прерывание вешает систему. Ставить второй ESP32 для обработки прерываний очень не хочется. Решал ли кто-нибудь аналогичную задачу?
Да, выглядит это так: Guru Meditation Error: Core 1 panic'ed (Interrupt wdt timeout on CPU1) Core 1 register dump: PC : 0x4008be8a PS : 0x00060134 A0 : 0x8008b06b A1 : 0x3ffbe550 A2 : 0x3ffcd38c A3 : 0x3ffbc6c0 A4 : 0x00000001 A5 : 0x00000001 A6 : 0x00060123 A7 : 0x00000000 A8 : 0x3ffbc6c0 A9 : 0x3ffbc6c0 A10 : 0x00000019 A11 : 0x00000019 A12 : 0x00000001 A13 : 0x00000001 A14 : 0x00060121 A15 : 0x00000000 SAR : 0x0000001a EXCCAUSE: 0x00000006 EXCVADDR: 0x00000000 LBEG : 0x4000c2e0 LEND : 0x4000c2f6 LCOUNT : 0xffffffff Core 1 was running in ISR context: EPC1 : 0x4013aee0 EPC2 : 0x00000000 EPC3 : 0x00000000 EPC4 : 0x4008be8a
Вы так и не поняли намек? Намек намекал на то, что без просмотра вашего кода найти решение не возможно. Здесь написано, что время обработки вашего прерывания превышает допустимое - а это зависит от того, что творится в коде. В целом я не работаю с ESP на Си, поэтому до конца не помогу, так, общие мысли. Прерывание не самоцель, возможно вы хотите сделать некоторое устройство. Заставить работать его можно разными способами.
Добавлю. То, что написано в первом посте понятно, только вам. Поэтому без вашего кода, вызывающего данную проблему, и объяснения того, что вы хотите получить, сказать что-то сложно.
Чтобы заниматься такими вещами, необходимо отменно знать аппаратную платформу. Т.е. брать даташит, апноты и прочую дитературу и штудировать её с утра до ночи. Вообще, линейка ESP не для новичков.
Походу вы правы, решил надергать содержательную часть из кода, отвечающую за WiFi связь с сервером и процедуры обработки прерывания откинув сервисную часть, чтобы выложить в качестве примера и "о чудо!" прерывание перестало вешать систему. Собственно кода в обработке прерываний не много, последовательно активируется 8 прерываний: int STL = FALLING; attachInterrupt(sns1, sns1_run, STL); attachInterrupt(sns2, sns2_run, STL); attachInterrupt(sns3, sns3_run, STL); attachInterrupt(sns4, sns4_run, STL); attachInterrupt(sns5, sns5_run, STL); attachInterrupt(sns6, sns6_run, STL); attachInterrupt(sns7, sns7_run, STL); attachInterrupt(sns8, sns8_run, STL); пример процедуры обработки выглядит так: void sns2_run() { sns[2] = true; detachInterrupt(sns2); sTime[2] = micros(); if (sns_cnt == 0) { // поймал первым sTime[0] = sTime[2]; // засекли время } sns_cnt++; } Глобальная задача: максимально точно зафиксировать временные интервалы между запусками прерываний (до 10 мкс). В принципе все работает, данные о временных интервалах отправляются на сервер в виде собранной строки String : // отсылаем данные void send_msg() { if (!client.connected()) { if (!client.connect(host2, port2)) { Serial.println("connection failed"); return; } } client.print(newMsg); newMsg = ""; client.stop(); } После отправки данных останавливаем клиента и по новой активируем 8 прерываний. Но когда я решил получить подтверждение от сервера о приеме данных и не стал закрывать клиента а начал обрабатывать ответ от сервера в loop'e вот тут и начались проблемы. // Ответ от сервера void getBackMessage() { checkConnectionToServer(); if (client.available()) { Serial.println("[Response:]"); String line = client.readStringUntil('\n'); Serial.println(line); ....... }