Jump to content

    

GenaSPB

Участник
  • Content Count

    2166
  • Joined

  • Last visited

Community Reputation

0 Обычный

1 Follower

About GenaSPB

  • Rank
    Гуру
  • Birthday 03/02/1964

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

19567 profile views
  1. Писать как можно большими кусками.
  2. Обратите внимане на библтиотеку OpenVG . Есть опыт отвызывания OpenVG от OpenGL (что в дефолтовой имплементации импользуется для демонстрации) - для работы с одним или более видеобуферами (без операционной системы). Все нужные Вам фичи в этой библиотеке есть, чисто софтовое. Антиалиасинг "Из коробки". Исходники всего (и "подпиленой" к современному с++ библиотеки) у меня на гитхабе. ua1arn/hftrx at develop (github.com) hftrx/lib/OpenVG at develop · ua1arn/hftrx (github.com) Из дсотоинств - можно когоо-то на линукс машине типа малины или под виндой засадить разрабатывать UI и потом перенести код в целевое устройство. (6) OpenVG Demo - YouTube
  3. Я код привел... Алгоритм - говорим карте, что сейчас будем писать воот-такой кусок - если нет в наличии - начинай стирать и готовить к записи
  4. Когда я писал звук, ускорило запись раза в полтора.
  5. Если начало/конец записываемого блока кратны сектору, то буферизация в FATFS не используется - все идет "мимо" нее. Да, хорошо бы чтобы в драйвевере карты использовалась команда резервирования блоков (ACMD23). Кусочек моего кода (живет в открытом гитхабовском репо): // write multiblock //PRINTF(PSTR("write multiblock, count=%d\n"), count); // Pre-erased Setting prior to a Multiple Block Write Operation // Setting a number of write blocks to be pre-erased (ACMD23) if (sdhost_short_acmd_resp_R1(SD_CMD_SD_APP_SET_NWB_PREERASED, count & 0x7FFFFF, & resp, DEFAULT_TRANSFER_MODE) != 0) // ACMD23 { PRINTF(PSTR("SD_CMD_SD_APP_SET_NWB_PREERASED error\n")); return RES_ERROR; } //PRINTF(PSTR("SD_CMD_SD_APP_SET_NWB_PREERASED okay\n")); if (sdhost_use_cmd23 != 0) { // set block count sdhost_short_resp(encode_cmd(SD_CMD_SET_BLOCK_COUNT, DEFAULT_TRANSFER_MODE), count, 0); // CMD23 if (sdhost_get_R1(SD_CMD_SET_BLOCK_COUNT, & resp) != 0) // get R1 { PRINTF(PSTR("SD_CMD_SET_BLOCK_COUNT error (count=%u)\n"), (unsigned) count); return RES_ERROR; } } // write multiblock // Сперва настраивается DMA, затем выдается команда SD_CMD_WRITE_MULT_BLOCK // Работает и на STM32Fxxx DMA_SDIO_setparams((uintptr_t) buff, 512, count, txmode); #if CPUSTYLE_STM32H7XX || CPUSTYLE_STM32MP1 // H7 need here: sdhost_dpsm_prepare((uintptr_t) buff, txmode, 512 * count, 9); // подготовка к обмену data path state machine - при записи после выдачи команды #endif /* CPUSTYLE_STM32H7XX */ // write blocks sdhost_short_resp(encode_cmd(SD_CMD_WRITE_MULT_BLOCK, getTransferMode(txmode, count)), sector * sdhost_getaddresmultiplier(), 0); // CMD25 if (sdhost_get_R1(SD_CMD_WRITE_MULT_BLOCK, & resp) != 0) { DMA_sdio_cancel(); PRINTF(PSTR("SD_CMD_WRITE_MULT_BLOCK error\n")); return RES_ERROR; } #if ! (CPUSTYLE_STM32H7XX || CPUSTYLE_STM32MP1) // other then H7 need here sdhost_dpsm_prepare((uintptr_t) buff, txmode, 512 * count, 9); // подготовка к обмену data path state machine - при записи после выдачи команды #endif /* ! CPUSTYLE_STM32H7XX */ if (sdhost_dpsm_wait((uintptr_t) buff, txmode, 512 * count) != 0) { PRINTF(PSTR("SD_disk_write: sdhost_dpsm_wait error\n")); DMA_sdio_cancel(); if (sdhost_stop_transmission() != 0) PRINTF(PSTR("SD_disk_write 2: sdhost_stop_transmission error\n")); return RES_ERROR; } else if (DMA_sdio_waitdone(txmode) != 0) { DMA_sdio_cancel(); PRINTF(PSTR("SD_disk_write 2: DMA_sdio_waitdone error\n")); return RES_ERROR; } else { sdhost_dpsm_wait_fifo_empty(); DMA_sdio_cancel(); #if ! CPUSTYLE_R7S721 && ! CPUSTYLE_XC7Z // В процессоре CPUSTYLE_R7S721 и CPUSTYLE_XC7Z команда CMD12 формируется аппаратурой if (sdhost_use_cmd23 == 0) { if (sdhost_stop_transmission() != 0) PRINTF(PSTR("SD_disk_write 3: sdhost_stop_transmission error\n")); } #endif /* ! CPUSTYLE_R7S721 */ } //PRINTF(PSTR("write multiblock, count=%d okay\n"), count); return RES_OK;
  6. Чтобы, если случайно кеш потребуется для другого участка памяти, старое не попыталось записаться во флешку
  7. 4 - я бы озаботился инвалидацией кеша перед стиранием
  8. А как вам такое решение партии и правительства?: Не присваивать может потому, что значение совпало с тем, на какое инициализировали при входе в функцию. А кото там потом сравнивает результат не с enum значениями, а с константой - iar не виноват...
  9. Я бы просто начальное значение передавал... Избавив себя от головной боли про хранимое состояние. И про thread-safe. Оно или начальное или результат расчета про предидущему сегменту.
  10. Может кому пригодится... https://en.m.wikipedia.org/wiki/OpenVG
  11. А это то зачем притащили? Показали бы функцию передачи из прмеров st... То что она из примеров не гарантирует что там все правильно.
  12. как я понял, slip/ppp ? покажите свою функцию передачи Или сами прлверьте - поддерживается ли многосегментный pbuf
  13. STM32H742VG Hardfault

    Уж для того чтобы в hard fault вылететь, процессору нужно начать выполнять инструкции... так что генератор точно не виноват.
  14. Обновлялке из примеров стм требуется драйвер от производителя. Ставится вместе с соответствующим софтом из инствляшки