• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Spiffs разная скорость на разных объемах

Junkie

Member
Читаю один и тот же файл, и при разных конфигурациях всегда разная скорость
Код:
4m   3s  155ms
4m   2s  104ms
4m   1s   52ms
2m   1s   53ms
1m   512s 29ms
1m   256s 21ms
1m   192s 17ms
512m 128s 12ms
можно ли как-то настроить чтобы на 3мб системе читало так же быстро как на 128к ? а то скорость получается в 10 раз отличается
 

Junkie

Member
почитал другие темы, вроде пишут что с помощью spi_flash_write и spi_flash_read все быстрее работает,
может кто делал на этих командах аналог spiffs? только никакой фрагментации у меня бы не предусматривалось, допустим я разбиваю просто память кусками по 64кб и туда пишу данные, допустим их будет 10 штук для начала, и все управление в какую из 10 областей я хочу записать или считать пока буду выбирать вручную, потом может сделаю таблицу файлов, чтоб там было имя и адрес начала, проблема в том что
Код:
void handleFileUpload() {
  digitalWrite(led, 0);
  HTTPUpload& upload = server.upload();
  if (upload.status == UPLOAD_FILE_START) {
    String filename = upload.filename;
    if (!filename.startsWith("/")) {
      filename = "/" + filename;
    }
    Serial.print("handleFileUpload Name: "); Serial.println(filename);
    fsUploadFile = SPIFFS.open(filename, "w");
    filename = String();
  } else if (upload.status == UPLOAD_FILE_WRITE) {
    if (fsUploadFile) {
      fsUploadFile.write(upload.buf, upload.currentSize);
    }
  } else if (upload.status == UPLOAD_FILE_END) {
    if (fsUploadFile) {
      fsUploadFile.close();
    }
    Serial.print("handleFileUpload Size: "); Serial.println(upload.totalSize);
    String upmsg = "<a href='/files'>back</a><br>";
    upmsg += "<span>handleFileUpload Name: " + upload.filename + "</span><br>";
    upmsg += "<span>handleFileUpload Size: " + String(upload.totalSize) + "</span><br>";
    server.send(200, "text/html", upmsg);
  }
  digitalWrite(led, 1);
}
в этой функции upload.buf это массив char, а spi_flash_write принимает uint32_t, то есть как раз данные идут порциями по 2048 чаров, что будет 512 уитов32 или как я понял аккурат одна страница флеша. вопрос как этот буфер записать?
 

Junkie

Member
Код:
uint16_t sct = 0x7c;
int bufn = 0;
uint32_t mybuf[1024];
int tsize = 0;

void handleFileUpload() {
  digitalWrite(led, 0);
  HTTPUpload& upload = server.upload();
  int o;
  if (upload.status == UPLOAD_FILE_START) {
    String filename = upload.filename;
    Serial.print("handleFileUpload Name: "); Serial.println(filename);
  } else if (upload.status == UPLOAD_FILE_WRITE) {
    if(bufn==0){
      memset(mybuf,0,sizeof(mybuf));
      memcpy(mybuf,upload.buf,upload.currentSize);
      bufn=1;
      if(upload.currentSize<2048){
        spi_flash_erase_sector(sct);
        spi_flash_write(sct * SPI_FLASH_SEC_SIZE, mybuf, sizeof(mybuf));
        Serial.println("write last "+String(upload.currentSize,DEC)+" bytes to "+String(sct,HEX));
      }
    } else {
      memcpy(mybuf+512,upload.buf,upload.currentSize);
      spi_flash_erase_sector(sct);
      spi_flash_write(sct * SPI_FLASH_SEC_SIZE, mybuf, sizeof(mybuf));
      sct += 1;
      bufn=0;
      if(upload.currentSize<2048)
        Serial.println("write last "+String(2048+upload.currentSize,DEC)+" bytes to "+String(sct,HEX));
      else
        Serial.println("write "+String(2048+upload.currentSize,DEC)+" bytes to "+String(sct,HEX));
    }
  } else if (upload.status == UPLOAD_FILE_END) {
    sct = 0x7c;
    bufn = 0;
    Serial.print("handleFileUpload Size: "); Serial.println(upload.totalSize);
    String upmsg = "<a href='/'>back</a><br>";
    upmsg += "<span>handleFileUpload Name: " + upload.filename + "</span><br>";
    upmsg += "<span>handleFileUpload Size: " + String(upload.totalSize) + "</span><br>";
    server.send(200, "text/html", upmsg);
  }
  digitalWrite(led, 1);
}
сделал буфер на 1 сектор (вроде как) туда копирую по два куска из пришедших по веб, и пишу на флешку, пытаюсь разобраться хотя бы с одним файлом, пока получилось так, не знаю как понять что это конец передачи если у меня файл будет кратен 2048 байт, и теперь вроде все записалось, но как мне проверить результат? есть функция server.streamFile но это для файлов из spiffs, как мне отдать файл браузеру читая сектора?
 

Junkie

Member
Код:
const int bufs = 4096;
char buf[bufs];

void handleRead() {
  digitalWrite(led, 0);
  server.sendHeader("Content-Type", "img/jpg");
  server.sendHeader("Content-Length", (String)tsize);
  long total = 0;
  for(long s=0; s<=tsize;s+=4096){
    spi_flash_read(sct * SPI_FLASH_SEC_SIZE, mybuf, sizeof(mybuf));
    memset(buf,0,sizeof(buf));
    memcpy(buf,mybuf,4096);
    server.sendContent_P(buf, 4096);
    sct += 1;
    total += 4096;
  }
  if(total<tsize){
    spi_flash_read(sct * SPI_FLASH_SEC_SIZE, mybuf, sizeof(mybuf));
    memset(buf,0,sizeof(buf));
    memcpy(buf,mybuf,4096);
    server.sendContent_P(buf, tsize-total);
  }
  sct = 0x7c;
  digitalWrite(led, 1);
}
отправка так заработала, вроде реально быстро, все огонь, может только у кого будут идеи по контролю длины файла для записи
 
Сверху Снизу