реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> STM32L4 + SD + DMA + FatFs
Genadi Zawidowsk...
сообщение Jul 28 2017, 22:03
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата
buf структуры FIL не помогает

Я два поля упомянул. Чтобы выравнивание работало, надо и саму структуру (структуры) выровнять. И секцию соответственно в скрипье линкера вырповнять.
Я не боролся с выравниванием для DMA, я решал поблемы с DCache.
Цитата
всё равно FatFs при определённых условиях передаёт в функцию записи блока невыровненный указатель

Детский сад... fatfs в исходниках, ловится и дебажится, я без дебагера полдня возился.

Сообщение отредактировал Genadi Zawidowski - Jul 28 2017, 22:11
Go to the top of the page
 
+Quote Post
Allregia
сообщение Jul 29 2017, 08:22
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(AHTOXA @ Jul 27 2017, 20:43) *
Дело не только и не столько в burst, сколько в пословном доступе к невыровненным данным. Этого, думаю, и L4 не любит.
(FatFs при определённых условиях вызывает функцию записи блока с адресом буфера, не кратным 4).


Так на 4 я выравниваю, я имел ввиду что если нет барста то не надо на 512 выравнивать.
Вообще, когда-то делал на Ф4 с FatFs R0.11 и драйвром от Nemui Trinomius (http://nemuisan.blog.bai.ne.jp)
Проблем не замечал.
А вот с L4 тут напарник занимается, я сильно не влазил, так он уже неделю ковыряется. То что калокуб нагенерил было вообще сразу снесено, им только проверили что железо работает, потом переделали под драйвер от EVAL - хоть поллинг нормально заработал, а с ДМА пока засада, даже на чтении -пишет блоками до 1023 байта, дальше дикс эррор, если дать блок 8К или 16К, как задумывалось изначально, то эррор сразу (это я все пишу со слов напарника).
Мое личное мнение (проверю на след. неделе), что он не делает, илиделает не правильно, какую-нибудь из проверок.

У меня disk_read выглядел так:

Код
DRESULT disk_read (
                   BYTE drv,        /* Physical drive nmuber (0..) */
                   BYTE *buff,        /* Data buffer to store read data */
                   DWORD sector,    /* Sector address (LBA) */
                   BYTE count        /* Number of sectors to read (1..255) */
                     )
{
  switch (drv)   {
    case SDIO_DRIVE: {    

             Status = SD_ReadMultiBlocks((uint8_t*)(buff),(sector)*SECTOR_SIZE,SECTOR_SIZE,count);

             /* Check if the Transfer is finished */
             Status = SD_WaitReadOperation();

            /* Wait until end of DMA transfer */
            while(SD_GetStatus() != SD_TRANSFER_OK);

            if (Status == SD_OK)    return RES_OK;
            else                           return RES_ERROR;
    }

  }
  return RES_PARERR;
}


а у него:
Код
DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count){
  DRESULT res = RES_ERROR;
  uint32_t timeout = 100000;

  if(BSP_SD_ReadBlocks_DMA((uint32_t*)buff,
                                        (uint32_t) (sector),
                                         count, SD_DATATIMEOUT) == MSD_OK)
  {
    while(BSP_SD_GetCardState()!= MSD_OK)  {
         if (timeout-- == 0)   {
              return RES_ERROR;
         }
    }
    res = RES_OK;
  }
  return res;
}
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 29 2017, 11:11
Сообщение #18


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Genadi Zawidowski @ Jul 29 2017, 03:03) *
Я два поля упомянул. Чтобы выравнивание работало, надо и саму структуру (структуры) выровнять. И секцию соответственно в скрипье линкера вырповнять.

Да хоть обвыравнивайся. Раз вы не хотите читать по ссылке, я здесь повторю.
Итак. Пишем в в файл последовательно два раза блок размером 971байт. (Блок выровнен).
При этом будут следующие вызовы:
для первого раза:
Код
  disk_write(0, block, sector, 1);       // первый сектор берётся прямо из блока
  disk_write(0, file.buf, sector+1, 1);  // второй сектор пока не полный, поэтому пишется через файловый буфер

для второго раза:
Код
  disk_write(0, file.buf, sector+1, 1);   // дописываем 53 байта во второй сектор (1024-911) (через файловый буфер)
  disk_write(0, block[53], sector+2, 1);  // вот здесь плохо, адрес block[53] - не выровнен на границу слова.

Видите, в четвёртом вызове в функцию disk_write() передан адрес block[53], который, очевидно, не выровнен. (Хотя сам блок выровнен).

Цитата(Genadi Zawidowski @ Jul 29 2017, 03:03) *
Детский сад... fatfs в исходниках, ловится и дебажится, я без дебагера полдня возился.

Не знаю, что вы там отдебажили, разве что переделали FatFs на запись строго через файловый буфер. Но это однозначное уменьшение быстродействия. Думаю, что вы просто не заметили проблемы, потому что у вас настроен побайтовый доступ DMA к памяти.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jul 29 2017, 11:29
Сообщение #19


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



невыровненные обращения к фпайлу fatfs делает через внктренний буфер, если размер данных операции записи позволяет, часть зхаписи идет напрямую из памяти где и лежат... Может, у Вас какая-нибуь старая версия?
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Jul 30 2017, 06:22
Сообщение #20


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Народ, может просто сделать RTFM?

Отсюда и дальше во ссылке:
http://elm-chan.org/fsw/ff/doc/dread.html

Если все структуры данных в файле и в памяти будут выровнены по границе слова, то невыровненного доступа просто быть не может. Также его не может быть, если писать кусками меньшими по длине, чем сектор (тогда все идет через внутренний буфер).

Цитата(Genadi Zawidowski @ Jul 29 2017, 14:29) *
невыровненные обращения к фпайлу fatfs делает через внктренний буфер, если размер данных операции записи позволяет, часть зхаписи идет напрямую из памяти где и лежат...

А вот не всегда там все будет выровнено. Так будет только если выполняется условие (((UINT)data & 3) == (f_tell(fp) & 3)).

У меня большие объемы пишутся вообще посекторно (с соответствующим выравниванием), маленькие через внутренний буфер FatFs вот собственно и все. Ничего править в FatFs надобности нет.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jul 30 2017, 06:44
Сообщение #21


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата
Ничего править в FatFs надобности нет.

Включишь кэш данных процессора - появится.
Цитата
А вот не всегда там все будет выровнено. Так будет только если выполняется условие (((UINT)data & 3) == (f_tell(fp) & 3)).

Обмен с картой идет из буфера. Она же не умеет (HS, XS) частями сектора переписывать... понял, о чем ты... Все буферы что я отдаю f_write и f_read, тоже выровнены. Во избежание...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 30 2017, 07:37
Сообщение #22


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Шаманъ @ Jul 30 2017, 11:22) *
Народ, может просто сделать RTFM?

Ну давайте, сделаем RTFM sm.gif Открываем ссылку: disk_write(), читаем:
Цитата
The specified memory address is not that always aligned to word boundary because the argument is defined as BYTE*.

Ещё вопросы есть?

Давайте ещё раз на пальцах объясню, как получается невыровненный адрес.

1. Пишем 511 байт. Они записываются в файловый буфер, буфер записывается в сектор.
2. Пишем 10К (неважно сколько, просто больше 513 байтов).
2.1 FatFs дописывает 1 байт в файловый буфер, скидывает его в сектор;
2.2 FatFs видит, что следующий сектор записывается целиком, и пишет его напрямую, минуя файловый буфер. В качестве адреса в функцию записи сектора передаётся указатель на второй байт массива в 10К (потому что первый байт ушёл в предыдущий сектор).
Ч. Т. Д.

ЗЫ. Версия, на которой я это проверял - 0.09b. Возможно, с тех пор что-то поменялось, буду рад это узнать.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Jul 30 2017, 07:58
Сообщение #23


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Цитата(Genadi Zawidowski @ Jul 30 2017, 09:44) *
Включишь кэш данных процессора - появится.

Он у меня включен, но я умею его приготовить соответствующим образом cool.gif То кинцо, что я тебе посылал довольно активно использует кеши, без них времени потребовалось бы намного больше (или письмо не дошло?). Но разговор то был не про кэши?

Цитата(AHTOXA @ Jul 30 2017, 10:37) *
Ну давайте, сделаем RTFM sm.gif Открываем ссылку: disk_write(), читаем:

Ещё вопросы есть?

У меня вопросов и не было, и если Вы внимательно прочитаете мое сообщение, то я не возражал, что в общем случае доступ может быть невыровненный. Однако там же описано, что сделать, чтобы он всегда был выровненный. Про это я тоже написал в том же сообщении.

Вы в Вашем примере пишите как попало, отсюда и невыровненный доступ. Никакого откровения здесь нет - все есть в мануале на FatFS, почему я и посоветовал сделать RTFM.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Jul 30 2017, 08:05
Сообщение #24


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Джентельмены, мы пишем стрим строго по 8К или 16К блоками, так что проблемы с выравниваниями думаю нет.
А вот остальное - может кто что сказать по поводу того, что я постил выше?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 30 2017, 08:17
Сообщение #25


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Шаманъ @ Jul 30 2017, 12:58) *
Однако там же описано, что сделать, чтобы он всегда был выровненный. Про это я тоже написал в том же сообщении.

Первым пунктом там идёт:
Цитата
Convert word transfer to byte transfer in this function if needed. - Recommended.

На что, собственно, я и напираю уже который пост. И это наиболее универсальное решение.

А как сделать, чтобы он был всегда выровненный при записи блоков данных произвольной длины? (Например, текстовых логов). Вот прямо для приведённого мной выше сценария, можете рассказать? Мне кажется, это невозможно. (Ну разве что пропатчить FatFs, чтобы все записи велись через файловый буфер, но это будет приличное замедление).

Цитата(Allregia @ Jul 30 2017, 13:05) *
Джентельмены, мы пишем стрим строго по 8К или 16К блоками, так что проблемы с выравниваниями думаю нет.

Прошу прощения, что увёл тему несколько в сторону. Но вопрос, я считаю, важный.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Jul 30 2017, 08:43
Сообщение #26


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Цитата(AHTOXA @ Jul 30 2017, 11:17) *
А как сделать, чтобы он был всегда выровненный при записи блоков данных произвольной длины? (Например, текстовых логов).

Для текстовых логов писать их кусками менее 512байт каждый. Как правило оно само собой так и получается. По крайней мере я не могу припомнить, чтобы в текстовый лог я писал за раз более 0.5К...

Для нетекстовых изменить структуру данных так, чтобы все было выровнено по границам слова - и в памяти, и в файле.

В общем случае, если хочется ни о чем не париться, то функции обмена с картой должны уметь работать с невыровненными данными. Как вариант написать "надстройки" над функциями чтения/записи, которые будут дробить вызовы записи/чтения фатфс, чтобы фрагменты были менее 512байт, и использовать эти функции там, где может быть проблема с невыровненными данными. Хотя проще в случае невыровненных данных обработать ситуацию прямо в disk_read/disk_write.

Цитата
Вот прямо для приведённого мной выше сценария, можете рассказать? Мне кажется, это невозможно.

В disk_read/disk_write в случае невыровненного адреса данных переписываем данные во временный буфер (выровненный, на 512байт) и пишем посекторно из него (при чтении делаем также - читаем в буфер, копируем в память). Это так сказать по методу "чайника" подход sm.gif Более правильно конечно разобраться с ДМА и, если он умеет работать с невыровненными адресами, просто правильно "приготовить" его (но у меня никогда такой надобности не возникало, потому здесь ничего не подскажу).

Цитата(Allregia @ Jul 30 2017, 11:05) *
может кто что сказать по поводу того, что я постил выше?

Могу сказать одно, чем неделю (!) переделывать чужой код лучше написать свое строго по мануалу. Вы ведь не знаете какие грабли припрятаны в чужом коде?

Сообщение отредактировал Шаманъ - Jul 30 2017, 08:46
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 30 2017, 09:13
Сообщение #27


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Шаманъ @ Jul 30 2017, 13:43) *
Более правильно конечно разобраться с ДМА и, если он умеет работать с невыровненными адресами, просто правильно "приготовить" его (но у меня никогда такой надобности не возникало, потому здесь ничего не подскажу).

Вот, вот оно! sm.gif Я ведь как раз и советую настроить DMA на доступ по байтам, и тогда всё работает как часы! Собственно, с чего я и влез в эту тему: вы спросили, зачем у Геннадия доступ к памяти побайтный, и я привёл пример, когда это может быть важно.

Кстати, я проводил замеры скорости, и у меня побайтный оказался даже немного быстрее, чем доступ по 32 бита.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Jul 30 2017, 09:24
Сообщение #28


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Цитата(AHTOXA @ Jul 30 2017, 12:13) *
Вот, вот оно! sm.gif Я ведь как раз и советую настроить DMA на доступ по байтам, и тогда всё работает как часы! Собственно, с чего я и влез в эту тему: вы спросили, зачем у Геннадия доступ к памяти побайтный, и я привёл пример, когда это может быть важно.

Так меня смутило что в одну сторону побайтно, а в другую пословно. Если бы в обоих случаях было побайтно, то было бы простое объяснение.

Цитата
Кстати, я проводил замеры скорости, и у меня побайтный оказался даже немного быстрее, чем доступ по 32 бита.

Это смотря что-кому важно. Мне намного важнее эффективное использование шины, а не скорость записи на карту (там ничего особого не нужно), потому пословно будет эффективнее (применительно к моему проекту).

Сообщение отредактировал Шаманъ - Jul 30 2017, 09:25
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 30 2017, 12:06
Сообщение #29


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Шаманъ @ Jul 30 2017, 14:24) *
Так меня смутило что в одну сторону побайтно, а в другую пословно. Если бы в обоих случаях было побайтно, то было бы простое объяснение.

Теперь понятно beer.gif.

Цитата(Шаманъ @ Jul 30 2017, 14:24) *
Это смотря что-кому важно. Мне намного важнее эффективное использование шины, а не скорость записи на карту (там ничего особого не нужно), потому пословно будет эффективнее (применительно к моему проекту).

Для меня важна была не скорость (это побочный эффект, да и то не уверен, что всё верно измерил), а надёжность. Чтобы я мог писать в файл какие угодно данные в любом порядке, и всё при этом писалось правильно.

Ну и универсальность. В таком виде мой драйвер FatFs я могу смело включать в любой проект, не вспоминая про выравнивание.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jul 30 2017, 13:29
Сообщение #30


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата
Геннадия доступ к памяти побайтный, и я привёл пример, когда это может быть важно.

будет возможность (рабочая плата под руками) - проверю - переведу оба направления в побайтный вариант обмена с памятью.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01524 секунд с 7
ELECTRONIX ©2004-2016