Очень легко - в опциях компилятора ставишь Save temporary files - потом после компиляции грузишь файл *.s и смотришь чего он там нагенерил. Насчет C - если научишься так, то и отдельно ASM для вызова DSP функций не нужен (пример внутри: декодер FSK + IIR фильтр 4-го порядка)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено bmf 07 сентября 2005 г. 14:23
В ответ на: Отлично! Еще вопрос: можно ли настроить VisualDSP++, так чтобы виден был ассемблерный код, который генерится компилятором С? отправлено <font color=gray>&Незнайка</font> 07 сентября 2005 г. 13:46

unsigned decode(short *buf,unsigned num,bool *out,fsk_state *fskstate)
{
unsigned i;
short *pdelay=fskstate->delay;
bool *outbuf=out;
unsigned lenmax=FSK_MAXFSKBUF;
short *ptr=buf;

for(i=0;i if(i==FSK_DELAY) {
pdelay=buf;
}
// LP filter (IIR filter)

int rt;

asm volatile ( "\n" \
"sr1=%1; i0=%2;" "\n" \
"DIS M_MODE;" "\n" \
"se=1;" "\n" \
"m1=1;" "\n" \
"m3=-3;" "\n" \
"i6=%3;" "\n" \
"m6=1;" "\n" \
"mx0=dm(i0,m1), my0=pm(i6,m6);" "\n" \
"mr=mx0*my0(ss), mx1=dm(i0,m1), my0=pm(i6,m6);" "\n" \
"mr=mr+mx1*my0(ss), my0=dm(i6,m6);" "\n" \
"mr=mr+sr1*my0(ss), mx0=dm(i0,m1), my0=pm(i6,m6);" "\n" \
"mr=mr+mx0*my0(ss), mx0=dm(i0,m3), my0=pm(i6,m6);" "\n" \
"dm(i0,m1)=mx1, mr=mr+mx0*my0(rnd);" "\n" \
"dm(i0,m1)=sr1, sr=ashift mr1(hi);" "\n" \
"mx0=dm(i0,m1), my0=pm(i6,m6);" "\n" \
"mr=mx0*my0(ss), mx1=dm(i0,m1), my0=pm(i6,m6);" "\n" \
"mr=mr+mx1*my0(ss), my0=dm(i6,m6);" "\n" \
"mr=mr+sr1*my0(ss), mx0=dm(i0,m1), my0=pm(i6,m6);" "\n" \
"mr=mr+mx0*my0(ss), mx0=dm(i0,m3), my0=pm(i6,m6);" "\n" \
"dm(i0,m1)=mx1, mr=mr+mx0*my0(rnd);" "\n" \
"dm(i0,m1)=sr1, sr=ashift mr1(hi);" "\n" \
"dm(i0,m1)=mx0;" "\n" \
"dm(i0,m1)=sr1;" "\n" \
"ENA M_MODE;" "\n" \
"%0=sr1;" "\n" \
: "=r"(rt) : "r"((*ptr++)*(*pdelay++)) , "r"(fskstate->filter_state), "r"(fskstate->coeff) : "SR", "I0", "I6", "MX0", "MX1", "MY0", "SE", "MR", "M1", "M3", "M6" );
bool newbit=(rt<0);


if (fskstate->lastbit != newbit) {
fskstate->lastbit = newbit;
if (fskstate->phase< 0x8000)
fskstate->phase += FSK_BAUD_PLL_ADJ;
else
fskstate->phase -= FSK_BAUD_PLL_ADJ;
}

fskstate->phase+=fskstate->phase_incr;
asm volatile ("if not ac jump .adrcont;");
if(lenmax) {
*outbuf++ = fskstate->lastbit;
lenmax--;
}
asm volatile (".adrcont:");
}
fskstate->delay=pdelay;
return ((unsigned)outbuf)-(unsigned)out;
}


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru