• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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);
}
отправка так заработала, вроде реально быстро, все огонь, может только у кого будут идеи по контролю длины файла для записи
 
Сверху Снизу