[an error occurred while processing this directive]
Ответ:
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

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

Отправлено Seishel 14 сентября 2005 г. 09:09
В ответ на: Ну хорошо. КОД В СТУДИЮ. Посмотрим, так ли уж страшен черт...как его малюта(:-) отправлено GM 13 сентября 2005 г. 18:02

Вот маленький кусочек кода который вообще нужно оптимизировать, ой как надо... это всё производится в цикле и имеет существенные последствия на общее количество комманд...
Сначала маленько на Си:

For IP=2, 3, 4, ..., MH, do the following doubly indented lines
IB=MINC-IP+2
AA0=ATMP(IP)<<16  Load AA0 high word
P=RC*ATMP(IB)  Q15 RC, so<<1
AA0=AA0+(P<<1)
If AA0 overflowed, then do the following triply indented lines
NRS=NRS+1
For LP=2, 3, ..., MINC, set ATMP(LP)=ATMP(LP)>>1
AA0=ATMP(IP)<<16  First re-scale ATMP
P=RC*ATMP(IB)  Next re-calculate
AA0=AA0+(P<<1)  overflowed AA0
AA1=ATMP(IB)<<16
P=RC*ATMP(IP)
AA1=AA1+(P<<1)
If AA1 overflowed, then do the following triply indented lines
NRS=NRS+1
For LP=2, 3, ..., MINC, set ATMP(LP)=ATMP(LP)>>1
AA0=ATMP(IP)<<16  First re-scale ATMP(IP)
P=RC*ATMP(IB)  Next re-calculate AA0
AA0=AA0+(P<<1) 
AA1=ATMP(IB)<<16  Next re-scale ATMP(IB)
P=RC*ATMP(IP)  Next re-calculate
AA1=AA1+(P<<1)  overflowed AA1
ATMP(IP)=RND(AA0)
ATMP(IB)=RND(AA1)

А теперь тоже самое на асме, причём те кусочки которые выполняются при переполнении аккумуляторов абсолютно не критичны по количеству машинных циклов, так как за всё общее количество повторения этого цикла (в общей сложности 625 раз) они выполняются не более 1-2 раз, поэтому всё остальное падает на вычисление округление и сохранение результатов:

;MH Start

LD MINC_MH,A
SFTA A,#-1
STLM A,BRC ;ñ÷¸ò÷èê öèêëà MH ðàç
NOP
RPTBD b_lev_MH? ;èíèöèàëèçàöèÿ öèêëà
MVMM AR1,AR3 ;ATMP(IP)
MVMM AR6,AR2 ;ATMP(IB)

MPY *AR2,A ;AA0=RC*ATMP(IB)
SFTA A,1 ;AA0<<1
ADD *AR3,16,A ;AA0=AA0+ATMP(IP)<<16
BC b_lev_1?,ANOV ;If AA0 overflowed...

ADDM #1,NRS
ADDM #-1,NRS_N
LD NRS_N,ASM
LD MINC,A
PSHM ST1
PSHM BRC
PSHM RSA
STLM A,BRC ;ñ÷¸ò÷èê öèêëà
PSHM REA
RPTBD b_lev_2? ;èíèöèàëèçàöèÿ öèêëà ñ delay
MVMM AR1,AR4
NOP
LD *AR4,A
b_lev_2?:
STH A,15,*AR4+
POPM REA
POPM RSA
POPM BRC
POPM ST1
MPY *AR2,A ;AA0=RC*ATMP(IB)
SFTA A,1 ;AA0<<1
ADD *AR3,16,A ;AA0=AA0+ATMP(IP)
b_lev_1?:

MPY *AR3,B ;AA1=RC*ATMP(IP)
SFTA B,1 ;AA1<<1
ADD *AR2,16,B ;AA1=AA1+ATMP(IB)<<16
BC b_lev_3?,BNOV ;if AA1 overflowed...

ADDM #1,NRS
ADDM #-1,NRS_N
LD NRS_N,ASM
LD MINC,A
PSHM ST1
PSHM BRC
PSHM RSA
STLM A,BRC ;ñ÷¸ò÷èê öèêëà
PSHM REA
RPTBD b_lev_4? ;èíèöèàëèçàöèÿ öèêëà ñ delay
MVMM AR1,AR4
NOP
LD *AR4,B
b_lev_4?:
STH B,15,*AR4+
POPM REA
POPM RSA
POPM BRC
POPM ST1
MPY *AR2,A ;AA0=RC*ATMP(IB)
SFTA A,1 ;AA0<<1
ADD *AR3,16,A ;AA0=AA0+ATMP(IP)<<160
MPY *AR3,B ;AA1=RC*ATMP(IP)
SFTA B,1 ;AA1<<1
ADD *AR2,16,B ;AA1=AA1+ATMP(IB)<<16
b_lev_3?:

ADD #2,14,A ;RND(AA0)
ADD #2,14,B ;RND(AA1)
STH A,*AR3+ ;ATMP(IP)=RND(AA0)
b_lev_MH?:
STH B,*AR2- ;ATMP(IB)=RND(AA1)
;MH End

Вот в общем и всё... Один цикл без переполнения аккумуляторов примерно занимает 25 МЦ (при 625 циклах получается 25*625=15625МЦ!!!), причём на команду BC приходится 10 МЦ!!! если это значение уменьшить хотя бы в 2 раза то есть BC=3МЦ то уже получается 21*625=13125МЦ!!! и это уже было бы весело, ну а если ещё меньше, то ещё веселее и т.д. и т.п.

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

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


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

E-mail: info@telesys.ru