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

vasilius

Участник
  • Постов

    42
  • Зарегистрирован

  • Посещение

Репутация

1 Обычный

Информация о vasilius

  • Звание
    Участник
    Участник

Посетители профиля

268 просмотров профиля
  1. можно было просто резистор Ом на 10 в разрыв всунуть.... костыль....но...
  2. Я бы тут память не экономил... Если подразумевается какой-то процессинг, то zero copy уже не подходит. Half-full имно, схема единственно правильная. Если есть какой-то процессинг или подразумевается в будущем, то даже для свистелки-перделки, я бы использовал минимум 32к сэмпл рейт. С АЦП брал бы 24 бита, конвертил в флоат , делал бы , то что нужно, и дальше конвертил бы в то что нужно для цап. И почему бы не выделять для дма не кешируэмую память и обходится бы без инвалидаций кеша? Но это дело вкуса...
  3. 24кГц это если перделку-свистелку делать... для стандартного аудио 20Гц-20кГц не подходит. Частота Найтквиста, теорема Котельникова в помощь...
  4. https://www.linkedin.com/pulse/using-simd-arm-neon-speed-up-applications-salvatore-c-chieppa https://stackoverflow.com/questions/11259596/128-bit-rotation-using-arm-neon-intrinsics
  5. Кому инетерсно как запустить DSP с имиджа Xtensa в линкере выделяем память - я выделил последние 4М для ДСП __DSP_BASE = 0x47C00000; __DSP_SIZE = 4M; /* Step 1M */ __RAM_SIZE = 128M - __DSP_SIZE; MEMORY { RAM (rwx) : ORIGIN = 0x40000000, LENGTH = __RAM_SIZE DSP (rwx) : ORIGIN = __DSP_BASE, LENGTH = __DSP_SIZE } настраиваем MMU для этого региона MMU_TTSection((uint32_t*)tbbArea, __dsp_base, sizeDSP, Sect_Device_RW); собираем приложение для дсп, там настраиваем LSP для нашего региона MEMORY { iram0_0_seg : org = 0x00400000, len = 0x660 iram0_1_seg : org = 0x00400660, len = 0x9A0 iram0_2_seg : org = 0x00401000, len = 0x17C iram0_3_seg : org = 0x0040117C, len = 0x20 iram0_4_seg : org = 0x0040119C, len = 0x20 iram0_5_seg : org = 0x004011BC, len = 0x20 iram0_6_seg : org = 0x004011DC, len = 0x20 iram0_7_seg : org = 0x004011FC, len = 0x20 iram0_8_seg : org = 0x0040121C, len = 0x20 iram0_9_seg : org = 0x0040123C, len = 0xEDC4 dram0_0_seg : org = 0x00420000, len = 0x8000 dram1_0_seg : org = 0x00440000, len = 0x8000 ddr1_0_seg : org = 0x37C00000, len = 0x400000 } настраиваем _cache_config(); в board_init(); собираем получаем ELF. Бинарник в голом виде там не получится, поэтому с эльфа надо данные выдирать самим ельф можно потрошить с сдк линукса : там в драйверах есть файл dsp.c, так как у меня нет задачи запускать имидж с линукса я oemhead не добавлялю... я написал свою выдиралку, она дает хидер в таком виде прямо с эльфа #ifndef DSPIMAGE_H #define DSPIMAGE_H typedef struct { unsigned int RAM; unsigned int Offset; unsigned int Length; } dspImgMapStruct; const unsigned char dspImgData[] = { ....... }; const unsigned int dspImageBlocksCount = 11; const unsigned int dspImageDataLength = 4680; const unsigned int dspEntryPoint = 0x00400660; const dspImgMapStruct dspImgMap[11] = { {0x00400660, 0x00000000, 0x0000016C}, ... }; #endif В итоге данные хранятся как RO в прошивке, занимают минимум места. После этого запускается это все красиво таким образом #include "dsp.h" #include "dspImg.h" void DSP_LoadImage(void) { for(int i = 0; i < dspImageBlocksCount; i++) { memcpy((uint8_t*)dspImgMap[i].RAM, &dspImgData[dspImgMap[i].Offset], dspImgMap[i].Length); } } void DSP_Setup(void) { CCU_SetDSP(CCU_DSP_SRC_PERI2X, 1); BIT_SET(SYS_CFG->DSP_BOOT_RAMMAP_REG, BIT_SRAM_REMAP_ENABLE); BIT_CLEAR(CCU->DSP_BGR_REG, BIT_DSP0_RST); // DSP Reset Assert DSP0_CFG->DSP_ALT_RESET_VEC_REG = dspEntryPoint; BIT_SET(DSP0_CFG->DSP_CTRL_REG0, BIT_START_VEC_SEL); BIT_SET(DSP0_CFG->DSP_CTRL_REG0, BIT_RUN_STALL); BIT_SET(DSP0_CFG->DSP_CTRL_REG0, BIT_DSP_CLKEN); BIT_SET(CCU->DSP_BGR_REG, BIT_DSP0_RST); // DSP Reset De-assert DSP_LoadImage(); BIT_CLEAR(SYS_CFG->DSP_BOOT_RAMMAP_REG, BIT_SRAM_REMAP_ENABLE); BIT_CLEAR(DSP0_CFG->DSP_CTRL_REG0, BIT_RUN_STALL); }
  6. Xtensa - она не навязывает RTOS, но логично, что ее предлагает... как и все, впрочем. Если брать линукс - то, кстати, вот именно в S3, ядро XTENSA и решает проблему прямого доступа к железу. Там смысл в том, что оно запускается отдельно и имеет прямой доступ к железу (например аудио) и если надо то берет ресурсы с кортекс ядер. Впрочем в Т113 СДК оно так и используется. Мне линукс не оч нравится тем, что мне нужны мощности всех ядер кортекса и еще ядро ДСП на всю катушку. И не хочется никакой ОС отдавать ресурсы. Да, это из-за жлобского подхода : все хочется на одном камне сделать и дешево. Вся суть с этим ДСП, в том, что надо иметь все сразу и СДК от олвинера, и лицензию от каденсы, чтобы понять как это работает. Без конфигов олвинера лицензия не поможет. По-умолчанию конфиги для hifi4 там совсем абстрактные. Но стоит иметь и СДК чтобы видеть как олвинер это применяет. Конфиг от олвинера почти полностью представлен на гите по ФРИИРТОС. Файл линкера там от min-rtos. Хотя конфиг обознает конфигурацию sim. Но пример с СДК использует свой вариант... хз Allwiner SDK MEMORY { iram0_0_seg : org = 0x00400000, len = 0x660 iram0_1_seg : org = 0x00400660, len = 0x9A0 iram0_2_seg : org = 0x00401000, len = 0x17C iram0_3_seg : org = 0x0040117C, len = 0x20 iram0_4_seg : org = 0x0040119C, len = 0x20 iram0_5_seg : org = 0x004011BC, len = 0x20 iram0_6_seg : org = 0x004011DC, len = 0x20 iram0_7_seg : org = 0x004011FC, len = 0x20 iram0_8_seg : org = 0x0040121C, len = 0x20 iram0_9_seg : org = 0x0040123C, len = 0xEDC4 dram0_0_seg : org = 0x00420000, len = 0x8000 dram1_0_seg : org = 0x00440000, len = 0x8000 ddr1_0_seg : org = 0x32000000, len = 0x100000 } Config Allwiner MEMORY { sram0_seg : org = 0x00020000, len = 0x2E0 sram2_seg : org = 0x00020400, len = 0x178 sram3_seg : org = 0x00020578, len = 0x4 sram4_seg : org = 0x0002057C, len = 0x1C sram5_seg : org = 0x00020598, len = 0x4 sram6_seg : org = 0x0002059C, len = 0x1C sram7_seg : org = 0x000205B8, len = 0x4 sram8_seg : org = 0x000205BC, len = 0x1C sram9_seg : org = 0x000205D8, len = 0x4 sram10_seg : org = 0x000205DC, len = 0x1C sram11_seg : org = 0x000205F8, len = 0x4 sram12_seg : org = 0x000205FC, len = 0x1C sram13_seg : org = 0x00020618, len = 0x4 sram14_seg : org = 0x0002061C, len = 0x1C sram15_seg : org = 0x00020638, len = 0x4 sram16_seg : org = 0x0002063C, len = 0x1C sram17_seg : org = 0x00020658, len = 0x1F9A8 iram0_0_seg : org = 0x00400000, len = 0x20000 dram0_0_seg : org = 0x00420000, len = 0x20000 dram1_0_seg : org = 0x00440000, len = 0x20000 } FreeRTOS git MEMORY { iram0_1_seg : org = 0x00400000, len = 0x1000 iram0_2_seg : org = 0x00401000, len = 0x17C iram0_3_seg : org = 0x00401178, len = 0x20 iram0_4_seg : org = 0x00401198, len = 0x20 iram0_5_seg : org = 0x004011B8, len = 0x20 iram0_6_seg : org = 0x004011D8, len = 0x20 iram0_7_seg : org = 0x004011F8, len = 0x20 iram0_8_seg : org = 0x00401218, len = 0x20 iram0_9_seg : org = 0x00401238, len = 0xEDC4 ddr1_0_seg : org = 0x37900000, len = 0x400000 } ну и т.д.
  7. у меня пока проблемы с пониманием как-то это собирать и как запускать.... Вижу противоречия - в линкере и т.д. Там компилится не бинарник, а эльф.... его надо еще распотрашить и запустить... FREERTOS кстати базируется на конфигах олвинера, но там тоже "по-своему" сделано.... не совсем так.... пока разбираюсь... хочется правильно это собрать и запускать
  8. вот так откомпилил родной компилер эту ф-цию 004001e0 <ttt>: 4001e0: 004136 entry a1, 32 4001e3: df77c7e44080150670013f { ae_mov aed3, aed0; nop; ae_mov aed0, aed2; add.s aed5, aed0, aed1 } 4001ee: f17bc7cc94e3141670151f { nop; nop; madd.s aed0, aed3, aed1; sub.s aed4, aed5, aed2 } 4001f9: 4a4020 madd.s aed0, aed2, aed4 4001fc: f01d retw.n 004001fe <ttt+0x1e>:
  9. есть два вида работы с лицензией - или файл - или сервак... вот "кубики" это и есть конфиг производителя...
  10. там две проблемы. Хтенса это нечто универсальное в своей поставке по-умолчанию. Дальше там смысл в конфигах под определенный проц. У олвинера есть свой конфиг именно с настройками под его hifi4 (на самом деле их там три вида). Тоесть среда XTENSA даже с лицензией без этого конфига - нафиг не упала - толку от нее ноль. Вот лицензия для XTENSA - это вторая проблема. Если есть конфиг от производителя - то уже можно пытаться компилить. Сама XTENSA это по сути тот же gcc\clang, который сделан так, чтобы грузить данные с конфига. Там у них есть же их TIE. Тоесть могут быть процы где можно программировать\задавать инструкции... но в данном сабже это все лишнее.. Конфиги эти тоже есть под линукс и винду.... у меня линуховый, но я вроде его заставил работать под винду.... Странность в том, что моя лицензия для XTENSA в линухе не работает, а в винде - работает. ХЗ - почему. Еще забавно - это то как получается выходной ELF. Его в BIN не получается просто сделать через xt-objcopy %S% -O binary -R .noinit -R .bss -R .vram -R .heap "test.elf" "test.bin" - получается кусок нулец на 4 Мб внутри но смотря сорцы линуха - там они сами потрошат этот эльф и выдирают секцию.... Да.. по-идее там можно XTENSA обойти - там есть файл - с которым можно собрать свой gcc - есть свой конфиг для сборки gcc. По-идее он будет принимать те-же параметры как и родной, но уже без лицензий всяких... Там есть возможность использовать call0, но везде используется windowed Короче - пока вопросов больше, чем ответов - разбираюсь...
  11. Зачем все писать самому? Я нашел(купил) оригинальный пакет конфига от олвинера для hifi4. Получил лицензию на xplorer. Есть смысл использовать реальный тулчейн, со всеми плюшками... да - сложно и не все понятно, но...
  12. только это не всегда возможно.... например с XTENSA.... там черт голову сломает
×
×
  • Создать...