Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


Увеличить частоту процессора на плате L-783

Вы не вошли.

 Поиск | Регистрация | Вход 

OT
02.08.2010 10:25:25
#1

Гость

Увеличить частоту процессора на плате L-783

Доброе утро!
ВОзникла потребность в увеличении частоты сигнального процессора на плате L-783.
Очень необходимно увеличить его производительность, т.к. во время обработки данных с АЦП, процессор не успевает произвести все расчеты.
Есть ли возможность Увеличить его тактовую частоту??
Заранее спасибо!

02.08.2010 10:56:13
#2

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: Увеличить частоту процессора на плате L-783

Для изделия L-783M разгон предположительно возможен с заменой генератора на другую частоту. Возможен также вариант замены процессора на ADSP-2185N - теоретически это позволило бы удвоить тактовую частоту. Но с организационной точки зрения:
1) Это нужно проверять и тщательно тестировать.
2) Это будет опция L-783M, не совместимая с прежней, хотя бы по сетке частот АЦП/ЦАП.
Экономически проведение таких работ и выпуск опции оправдан только для значительного заказа.

Для старого изделия L-783 разгон технически вряд ли возможен.

02.08.2010 11:51:05
#3

Сотрудник "Л Кард"
Здесь с 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;
    }

02.08.2010 12:01:31
#4

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Увеличить частоту процессора на плате L-783

Остается перевести это на ассемблер, и получится ОЧЕНЬ быстро, буквально несколько команд. Одно вычитание, одно сложение, пара пересылок, инкремент указателя и сдвиг (деление на степень двойки).

Только не забудьте инициализацию, потому что в этом алгоритме критично, чтобы сумма всегда соответствовала содержимому массива (sum = x[0] + .. + x[NPOINTS-1]), в т.ч. изначально. Нули такому условию удовлетворяют.

OT
03.08.2010 06:15:31
#5

Гость

Re: Увеличить частоту процессора на плате L-783

Доброе утро!
Спасибо за совет, сейчас попробую реализовать!

OT
09.08.2010 10:34:00
#6

Гость

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;

09.08.2010 13:26:14
#7

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Увеличить частоту процессора на плате L-783

Увы, я не знаток ассемблера AD - это к Сергею.
2504 - это адрес хвоста (filter_base_addr + filter_npoints)?

Вообще у процессора есть аппаратные циклические буфера (регистры Lx) - кстати, для НЕциклической адресации их обязательно инициализировать в 0.
Только надо описать буфер как .var/circ, чтобы линкер правильно память выделил.
Ну и пересылки, может быть, можно как-то сократить.

А Вы точно уверены, что недостаточно *именно времени*? В чем это выражается? Время выполнения обработчика прерывания измеряли?

09.08.2010 13:40:19
#8

Сотрудник "Л Кард"
Здесь с 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).

10.08.2010 07:49:08
#9

Сотрудник "Л Кард"
Здесь с 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 регистры).

OT
12.08.2010 12:26:52
#10

Гость

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.
Ещё раз спасибо огомное! Надеюсь этого хватит для остальной обработки получаемых данных...

13.08.2010 07:21:11
#11

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 674

Re: Увеличить частоту процессора на плате L-783

Если не хватит - сообщите, код можно еще подужать инструкции на 3-4.