Димон Безпарольный 2 22 мая, 2019 Опубликовано 22 мая, 2019 (изменено) · Жалоба 6 hours ago, haker_fox said: Ну дело тут не в сложности или простоте кода. А в его действиях. Действия не сложные. Код разбирает записываемую строку и пихает ее по буферам контролируя их заполнение. Максимум что есть - сравнение и пересылки. Занимает 24мс. Не могу понять почему возникают ошибки низкого уровня 0х01 в функции F_Write. И то только при условии что скорость потока выше 21к. Контроль переполнения есть. Если оба буфера заполнены - строка просто отбрасывается - ее писать некуда. Как сей баг отловить - не знаю. Мне кажется что библиотека не любит прерывание во времени определенных процессов - каких я пока не знаю. Или прерывание разрушает данные. Вторая версия. Максимум что я смог проверить - это переполнение стека. Его нет в прерывании. Забыл сказать, данный эффект полностью пропадает если разрешить hsd1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_ENABLE; Но при этом и скорость не больше 22к. Сей факт возможно отбросит вторую версию. Изменено 22 мая, 2019 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 22 мая, 2019 Опубликовано 22 мая, 2019 · Жалоба 18 minutes ago, Димон Безпарольный said: Как может f_lseek делать Record data stream WITHOUT cluster allocation delay? Где - то в этой последовательности должно быть F_Write. По-моему, все предельно ясно: на этапе f_seek ничего не пишется, просто выделяется цепочка кластеров, которая затем будет заполнена f_write. Зато последняя не будет отлекаться на выделение кластеров во время работы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 22 мая, 2019 Опубликовано 22 мая, 2019 · Жалоба 1 minute ago, aaarrr said: По-моему, все предельно ясно: на этапе f_seek ничего не пишется, просто выделяется цепочка кластеров, которая затем будет заполнена f_write. Зато последняя не будет отлекаться на выделение кластеров во время работы. Это понятно. Только написано коряво. И полностью алгоритм с использованием lseek пока не ясен. res = f_lseek(file, DATA_START); Что есть Dtata Start - не указатель же на массив. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 22 мая, 2019 Опубликовано 22 мая, 2019 · Жалоба 16 minutes ago, Димон Безпарольный said: Что есть Dtata Start - не указатель же на массив. Длина данных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexRayne 7 22 мая, 2019 Опубликовано 22 мая, 2019 · Жалоба 1 час назад, Димон Безпарольный сказал: Это понятно. Только написано коряво. И полностью алгоритм с использованием lseek пока не ясен. res = f_lseek(file, DATA_START); Что есть Dtata Start - не указатель же на массив. Там же написано в начале: res = f_lseek(file, PRE_SIZE); /* Предварительное выделение кластеров */ оно разместит файл, без реальной записи содержимого. потом надо откатиться на позицию начала записи, что res = f_lseek(file, DATA_START); и делает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 22 мая, 2019 Опубликовано 22 мая, 2019 · Жалоба 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 и переполнением данных при включенных прерываниях. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 22 мая, 2019 Опубликовано 22 мая, 2019 (изменено) · Жалоба Что - то проясняется. Информации под 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 (TXmode) and overrun (RX mode) errors.The behavior is to stop SDIO_CK and freeze SDIO state machines. The datatransfer is stalled while the FIFO is unable to transmit or receivedata. Only state machines clocked by SDIOCLK are frozen, the AHBinterface is still alive. The FIFO can thus be filled or emptied even ifflow control is activated." Именно это скорее всего и происходит - не успевают передаваться / приниматься данные из / в FIFO При установке этого бита, машина состояния карты просто останавливается если FiFo заполнен доверху за 2 байта до конца. При сброшенном бите процессор обязан читать весь поток. Изменено 22 мая, 2019 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться