sd카드 플러쉬 횟수 감소
This commit is contained in:
@@ -1421,8 +1421,9 @@ void canRxTask(void *parameter) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 메시지 읽기
|
// 메시지 배치 읽기 (한 번에 최대 20개 처리)
|
||||||
while (mcp2515.readMessage(&frame) == MCP2515::ERROR_OK) {
|
int batchCount = 0;
|
||||||
|
while (batchCount < 20 && mcp2515.readMessage(&frame) == MCP2515::ERROR_OK) {
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
// 🎯 Auto Trigger 체크
|
// 🎯 Auto Trigger 체크
|
||||||
checkAutoTriggers(frame);
|
checkAutoTriggers(frame);
|
||||||
@@ -1433,9 +1434,15 @@ void canRxTask(void *parameter) {
|
|||||||
msg.dlc = frame.can_dlc;
|
msg.dlc = frame.can_dlc;
|
||||||
memcpy(msg.data, frame.data, 8);
|
memcpy(msg.data, frame.data, 8);
|
||||||
|
|
||||||
if (xQueueSend(canQueue, &msg, pdMS_TO_TICKS(10)) == pdTRUE) {
|
if (xQueueSend(canQueue, &msg, 0) == pdTRUE) { // ⭐ 타임아웃 10ms → 0 (블로킹 제거)
|
||||||
totalMsgCount++;
|
totalMsgCount++;
|
||||||
}
|
}
|
||||||
|
batchCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 배치 처리 후 짧은 yield (다른 Task에 CPU 양보)
|
||||||
|
if (batchCount == 0) {
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1501,36 +1508,14 @@ void sdWriteTask(void *parameter) {
|
|||||||
currentFileSize += lineLen;
|
currentFileSize += lineLen;
|
||||||
|
|
||||||
static int csvFlushCounter = 0;
|
static int csvFlushCounter = 0;
|
||||||
if (++csvFlushCounter >= 50) { // ⭐ 20 → 50 (너무 자주 플러시하면 느림)
|
if (++csvFlushCounter >= 500) { // ⭐ 200 → 500 (최대 성능)
|
||||||
logFile.flush();
|
logFile.flush();
|
||||||
csvFlushCounter = 0;
|
csvFlushCounter = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ⭐⭐⭐ 2000개마다 파일 재오픈 (500 → 2000 변경, SDIO 안정성)
|
// ⭐⭐⭐ 파일 재오픈 제거 (고부하 환경 최적화)
|
||||||
if (++csvReopenCounter >= 2000) {
|
// if (++csvReopenCounter >= 2000) { ... } // 제거됨
|
||||||
logFile.close();
|
|
||||||
delay(50); // SD 카드 안정화 대기
|
|
||||||
|
|
||||||
// 파일 재오픈 (재시도 로직)
|
|
||||||
bool reopenSuccess = false;
|
|
||||||
for (int retry = 0; retry < 3; retry++) {
|
|
||||||
logFile = SD_MMC.open(currentFilename, FILE_APPEND);
|
|
||||||
if (logFile) {
|
|
||||||
Serial.printf("✓ CSV 파일 재오픈: %s (%lu bytes)\n", currentFilename, currentFileSize);
|
|
||||||
reopenSuccess = true;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
Serial.printf("⚠ CSV 파일 재오픈 실패, 재시도 %d/3\n", retry + 1);
|
|
||||||
delay(100); // 재시도 전 대기
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!reopenSuccess) {
|
|
||||||
Serial.println("✗ CSV 파일 재오픈 완전 실패! 로깅 중지");
|
|
||||||
loggingEnabled = false;
|
|
||||||
}
|
|
||||||
csvReopenCounter = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1555,8 +1540,8 @@ void sdWriteTask(void *parameter) {
|
|||||||
binMsgCounter++;
|
binMsgCounter++;
|
||||||
binReopenCounter++;
|
binReopenCounter++;
|
||||||
|
|
||||||
// ⭐⭐⭐ 3단계: 100개 메시지마다 주기적 플러시
|
// ⭐⭐⭐ 3단계: 1000개 메시지마다 주기적 플러시 (500→1000, 최대 성능)
|
||||||
if (binMsgCounter % 100 == 0) {
|
if (binMsgCounter % 1000 == 0) {
|
||||||
if (logFile && bufferIndex > 0) {
|
if (logFile && bufferIndex > 0) {
|
||||||
size_t written = logFile.write(fileBuffer, bufferIndex);
|
size_t written = logFile.write(fileBuffer, bufferIndex);
|
||||||
logFile.flush();
|
logFile.flush();
|
||||||
@@ -1565,40 +1550,11 @@ void sdWriteTask(void *parameter) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ⭐⭐⭐ 4단계: 2000개마다 파일 재오픈 (500 → 2000 변경, SDIO 안정성)
|
// ⭐⭐⭐ 4단계: 파일 재오픈 제거 (고부하 환경 최적화)
|
||||||
if (binReopenCounter >= 2000) {
|
// 재오픈 시 SD 카드 블록으로 인한 오버플로우 방지
|
||||||
// 버퍼 먼저 플러시
|
// 대신 주기적 flush로 데이터 안정성 확보
|
||||||
if (logFile && bufferIndex > 0) {
|
// if (binReopenCounter >= 2000) { ... } // 제거됨
|
||||||
logFile.write(fileBuffer, bufferIndex);
|
|
||||||
logFile.flush();
|
|
||||||
bufferIndex = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 파일 닫기
|
|
||||||
logFile.close();
|
|
||||||
delay(50); // SD 카드 안정화 대기
|
|
||||||
|
|
||||||
// 파일 재오픈 (재시도 로직)
|
|
||||||
bool reopenSuccess = false;
|
|
||||||
for (int retry = 0; retry < 3; retry++) {
|
|
||||||
logFile = SD_MMC.open(currentFilename, FILE_APPEND);
|
|
||||||
if (logFile) {
|
|
||||||
Serial.printf("✓ BIN 파일 재오픈: %s (%lu bytes)\n", currentFilename, currentFileSize);
|
|
||||||
reopenSuccess = true;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
Serial.printf("⚠ BIN 파일 재오픈 실패, 재시도 %d/3\n", retry + 1);
|
|
||||||
delay(100); // 재시도 전 대기
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!reopenSuccess) {
|
|
||||||
Serial.println("✗ BIN 파일 재오픈 완전 실패! 로깅 중지");
|
|
||||||
loggingEnabled = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
binReopenCounter = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
xSemaphoreGive(sdMutex);
|
xSemaphoreGive(sdMutex);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user