Перейти к содержанию
    

6 hours ago, haker_fox said:

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

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

 

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

 

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

 

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

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 minutes ago, Димон Безпарольный said:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, aaarrr said:

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

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

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

res = f_lseek(file, DATA_START);

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 minutes ago, Димон Безпарольный said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Димон Безпарольный сказал:

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


res = f_lseek(file, DATA_START);

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

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

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

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

res = f_lseek(file, DATA_START);

и делает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 и переполнением данных при включенных прерываниях.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что - то проясняется. Информации под 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 байта до конца. При сброшенном бите процессор обязан читать весь поток.

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...