// PSRAM에 Queue 버퍼 할당 uint8_t *canQueueStorage = nullptr; uint8_t *serialQueueStorage = nullptr; StaticQueue_t canQueueBuffer; StaticQueue_t serialQueueBuffer; bool allocateQueueBuffers() { // CAN Queue 버퍼 (PSRAM) size_t canQueueSize = CAN_QUEUE_SIZE * sizeof(CANMessage); canQueueStorage = (uint8_t*)heap_caps_malloc(canQueueSize, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); if (canQueueStorage == nullptr) { Serial.println("✗ CAN Queue 버퍼 할당 실패!"); return false; } // Serial Queue 버퍼 (PSRAM) size_t serialQueueSize = SERIAL_QUEUE_SIZE * sizeof(SerialMessage); serialQueueStorage = (uint8_t*)heap_caps_malloc(serialQueueSize, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); if (serialQueueStorage == nullptr) { Serial.println("✗ Serial Queue 버퍼 할당 실패!"); heap_caps_free(canQueueStorage); return false; } Serial.printf("✓ CAN Queue 버퍼: %.1f KB (PSRAM)\n", canQueueSize / 1024.0); Serial.printf("✓ Serial Queue 버퍼: %.1f KB (PSRAM)\n", serialQueueSize / 1024.0); return true; } // Queue 생성 (PSRAM 버퍼 사용) void createQueues() { canQueue = xQueueCreateStatic( CAN_QUEUE_SIZE, // Queue 길이 sizeof(CANMessage), // 아이템 크기 canQueueStorage, // PSRAM 버퍼 &canQueueBuffer // 정적 Queue 구조체 ); serialQueue = xQueueCreateStatic( SERIAL_QUEUE_SIZE, sizeof(SerialMessage), serialQueueStorage, &serialQueueBuffer ); if (canQueue == NULL || serialQueue == NULL) { Serial.println("✗ Queue 생성 실패!"); while (1) delay(1000); } Serial.println("✓ Queue 생성 완료 (PSRAM)"); }