Jump to content

    

FatFS и прерывания

6 hours ago, haker_fox said:

Ну дело тут не в сложности или простоте кода. А в его действиях.

Действия не сложные. Код разбирает записываемую строку и пихает ее по буферам контролируя их заполнение. Максимум что есть - сравнение и пересылки. Занимает 24мс.

 

Не могу понять почему возникают ошибки низкого уровня 0х01 в функции F_Write. И то только при условии что скорость потока выше 21к. Контроль переполнения есть. Если оба буфера заполнены - строка просто отбрасывается - ее писать некуда.

 

Как сей баг отловить - не знаю. Мне кажется что библиотека не любит прерывание во времени определенных процессов - каких я пока не знаю. Или прерывание разрушает данные. Вторая версия. Максимум что я смог проверить - это переполнение стека. Его нет в прерывании.

 

Забыл сказать, данный эффект полностью пропадает если разрешить   hsd1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_ENABLE; Но при этом и скорость не больше 22к. Сей факт возможно отбросит вторую версию. 

Edited by Димон Безпарольный

Share this post


Link to post
Share on other sites
18 minutes ago, Димон Безпарольный said:

Как может f_lseek делать Record data stream WITHOUT cluster allocation delay? Где - то в этой последовательности должно быть F_Write.

По-моему, все предельно ясно: на этапе f_seek ничего не пишется, просто выделяется цепочка кластеров, которая затем будет заполнена f_write.

Зато последняя не будет отлекаться на выделение кластеров во время работы.

Share this post


Link to post
Share on other sites
1 minute ago, aaarrr said:

По-моему, все предельно ясно: на этапе f_seek ничего не пишется, просто выделяется цепочка кластеров, которая затем будет заполнена f_write.

Зато последняя не будет отлекаться на выделение кластеров во время работы.

Это понятно. Только написано коряво. И полностью алгоритм с использованием lseek пока не ясен. 

res = f_lseek(file, DATA_START);

Что есть Dtata Start - не указатель же на массив.

Share this post


Link to post
Share on other sites
16 minutes ago, Димон Безпарольный said:

Что есть Dtata Start - не указатель же на массив.

Длина данных.

Share this post


Link to post
Share on other sites
1 час назад, Димон Безпарольный сказал:

Это понятно. Только написано коряво. И полностью алгоритм с использованием lseek пока не ясен. 


res = f_lseek(file, DATA_START);

Что есть Dtata Start - не указатель же на массив.

Там же написано в начале:

   res = f_lseek(file, PRE_SIZE);           /* Предварительное выделение кластеров */

оно разместит файл, без реальной записи содержимого. потом надо откатиться на позицию начала записи, что 

res = f_lseek(file, DATA_START);

и делает

Share this post


Link to post
Share on other sites
1 hour ago, Димон Безпарольный said:

SDMMC_HARDWARE_FLOW_CONTROL_ENABLE;

Вот что говорит документация по этой настройке:

Bit 18 TXFIFOE: Transmit FIFO empty
When HW Flow Control is enabled, TXFIFOE signals becomes activated when the FIFO
contains 2 words.
Bit 17 RXFIFOF: Receive FIFO full
When HW Flow Control is enabled, RXFIFOF signals becomes activated 2 words before the
FIFO is full.

Может быть проблема связана с чтением из FiFo и переполнением данных при включенных прерываниях.

Share this post


Link to post
Share on other sites

Что - то проясняется. Информации под STM я пока не нашел, но для LPC вот что написано:

 

The extra bit is called HWFC_EN (Hardware Flow Control Enable).

The description is
"The HW flow control functionality is used to avoid FIFO underrun (TX
mode) and overrun (RX mode) errors.
The behavior is to stop SDIO_CK and freeze SDIO state machines. The data
transfer is stalled while the FIFO is unable to transmit or receive
data. Only state machines clocked by SDIOCLK are frozen, the AHB
interface is still alive. The FIFO can thus be filled or emptied even if
flow control is activated."

 

Именно это скорее всего и происходит - не успевают передаваться / приниматься данные из / в FIFO

 

При установке этого бита, машина состояния карты просто останавливается если FiFo заполнен доверху за 2 байта до конца. При сброшенном бите процессор обязан читать весь поток.

Edited by Димон Безпарольный

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now