Jump to content

    

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

Участник
  • Content Count

    806
  • Joined

  • Last visited

Community Reputation

0 Обычный

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

  • Rank
    Знающий

Recent Profile Visitors

3240 profile views
  1. Подскажите по распределению памяти в STM32L476

    Только в MAP файле не нашел куда куча кладется. А она используется. Точно.
  2. Подскажите по распределению памяти в STM32L476

    Нашел очень доступно на картинках здесь: http://www.stmcu.org.cn/module/forum/thread-604814-1-1.html Весьма удобно. Из MAP переносим название объектных файлов в scr в разные секции IRAM по желанию. И код даже работает.
  3. Подскажите по распределению памяти в STM32L476

    Это в скаттере *.sct?
  4. Подскажите по распределению памяти в STM32L476

    В процессоре есть память CCM(IRAM2), с нулевым циклом ожидания. Хотелось бы туда запихнуть стек и некоторые переменные. Собственно, это с успехом делает линкер когда я ставлю галочку разрешения IRAM2. Но. Линкер пихает туда в частности и буфер, с которым работает DMA. Но доступа у DMA туда нет и код разумеется не работает. Нашел атрибут __attribute__((at(0x10000000))); для размещения в IRAM2. Это тоже работает. Но нужно указать что определенные буфера надо размещать в IRAM1. Попробовал поменять на __attribute__((at(0x20000000)));, но ругается линкер: Как все - таки указать явное размещение в IRAM1 линкеру ?
  5. FatFS и прерывания

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

    Вот что говорит документация по этой настройке: 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 и переполнением данных при включенных прерываниях.
  7. FatFS и прерывания

    Это понятно. Только написано коряво. И полностью алгоритм с использованием lseek пока не ясен. res = f_lseek(file, DATA_START); Что есть Dtata Start - не указатель же на массив.
  8. FatFS и прерывания

    Действия не сложные. Код разбирает записываемую строку и пихает ее по буферам контролируя их заполнение. Максимум что есть - сравнение и пересылки. Занимает 24мс. Не могу понять почему возникают ошибки низкого уровня 0х01 в функции F_Write. И то только при условии что скорость потока выше 21к. Контроль переполнения есть. Если оба буфера заполнены - строка просто отбрасывается - ее писать некуда. Как сей баг отловить - не знаю. Мне кажется что библиотека не любит прерывание во времени определенных процессов - каких я пока не знаю. Или прерывание разрушает данные. Вторая версия. Максимум что я смог проверить - это переполнение стека. Его нет в прерывании. Забыл сказать, данный эффект полностью пропадает если разрешить hsd1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_ENABLE; Но при этом и скорость не больше 22к. Сей факт возможно отбросит вторую версию.
  9. FatFS и прерывания

    Так и в оригинале тоже самое - переводчик не наврал. res = f_lseek(fp, DATA_START); /* Record data stream WITHOUT cluster allocation delay */ ... /* Write operation should be aligned to sector boundary to optimize the write throughput */ http://elm-chan.org/fsw/ff/doc/lseek.html Как может f_lseek делать Record data stream WITHOUT cluster allocation delay? Где - то в этой последовательности должно быть F_Write.
  10. FatFS и прерывания

    Для ускорения процесса нашел вот эту статью: /* Предварительное выделение кластеров (чтобы предотвратить переполнение буфера при потоковой записи) */ res = f_open(file, recfile, FA_CREATE_NEW | FA_WRITE); /* Создание файла */ res = f_lseek(file, PRE_SIZE); /* Предварительное выделение кластеров */ if (res || f_tell(file) != PRE_SIZE) ... /* Проверка - было ли успешным увеличение размера файла */ res = f_lseek(file, DATA_START); /* Запись потока данных без задержек на выделение кластеров */ ... res = f_truncate(file); /* Обрезка неиспользуемого пространства */ res = f_lseek(file, 0); /* Запись заголовка файла */ ... res = f_close(file); http://microsin.net/programming/file-systems/fatfs-seek-file.html Но мне кажется - уж не вредитель ее писал или я настолько туп? res = f_lseek(file, DATA_START); /* Запись потока данных без задержек на выделение кластеров */ Как f_lseek может что - то записать? Это же просто перемещение указателя? Или это: res = f_lseek(file, 0); /* Запись заголовка файла */ Не пойму я этого.
  11. FatFS и прерывания

    Похоже так. Если не останавливать поток, даже f_mount выполняется с ошибкой. sprintf не хочет печатать в буфер имя файла. В потоке не такой уж сложный код - почему он так влияет - не пойму. Может кто намекнет, как отлавливать сей баг - почему прерывание по таймеру с несложным кодом так влияет на основной процесс? Гешил на стек - добавил. Не помогло.
  12. FatFS и прерывания

    Значит допустимы потери или поток не постоянен - у меня нет. Поток идет каждые 2мс и потери недопустимы. Карта по спецификации имеет задержки до 250мс кажется.
  13. FatFS и прерывания

    Используете двойную буферизацию? Размер буфера не подскажите?
  14. FatFS и прерывания

    Пытаюсь понять насколько правильно это делает FatFS. Но это слишком глубоко в железе. Пожно. По таймеру раз в 2мс как и должно быть в изделии. Только возможности не хватает нужно 80К/сек, о факту - только 21. SPI по спецификации если не ошибаюсь 20МГц. На каких же скоростях там все летает?
  15. FatFS и прерывания

    Процессор F407, карта SD класс 10. Использую двойную буферизацию. Буфера заполняются в прерывании. Со включенным прерыванием больше 21К / сек не вытягивает. Если пишу с остановкой потока перед f_write, карта с успехом пишет 42К / сек поток. В чем может быть косяк? Если писать поток выше 21К с без отключения прерываний, возникает ошибка записи диска низкого уровня 0х01. В прерывании небольшой кусок кода занимает 20 - 30 мкс. Либо я где - то накосячил.