// BLEClient.cpp
#include "BLEClient.h"
#include <Arduino.h>
// 静态成员定义
bool BLEClientHandler::doConnect[MAX_SLAVES] = {false};
BLEAddress* BLEClientHandler::pServerAddress[MAX_SLAVES] = {nullptr};
BLEClient* BLEClientHandler::pClient[MAX_SLAVES] = {nullptr};
BLEClientHandler* BLEClientHandler::instance = nullptr;
BLEClientHandler* BLEClientHandler::getInstance() {
if (instance == nullptr) {
instance = new BLEClientHandler();
}
return instance;
}
BLEClientHandler::BLEClientHandler() {
instance = this;
for (int i = 0; i < MAX_SLAVES; ++i) {
pServerAddress[i] = nullptr;
pClient[i] = nullptr;
doConnect[i] = false;
}
}
BLEClientHandler::~BLEClientHandler() {
for (int i = 0; i < MAX_SLAVES; ++i) {
if (pServerAddress[i]) {
delete pServerAddress[i];
pServerAddress[i] = nullptr;
}
if (pClient[i] && !pClient[i]->isConnected()) {
delete pClient[i];
pClient[i] = nullptr;
}
}
}
void BLEClientHandler::begin() {
//Serial.println("初始化 BLE 主机并开始扫描...");
BLEDevice::init("");
BLEScan* pScan = BLEDevice::getScan();
pScan->setAdvertisedDeviceCallbacks(new AdvertisedDeviceCallbacks(this));
pScan->setActiveScan(true);
pScan->start(5, false); // 扫描 5 秒
}
void BLEClientHandler::AdvertisedDeviceCallbacks::onResult(BLEAdvertisedDevice advertisedDevice) {
std::string name = advertisedDevice.getName();
int slave_id = -1;
if (name.rfind("GMD1032-Slave-", 0) == 0) {
char c = name[14];
if (c >= '0' && c <= '6') {
slave_id = c - '0';
}
}
if (slave_id < 0 || slave_id >= MAX_SLAVES) return;
if (advertisedDevice.isAdvertisingService(BLEUUID(SERVICE_UUID))) {
if (pHandler->pServerAddress[slave_id] != nullptr) {
return; // 已发现
}
pHandler->pServerAddress[slave_id] = new BLEAddress(advertisedDevice.getAddress());
pHandler->doConnect[slave_id] = true;
Serial.printf("发现从板 %d: %s\n", slave_id, advertisedDevice.getAddress().toString().c_str());
}
}
void BLEClientHandler::ClientCallback::onConnect(BLEClient* client) {
Serial.println("BLE 连接成功");
}
void BLEClientHandler::ClientCallback::onDisconnect(BLEClient* client) {
Serial.println("与从机断开连接,准备重连...");
for (int i = 0; i < MAX_SLAVES; ++i) {
if (pHandler->pClient[i] == client) {
pHandler->doConnect[i] = true; // 标记为可重连
break;
}
}
}
void BLEClientHandler::notifyCallback(BLERemoteCharacteristic* pChar, uint8_t* pData, size_t length, bool isNotify) {
Serial.printf("收到 BLE 数据包!长度 = %u 字节: ", length);
for (int i = 0; i < length; ++i) {
Serial.printf("%02X ", pData[i]);
}
Serial.println();
if (length != 35) {
Serial.printf("数据长度错误!期望 35,实际 %u\n", length);
return;
}
uint8_t slave_id = pData[34];
if (slave_id >= MAX_SLAVES) {
Serial.printf("无效 Slave ID: %d\n", slave_id);
return;
}
uint16_t cellRaw[16];
uint16_t dieTempRaw;
for (int i = 0; i < 16; ++i) {
cellRaw[i] = (pData[i * 2] << 8) | pData[i * 2 + 1];
}
dieTempRaw = (pData[32] << 8) | pData[33];
::process_battery_raw(slave_id, cellRaw, dieTempRaw);
}
bool BLEClientHandler::isConnected(uint8_t slave_id) const {
return pClient[slave_id] != nullptr && pClient[slave_id]->isConnected();
}
void BLEClientHandler::disconnect(uint8_t slave_id) {
if (pClient[slave_id] && pClient[slave_id]->isConnected()) {
pClient[slave_id]->disconnect();
Serial.printf("已断开从板 %d\n", slave_id);
}
}
// 实现:访问私有成员的安全接口
bool BLEClientHandler::shouldConnect(uint8_t slave_id) {
if (slave_id >= MAX_SLAVES) return false;
return doConnect[slave_id];
}
bool BLEClientHandler::hasDiscovered(uint8_t slave_id) {
if (slave_id >= MAX_SLAVES) return false;
return pServerAddress[slave_id] != nullptr;
}
void BLEClientHandler::requestReconnect(uint8_t slave_id) {
if (slave_id >= MAX_SLAVES) return;
doConnect[slave_id] = true;
}
// 主循环逻辑
void BLEClientHandler::loop() {
for (int id = 0; id < MAX_SLAVES; ++id) {
if (!doConnect[id] || pServerAddress[id] == nullptr) continue;
Serial.printf("正在连接从板 %d: %s\n", id, pServerAddress[id]->toString().c_str());
pClient[id] = BLEDevice::createClient();
pClient[id]->setClientCallbacks(new ClientCallback(this));
bool connected = pClient[id]->connect(*pServerAddress[id]);
if (connected) {
Serial.printf("从板 %d 连接成功\n", id);
pClient[id]->setMTU(256);
delay(100);
BLERemoteService* pRemoteService = pClient[id]->getService(BLEUUID(SERVICE_UUID));
if (!pRemoteService) {
Serial.printf("从板 %d 未发现服务\n", id);
delete pClient[id]; pClient[id] = nullptr;
doConnect[id] = true;
delay(5000);
continue;
}
BLERemoteCharacteristic* pRemoteCharacteristic = pRemoteService->getCharacteristic(BLEUUID(CHARACTERISTIC_UUID));
if (!pRemoteCharacteristic) {
Serial.printf("从板 %d 未发现特征值\n", id);
delete pClient[id]; pClient[id] = nullptr;
doConnect[id] = true;
delay(5000);
continue;
}
if (pRemoteCharacteristic->canNotify()) {
pRemoteCharacteristic->registerForNotify(notifyCallback);
BLERemoteDescriptor* pCCC = pRemoteCharacteristic->getDescriptor(BLEUUID((uint16_t)0x2902));
if (pCCC != nullptr) {
uint8_t notifyOn[] = {0x01, 0x00};
pCCC->writeValue(notifyOn, sizeof(notifyOn), false);
Serial.println("CCCD 已写入 0x0100,启用 Notify");
} else {
Serial.println("无法获取 CCCD 描述符!");
}
Serial.printf("从板 %d 已启用 Notify\n", id);
}
doConnect[id] = false;
} else {
Serial.printf("从板 %d 连接失败\n", id);
delete pClient[id]; pClient[id] = nullptr;
delete pServerAddress[id]; pServerAddress[id] = nullptr;
doConnect[id] = true;
delay(5000);
}
}
}
// main.cpp
#include "main.h"
#include <WiFi.h>
#include "esp_uart_driver.h"
#include "uart_msg_analy.h"
#include "network_app.h"
#include "spi_slave_server.h"
#include "BLEClient.h"
// 共享数据区
uint8_t g_raw_battery_bytes[MAX_SLAVES][34] = {0};
size_t g_raw_battery_len[MAX_SLAVES] = {0};
portMUX_TYPE raw_data_mutex_array[MAX_SLAVES] = {};
extern "C" void init_raw_data_mutexes() {
for (int i = 0; i < MAX_SLAVES; ++i) {
raw_data_mutex_array[i] = portMUX_INITIALIZER_UNLOCKED;
}
}
// 处理电池原始数据
void process_battery_raw(uint8_t slave_id, const uint16_t cell[16], uint16_t die_temp) {
if (slave_id >= MAX_SLAVES) return;
Serial.printf("[BLE] 收到从板 %d 的原始数据: cell[0]=%u, die_temp=%u\n", slave_id, cell[0], die_temp);
portENTER_CRITICAL(&raw_data_mutex_array[slave_id]);
for (int i = 0; i < 16; i++) {
g_raw_battery_bytes[slave_id][i * 2] = (cell[i] >> 8) & 0xFF;
g_raw_battery_bytes[slave_id][i * 2 + 1] = cell[i] & 0xFF;
}
g_raw_battery_bytes[slave_id][32] = (die_temp >> 8) & 0xFF;
g_raw_battery_bytes[slave_id][33] = die_temp & 0xFF;
g_raw_battery_len[slave_id] = 34;
Serial.printf("[BLE] 已保存数据到 g_raw_battery_bytes[%d],长度设为 %zu\n", slave_id, g_raw_battery_len[slave_id]);
portEXIT_CRITICAL(&raw_data_mutex_array[slave_id]);
}
#define UART1_TX_PIN 4
#define UART1_RX_PIN 5
BLEClientHandler* pBLE = nullptr;
// 使用公共接口打印状态(不再访问 private 成员)
void print_ble_status() {
static uint32_t last_print = 0;
if (millis() - last_print > 5000) {
last_print = millis();
for (int i = 0; i < MAX_SLAVES; ++i) {
if (pBLE && pBLE->isConnected(i)) { // 使用 pBLE 指针
Serial.printf("从板 %d: 在线\n", i);
} else if (BLEClientHandler::shouldConnect(i)) {
Serial.printf("从板 %d: 待连接/重连\n", i);
} else if (BLEClientHandler::hasDiscovered(i)) {
Serial.printf("从板 %d: 已发现地址\n", i);
}
}
}
}
void setup() {
Serial.begin(115200);
delay(100);
uart0_init(115200, (void *)0);
uart1_init(115200, UART1_RX_PIN, UART1_TX_PIN, (void *)uart1_msg_analy);
esp_random();
init_raw_data_mutexes();
// === 临时注入测试数据 ===
for (int id = 0; id < MAX_SLAVES; ++id) {
for (int i = 0; i < 34; ++i) {
g_raw_battery_bytes[id][i] = i + id * 10; // 不同 id 不同模式
}
g_raw_battery_len[id] = 34;
}
// ========================
spi_slave_server_init();
pBLE = BLEClientHandler::getInstance();
if (pBLE) {
pBLE->begin();
} else {
Serial.println("无法创建 BLEClientHandler实例");
}
}
void loop() {
uart_process();
// 调用 loop
if (pBLE) {
pBLE->loop();
}
static uint32_t last_scan_time = 0;
if (millis() - last_scan_time > 5000) {
Serial.println("开始新一轮 BLE 扫描...");
BLEDevice::getScan()->clearResults();
BLEDevice::getScan()->start(5, false);
last_scan_time = millis();
}
//print_ble_status();
delay(1000);
}
boolean doDelayMillisTime(uint32_t interval, uint32_t *previousMillis, boolean state) {
uint32_t currentMillis = (uint32_t)SYSTEM_TIMER_MS();
if (currentMillis - *previousMillis >= interval) {
*previousMillis = currentMillis;
state = !state;
}
return state;
}
void printf_log_hex(char *hex_name, uint8_t *data, uint32_t len) {
Serial.printf("%s ,len is:%d \r\n", hex_name, len);
for (int i = 0; i < len; i++) {
Serial.printf("%02x ", data[i]);
}
Serial.printf("\r\n");
}
// spi_slave_server.cpp
#include "spi_slave_server.h"
#include <string.h>
#include <SPI.h>
#include <ESP32SPISlave.h>
ESP32SPISlave slave;
#define SPI_SLAVE_ENABLE 1
#define MY_CS 12
#define MY_SCK 13
#define MY_MOSI 14
#define MY_MISO 11
#define SPI_READ_TIMEOUT 999999
static constexpr size_t SPI_BUFFER_SIZE = 64;
static uint8_t spi_tx_buf[SPI_BUFFER_SIZE];
static uint8_t spi_rx_buf[SPI_BUFFER_SIZE];
static volatile uint8_t current_slave_id = 0;
// 缓存区(用于存放待发送的原始数据)
static volatile uint8_t spi_tx_cache_buf[1024];
static volatile int spi_tx_cache_buf_cnt = 0;
// 上一次命令(调试用)
static uint8_t last_received_cmd = 0xFF;
#define DEBUG_SPI_SLAVE
/**
* @brief 添加数据到 SPI 发送缓存(保留原函数)
*/
int spi_slave_data_cache_add(uint8_t *data, uint16_t len)
{
if (len > 1024) len = 1024;
for (int i = 0; i < len; ++i) {
spi_tx_cache_buf[i] = data[i];
}
spi_tx_cache_buf_cnt = len;
return 0;
}
void prepare_response_packet() {
memset(spi_tx_buf, 0, SPI_BUFFER_SIZE);
// 设置新的响应格式: 00 00 AA BB 00 <slave_id> [34 bytes]
spi_tx_buf[0] = 0x00; // 帧头
spi_tx_buf[1] = 0x00; // 帧头
spi_tx_buf[2] = 0xAA; // 帧头
spi_tx_buf[3] = 0xBB; // 帧头
spi_tx_buf[4] = 0x00; // 保留字节(可后续扩展用途)
spi_tx_buf[5] = current_slave_id; // 从板编号 → 放在第6个字节
extern uint8_t g_raw_battery_bytes[8][34];
extern size_t g_raw_battery_len[8];
extern portMUX_TYPE raw_data_mutex_array[8];
portENTER_CRITICAL(&raw_data_mutex_array[current_slave_id]);
Serial.printf("[SPI] 当前请求 slave_id=%d, g_raw_battery_len[%d]=%zu\n",
current_slave_id, current_slave_id, g_raw_battery_len[current_slave_id]);
if (g_raw_battery_len[current_slave_id] >= 34) {
memcpy(&spi_tx_buf[6], g_raw_battery_bytes[current_slave_id], 34);
} else {
memset(&spi_tx_buf[6], 0, 34);
Serial.printf("[SPI] 数据无效,填充0\n");
}
portEXIT_CRITICAL(&raw_data_mutex_array[current_slave_id]);
}
static void spi_slave_task(void *pvParameters) {
size_t received_bytes;
// 初始化第一包,默认返回 slave_id=0 数据
current_slave_id = 0;
prepare_response_packet();
while (true) {
if (digitalRead(MY_CS) == LOW) {
memset(spi_rx_buf, 0, SPI_BUFFER_SIZE);
// 1. 使用当前 prepared 的 spi_tx_buf 发送(即上一轮准备好的)
// 同时接收主机命令
received_bytes = slave.transfer(spi_tx_buf, spi_rx_buf, SPI_BUFFER_SIZE, SPI_READ_TIMEOUT);
bool cmd_valid = false;
uint8_t next_slave_id = current_slave_id; // 默认保持不变
uint8_t last_cmd = 0; // ← 提前声明,用于调试输出
// 2. 解析刚收到的命令
if (received_bytes > 0 && spi_rx_buf[0] == 0xAA) {
uint8_t cmd = spi_rx_buf[1];
if (cmd < MAX_SLAVES) {
next_slave_id = cmd;
cmd_valid = true;
last_cmd = cmd; // 保存副本供外部使用
}
}
// 3. 立即准备“下一次”通信要用的响应包
current_slave_id = next_slave_id;
prepare_response_packet();
#ifdef DEBUG_SPI_SLAVE
if (cmd_valid) {
Serial.printf("SPI: 收到命令 AA %02X, 下次将返回 slave_id=%d 数据\n", last_cmd, next_slave_id);
}
#endif
} else {
vTaskDelay(10);
}
vTaskDelay(1);
}
}
void spi_slave_server_init(void) {
#if SPI_SLAVE_ENABLE
slave.setDataMode(SPI_MODE3);
slave.setQueueSize(1);
slave.begin(HSPI, MY_SCK, MY_MISO, MY_MOSI, MY_CS);
xTaskCreate(spi_slave_task, "spi_slave_task", 8192, NULL, 2, NULL);
Serial.println("SPI Slave 已启动");
#endif
}
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x1 (POWERON),boot:0x28 (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce3808,len:0x4bc
load:0x403c9700,len:0xbd8
load:0x403cc700,len:0x2a0c
entry 0x403c98d0
uart1_init... baud_rate=115200,rx= 5,tx= 4
SPI Slave 已启动
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
发现从板 2: b8:f8:62:c8:b4:dd
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
正在连接从板 2: b8:f8:62:c8:b4:dd
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
BLE 连��成功
从板 2 连接成功
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
[SPI] 当前请求 slave_id=0, g_raw_battery_len[0]=34
CCCD 已写入 0x0100,启用 Notify
从板 2 已启用 Notify
开始新一轮 BLE 扫描...
收到 BLE 数据包!长度 = 35 字节: 9C C3 B3 78 9B 42 B3 E3 9B A6 B4 37 77 3B 42 45 1A F6 2B D7 26 39 22 0A 26 17 1F 89 22 3E 04 FGuru Meditation Error: Core 0 panic'ed (Interrupt wdt timeout on CPU0).
Core 0 register dump:
PC : 0x40381c4a PS : 0x00060034 A0 : 0x80380992 A1 : 0x3fcf6d10
A2 : 0x3fcec09c A3 : 0x3fcedf14 A4 : 0x00000000 A5 : 0x00060023
A6 : 0x00060023 A7 : 0x00000001 A8 : 0x3fcedf14 A9 : 0x00000017
A10 : 0x3fcedf14 A11 : 0x00000017 A12 : 0x00000000 A13 : 0x00060023
A14 : 0x02c98020 A15 : 0x00ffffff SAR : 0x00000004 EXCCAUSE: 0x00000005
EXCVADDR: 0x00000000 LBEG : 0x400556d5 LEND : 0x400556e5 LCOUNT : 0xffffffff
Backtrace: 0x40381c47:0x3fcf6d10 0x4038098f:0x3fcf6d30 0x4037fc72:0x3fcf6d50 0x4200a80e:0x3fcf6d90 0x420095d9:0x3fcf6db0 0x42009aa7:0x3fcf6dd0 0x42003ae5:0x3fcf6e70 0x42003bb1:0x3fcf6e90
Core 1 register dump:
PC : 0x400570ea PS : 0x00060036 A0 : 0x820151d0 A1 : 0x3fcf4a40
A2 : 0x3fcf4a5c A3 : 0x00000000 A4 : 0x00000024 A5 : 0x3fcf4a5c
A6 : 0x00000001 A7 : 0x00000002 A8 : 0x00000001 A9 : 0x00000020
A10 : 0x3fc9f544 A11 : 0x00000000 A12 : 0x00000010 A13 : 0xbaad5678
A14 : 0x00060720 A15 : 0x00000001 SAR : 0x0000000e EXCCAUSE: 0x00000001
EXCVADDR: 0x00000000 LBEG : 0x400570e8 LEND : 0x400570f3 LCOUNT : 0x00000001
Backtrace: 0x400570e7:0x3fcf4a40 0x420151cd:0x3fcf4a50 0x4037726d:0x3fcf4aa0 0x40376bfc:0x3fcf4ac0 0x00040022:0x3fcf4b80 |<-CORRUPTED
ELF file SHA256: 3ff7fe5e2be6df45
Guru Meditation Error: Core 1 panic'ed (Unhandled debug exception).
Debug exception reason: Stack canary watchpoint triggered (IDLE1)
Core 1 register dump:
PC : 0x400570ea PS : 0x00060036 A0 : 0x820151d0 A1 : 0x3fcf4a40
A2 : 0x3fcf4a5c A3 : 0x00000000 A4 : 0x00000024 A5 : 0x3fcf4a5c
A6 : 0x00000001 A7 : 0x00000002 A8 : 0x00000001 A9 : 0x00000020
A10 : 0x3fc9f544 A11 : 0x00000000 A12 : 0x00000010 A13 : 0xbaad5678
A14 : 0x00060720 A15 : 0x00000001 SAR : 0x0000000e EXCCAUSE: 0x00000001
EXCVADDR: 0x00000000 LBEG : 0x400570e8 LEND : 0x400570f3 LCOUNT : 0x00000001
Backtrace: 0x400570e7:0x3fcf4a40 0x420151cd:0x3fcf4a50 0x4037726d:0x3fcf4aa0 0x40376bfc:0x3fcf4ac0 0x00040022:0x3fcf4b80 |<-CORRUPTED
Core 0 register dump:
PC : 0x403866f7 PS : 0x00020534 A0 : 0x82076e16 A1 : 0x3fcf6b20
A2 : 0x00020523 A3 : 0xa5a5a5a5 A4 : 0x82076e16 A5 : 0x00060525
A6 : 0xfffbfff0 A7 : 0x00000046 A8 : 0x3fc989b8 A9 : 0x00000001
A10 : 0x60000000 A11 : 0x00000001 A12 : 0x0000000a A13 : 0x3fcf6b0c
A14 : 0x00000001 A15 : 0x3fcf4b80 SAR : 0x0000000a EXCCAUSE: 0x00000005
EXCVADDR: 0x00000000 LBEG : 0x400570e8 LEND : 0x400570f3 LCOUNT : 0x00000000
Backtrace: 0x403866f4:0x3fcf6b20 0x42076e13:0x3fcf6b30 0x42077415:0x3fcf6b50 0x42014ff6:0x3fcf6b70 0x420152f6:0x3fcf6be0 0x4037726d:0x3fcf6c30 0x40376bfc:0x3fcf6c50 0x00040022:0x3fcf6d10 |<-CORRUPTED
ELF file SHA256: 3ff7fe5e2be6df45
Re-entered core dump! Exception happened during core dump!
Rebooting...