2 maks
<1. Для решения этой проблемы вводится функция source_f_end(), которая будет лежать после копируемой функции...>
В VDSP такая фишка не проходит, он в памяти располагает не по объявлению а по вызову.
Еще имеется специфика ADSP, регистры имеют разрядность 40 бит, ширина инструкций 48 бит. В моем случае копируемая функция находится в SDRAM, разрядность данных 32 разряда, надо упаковывать в 48 бит.
<Есть стандартный способ передачи параметров в подпрограмму>
А в чем он заключается?
Я решил сделать так, фунции которые будут копироваться в место исполнения общатся с внешней (програмной) средой будут посредством глобального массива аргументов, элементы которого для определенных функций будут являться входными и выходными параметрами.
2 olefil
В общем, взял пример fft_ovly2
Вот кусок менеджера оверлеев отвечающий за DMA передачу
Код
i8 = runAddresses;
i0 = liveAddresses;
r0=0;
// Disable DMA
dm(DMAC0) = r0;
// Set DMA external pointer to overlay live address
r0=dm(m0,i0);
dm(EIEP0)=r0;\
// Set DMA internal pointer to overlay run address
r0=pm(m8,i8);
dm(IIEP0)=r0;\
i0=runWordSize; // Number of words stored in internal memory
// Most likely the word size will be 48 bits
// for instructions.
// Set DMA external modifier
r0=1;
dm(EMEP0)=r0;
i8=liveWordSize; // Number of words stored in external memory
// Most likely the word size will be 32 or16
// bits for external storage.
// Set DMA internal modify to 1
dm(IMEP0)=r0;
// Set DMA internal count to Overlay run size.
r0=dm(m0,i0);
dm(CEP0)=r0;
// Set DMA external count to Overlay live size.
r0=pm(m8,i8);
dm(ECEP0)=r0;
// DMA enabled, instruction word, Master, 48-32 packing
r0=0x2e1;
dm(DMAC0)=r0;
Переписал это на C
Код
*pDMAC0=0;
*pEIEP0=pointerDest;
*pIIEP0=pointerTarget;
*pEMEP0=1;
*pIMEP0=1;
*pCEP0=0x20;
*pECEP0=0x20;
*pDMAC0=0x2e1;
Размер функции в которую копируется 1kword.
Копируемая функция размером 10word.
Разместил копируемую функцию во внутренней памяти, содержимое первых шести слов :
Код
043ff8000000 0f0200000008 ad02fffffffe
10010000c009 013e00001012 11000000c009
Далее разместил копируемую функцию в SDRAM, после завершения работы DMA, содержимое скопированной функции:
Код
00000000F800 00000008043F 0F020000FFFE
AD02FFFF0000 0000C0090000 000010121001
???