|
SD card и Real-Time |
|
|
|
Nov 16 2012, 12:59
|
Группа: Новичок
Сообщений: 9
Регистрация: 16-11-12
Пользователь №: 74 411

|
Добрый вечер.
Есть задача писать: писать на SD card данные, поступающие через uart. По uart каждые 30 мс поступает по 40 байт. SD card (размер 2 Гб) поключил через SDIO. Плата stm32f407 discovery. На плате реализую fat.
код
while(count < 300) { count++; res = f_write(&fil, Buff2, 4096, &BytesWritten); }
работает. Пишу на карту любые объёмы.
Проблемы начинаются при записи данных из uart в реальном времени.
В USART3_IRQHandler данные пишу поперенно в два буфера. Размер буферов брал от 512 байт до 32 кбайт. В основном цикле попеременно вызываю функцию f_write() для передачи того буфера, в который данные в данный момент не пишем.
Функция f_write возвращает res_ok, BytesWritten возвращает 4096. На карте появляется файл, но его объём 0 байт и в нём нет никаких данных. Кто-нибудь сталкивался с похожей проблемой?
|
|
|
|
|
Nov 16 2012, 13:18
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(Sergey_rzn62 @ Nov 16 2012, 16:59)  Функция f_write возвращает res_ok, BytesWritten возвращает 4096. На карте появляется файл, но его объём 0 байт и в нём нет никаких данных. Кто-нибудь сталкивался с похожей проблемой? Как вариант: вызывать f_sync после f_write.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Nov 16 2012, 14:45
|
Группа: Новичок
Сообщений: 9
Регистрация: 16-11-12
Пользователь №: 74 411

|
Поставил после res = f_write(&fil, Buff2, BufSize, &BytesWritten); res = f_sync (&fil);
данные на SD card в текстовом файле появились. Но интересная особенность, сколько бы не записывал буферов на карту, объём текстового файла всегда один: около 5 кБайт.
И ещё вопрос. Важен ли приоритет прерываний у SDIO_IRQn, SD_SDIO_DMA_IRQn, USART3_IRQn.
У SDIO_IRQn поставил 3, у SD_SDIO_DMA_IRQn поставил 5, USART3_IRQn поставил 0
|
|
|
|
|
Nov 16 2012, 17:14
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757

|
QUOTE (Sergey_rzn62 @ Nov 16 2012, 17:45)  данные на SD card в текстовом файле появились. Но интересная особенность, сколько бы не записывал буферов на карту, объём текстового файла всегда один: около 5 кБайт. Наверно после открытия существующего файла надо ставить указатель в конец файла (там есть функция f_lseek).
Сообщение отредактировал Chameleon - Nov 16 2012, 17:15
|
|
|
|
|
Nov 17 2012, 19:07
|
Группа: Новичок
Сообщений: 9
Регистрация: 16-11-12
Пользователь №: 74 411

|
Запускаю:
while(con2++ < 24) { res = f_write(&fil,Buff1,BufSize,&BytesWritten); res = f_lseek(&fil,fil.fsize); } res = f_close(&fil);
Размер буфера BufSize = 32768 До 1 Мбайта данные на карту пишутся. Пытаюсь записать на карту буферов больше, чем 24, размер файла на карте равен 0 и в нём пусто.
Подскажите, в чём может быть проблема?
|
|
|
|
|
Nov 17 2012, 20:06
|
Группа: Новичок
Сообщений: 9
Регистрация: 16-11-12
Пользователь №: 74 411

|
Запускал и с f_lseek() и без - результат один: До 1 Мбайта данные на карту пишутся. Пытаюсь записать на карту буферов больше, чем 24, размер файла на карте равен 0 и в нём пусто.
Не знаю, куда копать.
|
|
|
|
|
Nov 18 2012, 09:48
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(_Pasha @ Nov 17 2012, 13:29)  Т.е. такая штука работать не будет? Будет конечно. Я прошу прощения, думал о f_sync а написал f_lseek, вот его (f_sync), вызывать перед f_close совершенно бессмысленно. После каждого f_write можно, но если пишется не очень большими блоками, то сильно притормозит процесс записи. Цитата(Sergey_rzn62 @ Nov 17 2012, 21:07)  Размер буфера BufSize = 32768 До 1 Мбайта данные на карту пишутся. Пытаюсь записать на карту буферов больше, чем 24, размер файла на карте равен 0 и в нём пусто. Подскажите, в чём может быть проблема? Трудно сказать, я для проверки скорости, писал блоками по 4К вот так: Код res = f_open(&fsrc, "test.dat", FA_CREATE_ALWAYS | FA_WRITE); if(res==FR_OK){ for(i=0; i<6000;i++){ res=f_write(&fsrc, &SDBuffer[0],4096, &bw); } f_close(&fsrc); } И ~24MB писалось нормально. Скорее всего, все зависит от реализации работы с железом в diskio.c и т.п.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|