Я новичок в мире lwip, и я пытаюсь загрузить большой файл с SD-карты. Я работаю над STM32F4 Discovery, мне нужно читать 2 значения температуры каждую секунду и записывать его в файл на SD-карте. Я могу читать и писать в 4-битном режиме SDIO с DMA без каких-либо проблем. Мне тоже нужен веб-сервер, с которого я могу в реальном времени отслеживать эти значения. Поэтому, используя STM32CubeMx V 5.0.1, я просто добавил Middleware Lwip 2.0.3 и настроил его. Я использую Freertos 9.0.0 с одной задачей (на данный момент), чтобы управлять чем-то другим. Я использую API-интерфейс netconn, чтобы предоставить некоторую страницу браузеру и управлять ею. Если мне нужно отправить в браузер маленький файл, который умещается в одном массиве, у меня нет проблем, НО Если мне нужно отправить файл большего размера (1 МБ), то все зависнет. Это моя функция:
#define BUFFER_OUT 1000
static BYTE DownloadBuffer[BUFFER_OUT] __attribute__ ((section(".sdram")));
UINT DownloadCounter, sentCounter;
void log_download(struct netconn *conn, const char* myFileName)
{
FATFS myFatFS;
FRESULT res;
uint archDownCounter = 0;
int sentCounter = 0;
size_t written;
int dx;
err_t test;
FIL myFile;
FILINFO fno;
if (f_mount(&myFatFS,SDPath,1)==FR_OK){
if (f_open(&myFile, myFileName, FA_OPEN_EXISTING | FA_READ) == FR_OK)
{
f_stat(myFileName, &fno);
dx = snprintf(DownloadBuffer, BUFFER_OUT,"HTTP/1.1 200 OK \r\nContent-Type: file/csv\r\nContent-Length: %lu\r\n\r\n", fno.fsize);
netconn_write(conn, (const char* )( DownloadBuffer), (size_t )cx, NETCONN_NOCOPY);
for (;;)
{
if(conn->state == NETCONN_NONE) // check the state
{
res = f_read(&myFile, DownloadBuffer, sizeof DownloadBuffer, &DownloadCounter); /* Read a chunk of source file */
if(DownloadCounter == 0) break; /* error or eof */
test = netconn_write_partly(conn, (const char*) (DownloadBuffer), (size_t) DownloadCounter, NETCONN_MORE, &written);
if (test != ERR_OK) break; /* error or disk full */
if (written != DownloadCounter) break;
vTaskDelay(50); //time for other tasks
}
}
f_close(&myFile);
}
}
}
Поэтому, когда я вызываю netconn_write_partly, плата останавливается. Я гуглил весь интернет и ничего не нашел. Мой вопрос: есть ли способ сделать это? Заранее большое спасибо всем, кто хочет мне помочь.