|
|
Увеличить частоту процессора на плате L-783
Доброе утро!
ВОзникла потребность в увеличении частоты сигнального процессора на плате L-783.
Очень необходимно увеличить его производительность, т.к. во время обработки данных с АЦП, процессор не успевает произвести все расчеты.
Есть ли возможность Увеличить его тактовую частоту??
Заранее спасибо!
|
|
- Инженер-электронщик
- Откуда: "Л Кард"
- Здесь с 21.04.2014
- Сообщений: 4,597
|
Re: Увеличить частоту процессора на плате L-783
Для изделия L-783M разгон предположительно возможен с заменой генератора на другую частоту. Возможен также вариант замены процессора на ADSP-2185N - теоретически это позволило бы удвоить тактовую частоту. Но с организационной точки зрения:
1) Это нужно проверять и тщательно тестировать.
2) Это будет опция L-783M, не совместимая с прежней, хотя бы по сетке частот АЦП/ЦАП.
Экономически проведение таких работ и выпуск опции оправдан только для значительного заказа.
Для старого изделия L-783 разгон технически вряд ли возможен.
|
|
- Сотрудник "Л Кард"
- Здесь с 18.04.2014
- Сообщений: 810
|
Re: Увеличить частоту процессора на плате L-783
Уважаемый Олег,
судя по ветке http://www.lcard.ru/forumthreads/8952 , нехватка производительности процессора может быть и кажущейся.
Скользящее среднее на практике вычисляют не сдвигом всей линии задержки в памяти, а значительно экономнее: хранят сумму и индекс последнего запомненного x в массиве, старое (выбывающее из линии задержки) значение вычитают из суммы, прибавляют новое, записывают новое на место выбывшего, и так циклически для всех элементов массива.
На условном С это выглядит так:
long sum;
int x[NPOINTS];
int x_idx;
void avg_init(void)
{
int i;
for (i = 0; i < NPOINTS; i++)
{
x[i] = 0;
}
x_idx = 0;
sum = 0;
}
int avg_update(int new_x)
{
sum = sum - x[x_idx] + new_x;
x[x_idx] = new_x;
if (++x_idx >= NPOINTS)
x_idx = 0;
return sum / NPOINTS;
}
|
|
- Сотрудник "Л Кард"
- Здесь с 18.04.2014
- Сообщений: 810
|
Re: Увеличить частоту процессора на плате L-783
Остается перевести это на ассемблер, и получится ОЧЕНЬ быстро, буквально несколько команд. Одно вычитание, одно сложение, пара пересылок, инкремент указателя и сдвиг (деление на степень двойки).
Только не забудьте инициализацию, потому что в этом алгоритме критично, чтобы сумма всегда соответствовала содержимому массива (sum = x[0] + .. + x[NPOINTS-1]), в т.ч. изначально. Нули такому условию удовлетворяют.
|
|
|
Re: Увеличить частоту процессора на плате L-783
Доброе утро!
Спасибо за совет, сейчас попробую реализовать!
|
|
|
Re: Увеличить частоту процессора на плате L-783
Доброе утро выполнил так:
int avg_update(int new_x)
{
if (++x_idx >= NPOINTS)
x_idx = 0;
sum = sum - x[x_idx] + new_x;
x[x_idx] = new_x;
return sum / NPOINTS;
}
Так наиболее экономично вышло...
но к сожалению, всё равно этой "экономии" не достаточно...
на ассемблере получилось так:
filter:
{Это идет сравнение "if (++x_idx >= NPOINTS)"}
AX0 = 2504;
AY0 = I4;
AR = AX0 - AY0;
IF EQ JUMP eqq;
JUMP filt_cont;
{это аналог строки "x_idx = 0;"}
eqq:
I4 = DM(filter_base_addr);
{Здесь происходит суммирование и вычитание "sum = sum - x[x_idx] + new_x;
x[x_idx] = new_x;"
}
filt_cont:
M4 = 0x0;
AX0 = DM(filter_sum);
AY0 = MR1;
AR = AX0 + AY0;
AY0 = DM(I4,M4);
AX0 = AR;
AR = AX0 - AY0;
DM(filter_sum) = AR;
M4 = 0x01;
DM(I4,M4) = MR1;
|
|
- Сотрудник "Л Кард"
- Здесь с 18.04.2014
- Сообщений: 810
|
Re: Увеличить частоту процессора на плате L-783
Увы, я не знаток ассемблера AD - это к Сергею.
2504 - это адрес хвоста (filter_base_addr + filter_npoints)?
Вообще у процессора есть аппаратные циклические буфера (регистры Lx) - кстати, для НЕциклической адресации их обязательно инициализировать в 0.
Только надо описать буфер как .var/circ, чтобы линкер правильно память выделил.
Ну и пересылки, может быть, можно как-то сократить.
А Вы точно уверены, что недостаточно *именно времени*? В чем это выражается? Время выполнения обработчика прерывания измеряли?
|
|
- Сотрудник "Л Кард"
- Здесь с 18.04.2014
- Сообщений: 810
|
Re: Увеличить частоту процессора на плате L-783
Например, вот тут
http://window.edu.ru/window_catalog/pdf … 6&p_page=7
посмотрите Листинг 4 и Листинг 5, как реализован data_buffer.
Так отрубаем все до метки filt_cont.
Арифметические операции можно спарить с чтением/записью памяти через многофункциональные инструкции или пересылками регистр-регистр (см. руководство по ADSP).
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 674
|
Re: Увеличить частоту процессора на плате L-783
На первый взгляд оптимальный код для DSP будет раза в 3 короче и быстрее. Общие рекомендации:
1. x_idx является по сути индексом в массиве. Если его аккуратно заменить на Ix регистр, настроив соответственно Mx & Lx то необходимость в "AX0 = 2504; AY0 = I4;AR = AX0 - AY0;IF EQ JUMP qq;JUMP filt_cont;" отпадет сама собой.
2. Постоянно переинициализировать регистр M4 - не есть хорошо. Правильно, определившись с тем, какие приращения индексов могут понадобиться заранее единожды прописать, например M3=0; M4=1; а в цикле использовать DM(I4,M4)=... и ...=DM(I4,M3).
3. Если есть возможность использовать второй банк регистров, то можно разместить константы и все что нужно в одном банке регистров и, переключаясь в начале цикла на банк регистров одной инструкцией, сильно все ускорить.
4. Возможно, разместив filter_sum не в DM, а в PM, Вы сможете сэкономить еще пару интрукций, считывая и записывая эту переменную одновременно со считыванием и записыванием x (процессор позволяет за один такт выполнять 2 операции записи или чтения в разные памяти через I регистры).
|
|
|
Re: Увеличить частоту процессора на плате L-783
Спасибо всем огромное! реализовал этот фильтр 8-ю командами.
Если ва м интересно вот листинг:
filter:
AX0 = DM(filter_sum);
AY0 = MR1;
AR = AX0 + AY0;
AX0 = AR;
AY0 = DM(I4,M7);
AR = AX0 - AY0;
DM(filter_sum) = AR;
DM(I4,M4) = MR1;
Использовал Ix регистры, натсроив Mx & Lx.
Ещё раз спасибо огомное! Надеюсь этого хватит для остальной обработки получаемых данных...
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 674
|
Re: Увеличить частоту процессора на плате L-783
Если не хватит - сообщите, код можно еще подужать инструкции на 3-4.
|