Jump to content

    

GenaSPB

Участник
  • Content Count

    2168
  • Joined

  • Last visited

Everything posted by GenaSPB


  1. Боюсь в таком случае количество потоков будет ограничено количеством ядер... Я делал. Руками. На stm32mp1 и на xylinx zynq. После сброса все ядра начинают работать по одному и тому же коду. Ядро может узнать свой номер и в зависимости от э ого или продолжать выполнение пользовательского кода или ждёт... ждёт обычно на команде wfe. Дождавшись, откуда-то (у разных производителей по разном) читает адрес куда идти и переходит к пользователтскому коду. Контроллер прерываний GIC для каждого источника прерывания хранит маску какому ядру можно передавать запрос.
  2. Писать как можно большими кусками.
  3. Обратите внимане на библтиотеку OpenVG . Есть опыт отвызывания OpenVG от OpenGL (что в дефолтовой имплементации импользуется для демонстрации) - для работы с одним или более видеобуферами (без операционной системы). Все нужные Вам фичи в этой библиотеке есть, чисто софтовое. Антиалиасинг "Из коробки". Исходники всего (и "подпиленой" к современному с++ библиотеки) у меня на гитхабе. ua1arn/hftrx at develop (github.com) hftrx/lib/OpenVG at develop · ua1arn/hftrx (github.com) Из дсотоинств - можно когоо-то на линукс машине типа малины или под виндой засадить разрабатывать UI и потом перенести код в целевое устройство. (6) OpenVG Demo - YouTube
  4. Я код привел... Алгоритм - говорим карте, что сейчас будем писать воот-такой кусок - если нет в наличии - начинай стирать и готовить к записи
  5. Когда я писал звук, ускорило запись раза в полтора.
  6. Если начало/конец записываемого блока кратны сектору, то буферизация в 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;
  7. Чтобы, если случайно кеш потребуется для другого участка памяти, старое не попыталось записаться во флешку
  8. 4 - я бы озаботился инвалидацией кеша перед стиранием
  9. А как вам такое решение партии и правительства?: Не присваивать может потому, что значение совпало с тем, на какое инициализировали при входе в функцию. А кото там потом сравнивает результат не с enum значениями, а с константой - iar не виноват...
  10. Я бы просто начальное значение передавал... Избавив себя от головной боли про хранимое состояние. И про thread-safe. Оно или начальное или результат расчета про предидущему сегменту.
  11. Может кому пригодится... https://en.m.wikipedia.org/wiki/OpenVG
  12. А это то зачем притащили? Показали бы функцию передачи из прмеров st... То что она из примеров не гарантирует что там все правильно.
  13. как я понял, slip/ppp ? покажите свою функцию передачи Или сами прлверьте - поддерживается ли многосегментный pbuf
  14. STM32H742VG Hardfault

    Уж для того чтобы в hard fault вылететь, процессору нужно начать выполнять инструкции... так что генератор точно не виноват.
  15. Обновлялке из примеров стм требуется драйвер от производителя. Ставится вместе с соответствующим софтом из инствляшки
  16. Я в таких метстах старюсь обзодиться без копирования туда-сюда... птолько пермещая указателти/индексы. Кроме строковых есть и просто функции сравнения - memcmp, memchr.
  17. Оговорился. Номер интерфейса. Как раз это и не работало на update 20H2 свежепоставленой.
  18. Устройство впервые подключается к свежеустанрвленой винде 10ке. Такие условия эксперимента. Ставится винусб 10шны... да хоть какой. Не откликается. Как исправить я писал. Ждём, пока микрософт не поправит. А пока чиним что поставилось.
  19. У меня даже единственный с виндами после автоопределения не работает... пока zadig не обработать. WCID это то что позволяет автоустановку провернуть. https://github.com/pbatard/libwdi/wiki/WCID-Devices
  20. Переставить драйвер на НЕ WCID. Проблемы у dfu-util со множеством дескрипторов совместно с DFU начинаются если его номер больше чем девять - переставляем поближе к началу составного устройства.
  21. typedef uint32_t ncoftw_t; typedef int32_t ncoftwi_t; #define NCOFTWBITS 32 // количество битов в ncoftw_t #define FTWROUND(ftw) ((uint32_t) (ftw)) #define FTWAF001(freq) (((int_fast64_t) (freq) << NCOFTWBITS) / ARMI2SRATE100) #define FTWAF(freq) (((int_fast64_t) (freq) << NCOFTWBITS) / ARMI2SRATE) static FLOAT_t omega2ftw_k1; // = POWF(2, NCOFTWBITS); #define OMEGA2FTWI(angle) ((ncoftwi_t) ((FLOAT_t) (angle) * omega2ftw_k1 / (FLOAT_t) M_TWOPI)) // angle in radians -pi..+pi to signed version of ftw_t // Convert ncoftw_t to q31 argument for arm_sin_cos_q31 // The Q31 input value is in the range [-1 0.999999] and is mapped to a degree value in the range [-180 179]. #define FTW2_SINCOS_Q31(angle) ((ncoftwi_t) (angle)) // Convert ncoftw_t to q31 argument for arm_sin_q31 // The Q31 input value is in the range [0 +0.9999] and is mapped to a radian value in the range [0 2*PI). #define FTW2_COS_Q31(angle) ((q31_t) ((((ncoftw_t) (angle)) + 0x80000000uL) / 2)) #define FAST_Q31_2_FLOAT(val) ((q31_t) (val) / (FLOAT_t) 2147483648) static RAMFUNC FLOAT_t getsinf(ncoftw_t angle) { FLOAT_t v; const q31_t sinv = arm_sin_q31(FTW2_COS_Q31(angle)); //v = FAST_Q31_2_FLOAT(sinv); // todo: use arm_q31_to_float arm_q31_to_float(& sinv, & v, 1); return v; } static RAMFUNC FLOAT_t getcosf(ncoftw_t angle) { FLOAT_t v; const q31_t cosv = arm_cos_q31(FTW2_COS_Q31(angle)); //v = FAST_Q31_2_FLOAT(cosv); // todo: use arm_q31_to_float arm_q31_to_float(& cosv, & v, 1); return v; } static RAMFUNC FLOAT32P_t getsincosf(ncoftw_t angle) { FLOAT32P_t v; q31_t sincosv [2]; #if 1 sincosv [0] = arm_sin_q31(FTW2_COS_Q31(angle)); sincosv [1] = arm_cos_q31(FTW2_COS_Q31(angle)); #else arm_sin_cos_q31(FTW2_SINCOS_Q31(angle), & sincosv [0], & sincosv [1]); // at index 0 all fine // at index 1 with sidetones #endif arm_q31_to_float(sincosv, v.ivqv, 2); return v; } static RAMDTCM ncoftw_t anglestep_lout2 = FTWAF(5600), anglestep_rout2 = FTWAF(6300); static RAMDTCM ncoftw_t angle_lout2, angle_rout2; static int get_lout24(void) { // Формирование значения для LOUT //const int v = arm_sin_q31(angle_lout2 / 2) / 256; const int v = getcosf(angle_lout2) * INT24_MAX; angle_lout2 = FTWROUND(angle_lout2 + anglestep_lout2); return v; } После перехода с таблицы 90 градусов из 16385 float без апроксимации на CMSIS DSP спектр стал лучше
  22. Так и перестал... причём по прибытии к заказчику..
  23. Попроюуйте писать блоками по 16 килобайт например