Например TDA7294

Форум РадиоКот • Просмотр темы - Косвенная адресация в STM32F4
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Вс июл 21, 2019 05:02:30

Часовой пояс: UTC + 3 часа [ Летнее время ]


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Косвенная адресация в STM32F4
СообщениеДобавлено: Сб окт 06, 2012 08:19:46 
Вымогатель припоя

Карма: 4
Рейтинг сообщений: 14
Зарегистрирован: Вт июн 29, 2010 13:31:49
Сообщений: 627
Рейтинг сообщения: 0
Подскажите, пожалуйста, как включить сабж в кейле?
Пробовал так [R0] и так @R0, не катит. На сайте кейла по запросам addressing modes и indirect addressing ничего толкового.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Косвенная адресация в STM32F4
СообщениеДобавлено: Сб окт 06, 2012 17:26:21 
Сверлит текстолит когтями
Аватар пользователя

Карма: 4
Рейтинг сообщений: 28
Зарегистрирован: Ср янв 05, 2011 17:25:15
Сообщений: 1163
Рейтинг сообщения: 0
наберите в поисковике arm assembler instruction и произойдет чудо.....


Вернуться наверх
 
JLCPCB, всего $2 за прототип печатной платы! Цвет - любой!

Отличное качество, подтвержденное более чем 600,000 пользователей! Более 10,000 заказов в день.

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/quote

Не в сети
 Заголовок сообщения: Re: Косвенная адресация в STM32F4
СообщениеДобавлено: Сб окт 06, 2012 18:01:02 
Вымогатель припоя

Карма: 4
Рейтинг сообщений: 14
Зарегистрирован: Вт июн 29, 2010 13:31:49
Сообщений: 627
Рейтинг сообщения: 0
Спасибо.
Не сразу, но нашёл такое: http://www.keil.com/support/man/docs/armasmref/armasmref_CIHGCADB.htm.
Попробую, учитывая особенности архитектуры (F4 умеет только thumb2, как я понял).


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $88 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay
Не в сети
 Заголовок сообщения: Re: Косвенная адресация в STM32F4
СообщениеДобавлено: Вс окт 07, 2012 10:38:07 
Вымогатель припоя

Карма: 4
Рейтинг сообщений: 14
Зарегистрирован: Вт июн 29, 2010 13:31:49
Сообщений: 627
Рейтинг сообщения: 0
Похоже, не все команды умеют работать с косвенной адресацией.
Но LDR вполне работает. Пока на этом остановлюсь.


Вернуться наверх
 
Плавкие предохранители LittelFuse. Грамотный подбор

Выбор оптимального плавкого предохранителя требует учета многих параметров. Для упрощения выбора оптимального предохранителя и автоматизации расчетов Littelfuse предлагает онлайн-утилиту. Подробнее>>
Не в сети
 Заголовок сообщения: Re: Косвенная адресация в STM32F4
СообщениеДобавлено: Вс окт 07, 2012 12:54:18 
Вымогатель припоя

Карма: 4
Рейтинг сообщений: 14
Зарегистрирован: Вт июн 29, 2010 13:31:49
Сообщений: 627
Рейтинг сообщения: 0
Чтоб не создавать ещё тему, спрошу здесь.
Нижеприведённый код описывает перемножение с накоплением массива с замерами сигнала по массивам синусов и косинусов, затем вычисляется значение амплитуды.

Код:
Sqrt    PROC

label0
         LDR R4, [R2,R3]
      
         LDR R6, [R0,R3]
         LDR R7, [R1,R3]
      
         SMLAL R8, R9, R4, R6
         SMLAL R10, R11, R4, R7
      
        CBZ R3, label1
        SUB R3, #4
        B label0   
      
label1
        VMOV S0, S1, R8, R9
        VMOV S2, S3, R10, R11
      
        ???   
            
        VMUL.F32 S0,S0,S0
        VMUL.F32 S1,S1,S1
        VADD.F32 S0,S0,S1
        VSQRT.F32 S0,S0
      
        BX  LR
      
ENDP


Получается что-то вроде БПФ с фильтрацией. Впрочем, теория не важна. Запинка случилась там, где в коде вопросительные знаки. Дело в том, что по инструкции SMLAL заполняются два регистра ядра - старшее и младшее слово.
По VMOV окончательные суммы передаются в FPU. Далее нужно взять квадраты этих чисел, сложить и взять из них корень.
Однако команды FPU работают только с одиночными регистрами, а суммы, с которыми требуется проводить операции, лежат в двух каждая. Есть какой-нибудь способ обойти это в асме, или придётся вылезать в С? Судя по осциллографу, получается приличная экономия: 40 мкс в чистом асме против 100 для того же алгоритма в С (хотя кто знает, может с костылями то же получится?).


Вернуться наверх
 
Немногим дороже дискретного решения: новое поколение импульсных стабилизаторов Mornsun

Практически во всех радиоэлектронных устройствах массово применяются линейные понижающие стабилизаторы напряжения типа КРЕН в корпусе TO220 (другое обозначение – 78хх) и им подобные для формирования основного напряжения питания схемы.
Данные стабилизаторы позволяют без особых затрат получить нужное для каскада или узла схемы напряжение, если устройство питается от внешнего источника с более высоким напряжением. Для этого требуются… Подробнее>>
Не в сети
 Заголовок сообщения: Re: Косвенная адресация в STM32F4
СообщениеДобавлено: Пн окт 08, 2012 09:05:27 
Вымогатель припоя
Аватар пользователя

Карма: 7
Рейтинг сообщений: 56
Зарегистрирован: Вт авг 28, 2012 23:21:33
Сообщений: 538
Рейтинг сообщения: 0
Мне не совсем понятен код. Сначала ты выполняешь целочисленное умножение 32х32=64. А потом кладешь целочисленный же результат в регистр FPU. Если я не ошибаюсь, то VMOV просто копирует данные, она не переведет целочисленное значение в формат IEEE754. Это твоего вопроса не касается, просто непонятка.

Ну а что касается вопроса - я вижу несколько вариантов.
Первое - оставить все как есть и использовать программную конвертацию int64 во float. Не знаю, есть ли такая функция в компиляторе или нет. Естесственно о скорости можно забыть. Хотя... Надо эксперементировать.
Второе - если твои операнды в сумме (я про длину) меньше 64 бит, то можно использовать не 32х32=64, а 32х32=32 умножение. Результат, опять же, придется переводить во float. Но здесь уже легче, ибо компилятор стопроцентно поддерживает такое преобразование, а самое главное, что есть аппаратная инструкция конвертации VCVT (почитай про нее в даташите).


Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: Косвенная адресация в STM32F4
СообщениеДобавлено: Пн окт 08, 2012 12:00:23 
Сверлит текстолит когтями
Аватар пользователя

Карма: 4
Рейтинг сообщений: 28
Зарегистрирован: Ср янв 05, 2011 17:25:15
Сообщений: 1163
Рейтинг сообщения: 0
Цитата:
Однако команды FPU работают только с одиночными регистрами, а суммы, с которыми требуется проводить операции, лежат в двух каждая.
... сам то понял, что написал? FPU работает через стек. Чтобы избежать ненужных вопросов посоветую старую книжку - "Архитектура и программирование арифметического сопроцессора" Григорьев В.Л. Хотя там описан i8087, но принцип тот же.


Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: Косвенная адресация в STM32F4
СообщениеДобавлено: Пн окт 08, 2012 16:53:06 
Вымогатель припоя
Аватар пользователя

Карма: 7
Рейтинг сообщений: 56
Зарегистрирован: Вт авг 28, 2012 23:21:33
Сообщений: 538
Рейтинг сообщения: 0
ChipKiller писал(а):
сам то понял, что написал? FPU работает через стек.

Ну так-то он все правильно сказал. В Cortex-M4 есть регистры R0...Rn, которые могут быть операндами целочисленных инструкций, и регистры S0...Sn, которые могут быть операндами FPU инструкций. Причем здесь стек мне не совсем понятно.


Вернуться наверх
 
Prist.ru предлагает скидку всем частным лицам при покупке приборов АКИП, GW Instek, APPA (кроме осциллографов АКИП-4115/1А, GDS-71102)!

Интересные новинки уже на складе:

Осциллограф АКИП-4126Е

Многоканальные источники питания серии GPP

Не в сети
 Заголовок сообщения: Re: Косвенная адресация в STM32F4
СообщениеДобавлено: Пн окт 08, 2012 17:31:35 
Сверлит текстолит когтями
Аватар пользователя

Карма: 4
Рейтинг сообщений: 28
Зарегистрирован: Ср янв 05, 2011 17:25:15
Сообщений: 1163
Рейтинг сообщения: 0
menzoda писал(а):
Причем здесь стек мне не совсем понятно.
TripleKill писал(а):
.....Однако команды FPU работают только с одиночными регистрами, а суммы, с которыми требуется проводить операции, лежат в двух каждая. Есть какой-нибудь способ обойти это в асме, или придётся вылезать в С?
... речь шла о VPUSH,VPOP ....может не совсем понятно выразился - пардон.


Вернуться наверх
 
Купить электронные компоненты в LCSC

Отправка со склада через 4 часа после заказа!
900 000 пользователей, 3000+ заказов в день!
Зарегистрируйтесь сегодня и получите скидку 8 долларов на первый заказ!
Не в сети
 Заголовок сообщения: Re: Косвенная адресация в STM32F4
СообщениеДобавлено: Ср окт 10, 2012 07:09:25 
Вымогатель припоя

Карма: 4
Рейтинг сообщений: 14
Зарегистрирован: Вт июн 29, 2010 13:31:49
Сообщений: 627
Рейтинг сообщения: 0
Всем спасибо.
Действительно, VMOV просто копирует данные, в итоге получается фигня.
Процедуру разделил вылазкой в С, т.е. из кода вызывается сначала MAC, потом операции с корнем. Зато передаётся всё как нужно.

Позже оказалось, что суперская точность тут не нужна (код по работе, проталкиваю STM32 как более современный), и результат MAC можно сдвинуть вправо, оставив только старшие разряды в одном 32-битном регистре. SMLAL остаётся на месте, просто потом производятся манипуляции с двумя регистрами результата.

Итого: +4 мкс из-за лишних телодвижений, и всё равно STM уделывает XC166) У обоих время преобразования в районе 80-90 мкс (на два канала), при том, что стм обрабатывает массив из 100 измерений по каналу, а с166 - из 39.

Есть вопрос по косметике. Вот код в С:

Код:
STM_EVAL_LEDOn(LED3);
   MacOp(POS1_isintable, POS1_icostable, samples, (POS1_FFTLENGTH-1)*4);
   
   f1[0] = R8;
   f1[1] = R10;
   
   f2[0]=(float)f1[0];
   f2[1]=(float)f1[1];
   
   w1=(float)Ampl(f2[0], f2[1]);
   STM_EVAL_LEDOff(LED3);


Как видно, сначала данные из регистров вытаскиваются в массив int, потом преобразуются и попадают в массив float. Казалось, почему бы передачу типа не сделать в вызове процедуры Ampl, да и вообще, обойтись без массивов? Однако компилятор ни то, ни другое не проглатывает (w1 не изменяется вообще), а вот как приведено - работает. В чём тут может быть дело? К слову, если сделать не массив f1, а две переменные int, то даже из регистров данные не вытаскиваются.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Косвенная адресация в STM32F4
СообщениеДобавлено: Ср окт 10, 2012 08:52:28 
Вымогатель припоя
Аватар пользователя

Карма: 7
Рейтинг сообщений: 56
Зарегистрирован: Вт авг 28, 2012 23:21:33
Сообщений: 538
Рейтинг сообщения: 0
К сожалению, у меня нет под рукой компилятора, чтобы посмотреть в чем проблема. Но какая-то она странная, ведь так не должно быть. Посмотри что за ассемблер он генерирует из твоей Си-вставки. И может быть вообще ее убрать? Я же нашел ассемблерную инструкцию конвертации во float, чего ее не использовать?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Косвенная адресация в STM32F4
СообщениеДобавлено: Ср окт 10, 2012 10:32:52 
Мучитель микросхем

Карма: 11
Рейтинг сообщений: 34
Зарегистрирован: Ср окт 15, 2008 10:33:03
Сообщений: 443
Откуда: Воронеж
Рейтинг сообщения: 0
Если код действительно только такой
ChipKiller писал(а):
w1=(float)Ampl(f2[0], f2[1]);

То компилятор должен давать предупреждение - отсутствие предварительной декларации функции Ampl. Без этого компилятор не знает, какие типы аргументов у функции и предполагает, что Вы подсовываете правильные типы.
Необходимо сделать h файл в который поместить декларацию.
float Ampl(float, float);
Включить этот h айл в c файл.
После этого преобразования типов должны выполняться компилятором неявно.
И вообще выносить декларации в h файлы - это правильный стиль. Когда нибудь это спасет Вас от поиска непонятного поведения в течение нескольких дней.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Косвенная адресация в STM32F4
СообщениеДобавлено: Ср окт 10, 2012 11:12:57 
Вымогатель припоя

Карма: 4
Рейтинг сообщений: 14
Зарегистрирован: Вт июн 29, 2010 13:31:49
Сообщений: 627
Рейтинг сообщения: 0
Функция естественно задекларирована. Буду пробовать с VCVT.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Косвенная адресация в STM32F4
СообщениеДобавлено: Ср окт 10, 2012 14:16:48 
Вымогатель припоя
Аватар пользователя

Карма: 7
Рейтинг сообщений: 56
Зарегистрирован: Вт авг 28, 2012 23:21:33
Сообщений: 538
Рейтинг сообщения: 0
Galizin писал(а):
И вообще выносить декларации в h файлы - это правильный стиль. Когда нибудь это спасет Вас от поиска непонятного поведения в течение нескольких дней.


Это точно. Я как-то раз два дня подряд мучался. Оказывается не включил H-файл. Главное компилятор, зараза, не сказал ни слова, обычно то они предупреждают о таком, дескать "Function declared implicitly".


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Косвенная адресация в STM32F4
СообщениеДобавлено: Чт окт 11, 2012 09:53:35 
Вымогатель припоя

Карма: 4
Рейтинг сообщений: 14
Зарегистрирован: Вт июн 29, 2010 13:31:49
Сообщений: 627
Рейтинг сообщения: 0
Всем спасибо за помощь, всё разместилось в одной функции и выглядит так:

Код:
ExtractAmp   PROC

      MOV R8, #0
      MOV R9, #0
      MOV R10, #0
      MOV R11, #0
      
      
label0
      LDR R4, [R2,R3]
      
      LDR R6, [R0,R3]
      LDR R7, [R1,R3]
      
      SMLAL R8, R9, R4, R6
      SMLAL R10, R11, R4, R7
      
      CBZ R3, label1
      SUB R3, #4
      B label0
      
label1
       
      LSR R8, #4
      LSL R9, #28
      ADD R8, R8, R9
      
        LSR R10, #4
      LSL R11, #28
      ADD R10, R10, R11
      
      VMOV S0, R8
      VCVT.F32.S32 S0, S0
      
      VMOV S1, R10
      VCVT.F32.S32 S1, S1
      
      VMUL.F32 S0,S0,S0
      VMUL.F32 S1,S1,S1
      VADD.F32 S0,S0,S1
        VSQRT.F32 S0,S0
      
      BX  LR
      
      ENDP


Однако компилятор как-то странно себя ведёт)
Вот код, которым я замеряю время выполнения преобразования.

Код:
while(1) {   
            
   STM_EVAL_LEDOn(LED3);
   w1=ExtractAmp(POS1_isintable, POS1_icostable, samples, (POS1_FFTLENGTH-1)*4);
   STM_EVAL_LEDOff(LED3); 
   
   
}


Переменная w1 в дебаге не меняет значения, с которым была инициализирована. Я было подумал, что компилятор понимает, что раз я кручусь в бесконечном цикле, и далее нигде переменную не вызываю, то и обрабатывать её не стоит. Видоизменил код, чтоб цикл выполнялся конечное число раз, а w1 дальше вызывалась. Но ничего не изменилось.
Если же я вызываю функцию до цикла, в самом main, то w1 изменяется. Что тут не так? Кроме того, изменяя код функции, при работе цикла я вижу изменение по времени, т.е. код-то вроде как работает. Почему тогда w1 не меняется? Или это дебагер гадит и не показывает?

P.S. Проверил диодом:

Код:
if (w1>(float)100500) STM_EVAL_LEDOn(LED5);


Похоже, всё-таки дебагер. Досадно. Ну хоть переменная меняется на самом деле.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y