Например TDA7294

Форум РадиоКот • Просмотр темы - Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Сб авг 08, 2020 12:17:48

Часовой пояс: UTC + 3 часа


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



Начать новую тему Ответить на тему  [ Сообщений: 70 ]    , 2, ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Пт ноя 22, 2019 15:04:36 
Мучитель микросхем

Карма: -14
Рейтинг сообщений: 1
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 464
Рейтинг сообщения: 0
GCC и нет проблем.

Думаете - он компилит оптимальнее?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Пт ноя 22, 2019 15:59:18 
Вымогатель припоя

Карма: 4
Рейтинг сообщений: 40
Зарегистрирован: Пт янв 30, 2009 14:50:35
Сообщений: 619
Откуда: Солнечногорск
Рейтинг сообщения: 0
Несколько лет назад GCC давал отвратительный код; не думаю, чтобы что-то сильно изменилось. Кейловский (родной, не Кланг) куда лучше выдавал, но там другая проблема: АРМ забила на свой компилятор и переключилась на Кланг, который нередко выдаёт менее качественный код. Вообще, не помнить содержимое регистров и повторно производить загрузки или же заниматься бесполезными пересылками из регистра в регистр -- это нынче норма жизни для компиляторов.


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

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

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

Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Пт ноя 22, 2019 17:29:24 
Опытный кот

Карма: 3
Рейтинг сообщений: 224
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 876
Рейтинг сообщения: 0
А можно какой-нибудь пример подобного кода, который будет неэффективно скомпилен? Не ради докопаться или поспорить, но любопытно и правда посмотреть, попробовать разобраться. Может там ключиками решается или еще что. Да и просто знать подобные подводные камни.


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

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

Онлайн просмотровщик Gerber-файлов от PCBWay + Шестое юбилейное мероприятие в процессе
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Пт ноя 22, 2019 18:06:39 
Мучитель микросхем

Карма: -14
Рейтинг сообщений: 1
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 464
Рейтинг сообщения: 0
А можно какой-нибудь пример подобного кода, который будет неэффективно скомпилен? Не ради докопаться или поспорить, но любопытно и правда посмотреть, попробовать разобраться. Может там ключиками решается или еще что. Да и просто знать подобные подводные камни.
Например вот вчера наткнулся:
Код:
 uint c = 3 - Pval(PIN_PRND_F);                       
0xF8D5 0x2524      LDR      R2,[R5, #+1316]       
0xF3C2 0x2280      UBFX     R2,R2,#+10,#+1       
0xF1C2 0x0203      RSB      R2,R2,#+3             
 c -= Pval(PIN_PRND_B) * 2;                       
0xF8D5 0x3624      LDR      R3,[R5, #+1572]       
0x005B             LSLS     R3,R3,#+1             
0xF003 0x0302      AND      R3,R3,#0x2           
0x1AD3             SUBS     R3,R2,R3

Pval() - это у меня макрос чтения состояния одного бита порта GPIO (этот макрос для PIN_PRND_B должен развернуться в
(*(u32 volatile *)IO_ADDR >> 0 & 1).
Как видно - строчку "c -= Pval(PIN_PRND_B) * 2" я написал специально с таким расчётом, чтобы компилятор после LDR сделал всего две команды: выделение бита из считанного слова и вычитание его из c (думал помочь ему :roll: ). Но он зачем-то влепил 3 команды. :facepalm:


Вернуться наверх
 
Вебинар «Каждому ключу — свой драйвер» (13.08.2020)

Компания КОМПЭЛ приглашает вас принять участие в вебинаре, который будет посвящен теме драйверов управления транзисторами компании Infineon. Мы рассмотрим четыре различных технологии изготовления микросхем драйверов, в чём их отличия и особенности.

Зарегистрироваться на вебинар>>
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Пт ноя 22, 2019 18:38:35 
Сверлит текстолит когтями
Аватар пользователя

Карма: 10
Рейтинг сообщений: 145
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 1122
Рейтинг сообщения: 0
jcxz, а можно твой вариант, как ты хотел чтобы было?


Вернуться наверх
 
Новый ХИТ FANSO CR123A/SN

Параметры новой батарейки показывают прекрасные результаты. Она используется для приложений с повышенными импульсами тока. Широко применяется в охранно-пожарных датчиках, устройствах телеметрии, поисковых маячках, LED-фонарях и других промышленных и бытовых устройствах.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Пт ноя 22, 2019 18:42:40 
Опытный кот

Карма: 3
Рейтинг сообщений: 224
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 876
Рейтинг сообщения: 0
Дык volatile же. Поэтому всё строго. Сначала свдиг, потом И.


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


Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Пт ноя 22, 2019 18:51:09 
Сверлит текстолит когтями
Аватар пользователя

Карма: 10
Рейтинг сообщений: 145
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 1122
Рейтинг сообщения: 0
После чтения из IO в регистр никакого volatile больше нет.


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


Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Пт ноя 22, 2019 21:08:56 
Мучитель микросхем

Карма: -14
Рейтинг сообщений: 1
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 464
Рейтинг сообщения: 0
jcxz, а можно твой вариант, как ты хотел чтобы было?

Ну как минимум для строчки "c -= Pval(PIN_PRND_B) * 2" я ожидал чего-то типа:
Код:
LDR      R3, [R5, #+1572]
AND      R3, R3, #0x1
SUBS     R3, R2, R3, LSL #1
или:
Код:
LDR      R3, [R5, #+1572]
UBFX     R3, R3, #0, #1
SUBS     R3, R2, R3, LSL #1
т.е. - 2 команды, по 4 байта каждая.
А в идеале я конечно хотел бы увидеть:
Код:
LDR      R3,[R5, #+1572]
LSLS     R3, R3, #31
ADDS     R3, R2, R3, ASR #30
т.е. - 2 команды, 2+4 байта. Но на такое я уже не надеялся практически. Так только человек сможет оптимизировать. 8)

Добавлено after 11 minutes 30 seconds:
Дык volatile же. Поэтому всё строго. Сначала свдиг, потом И.
volatile действует только на операции доступа к памяти - не должен меняться их порядок. А к содержимому регистров отношения не имеет. Что и подтверждается компиляцией того же самого кода в режиме максимальной оптимизации, при которой компилятор создаёт те же самые команды, только вначале ставит обе LDR одна за другой, а потом после - все остальные арифметические команды:
Код:
 uint c = 3 - Pval(PIN_PRND_F);                   
0xF8D5 0x2524      LDR      R2,[R5, #+1316] 
 c -= Pval(PIN_PRND_B) * 2;                 
0xF8D5 0x3624      LDR      R3,[R5, #+1572] 
0xF3C2 0x2280      UBFX     R2,R2,#+10,#+1   
0x005B             LSLS     R3,R3,#+1       
0xF1C2 0x0203      RSB      R2,R2,#+3       
0xF003 0x0302      AND      R3,R3,#0x2       
0x1AD6             SUBS     R6,R2,R3

Это High-Balanced оптимизация (то что выше было на Medium). Как видно - ума она компилятору не добавила, он просто переставил команды и всё.


Вернуться наверх
 
Бытовой пирометр АКИП-9312 – просто удобно!

Диапазон 35 °С ...42°С (температура тела) погрешность 0,3 °С
Диапазон 0 °С ...100°С (бытовая сфера) погрешность 1,0 °С
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Пт ноя 22, 2019 21:27:13 
Сверлит текстолит когтями
Аватар пользователя

Карма: 10
Рейтинг сообщений: 145
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 1122
Рейтинг сообщения: 0
т.е. - 2 команды, по 4 байта каждая.
Размер кода тот же. Биться об заклад не буду, но что-то мне подсказывает, что и выполняться он будет за то же время.


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


Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Пт ноя 22, 2019 23:03:53 
Мучитель микросхем

Карма: -14
Рейтинг сообщений: 1
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 464
Рейтинг сообщения: 0
Размер кода тот же. Биться об заклад не буду, но что-то мне подсказывает, что и выполняться он будет за то же время.
В смысле "тот же"? Кто с кем?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Сб ноя 23, 2019 02:16:59 
Вымогатель припоя

Карма: 4
Рейтинг сообщений: 40
Зарегистрирован: Пт янв 30, 2009 14:50:35
Сообщений: 619
Откуда: Солнечногорск
Рейтинг сообщения: 0
jcxz, а можно твой вариант, как ты хотел чтобы было?

Ну как минимум для строчки "c -= Pval(PIN_PRND_B) * 2" я ожидал чего-то типа:
Код:
LDR      R3, [R5, #+1572]
AND      R3, R3, #0x1
SUBS     R3, R2, R3, LSL #1

или:
Код:
LDR      R3, [R5, #+1572]
UBFX     R3, R3, #0, #1
SUBS     R3, R2, R3, LSL #1
т.е. - 2 команды, по 4 байта каждая.
А в идеале я конечно хотел бы увидеть:
Код:
LDR      R3,[R5, #+1572]
LSLS     R3, R3, #31
ADDS     R3, R2, R3, ASR #30
т.е. - 2 команды, 2+4 байта. Но на такое я уже не надеялся практически. Так только человек сможет оптимизировать.


Что касается последнего варианта, то он не всегда оптимален: зависит от конкретного варианта конкретного ядра. Дело в том, что многоразрядный сдвиг за 1 такт требует соответствующего сдвигателя, а им могут пожертвовать для уменьшения размеров проца. И тогда LSLS будет сдвигать по одному биту за такт :) Зато если есть гарантия, что сдвиг будет за 1 такт, он действительно лучший (те же 2 такта, не считая собственно выборки из памяти, но 6 байтов, а не 8 ).


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Сб ноя 23, 2019 11:57:18 
Собутыльник Кота
Аватар пользователя

Карма: 7
Рейтинг сообщений: 114
Зарегистрирован: Пн окт 11, 2010 19:00:08
Сообщений: 2937
Рейтинг сообщения: 0
Результат GCC.
Код:
   uint32_t c = 3 - Pval(PIN_PRND_F);
   ldr   r2, [pc, #108]   ; (0x20000338 <main+112>)
   ldr   r3, [r2, #0]
   ands   r3, r1
   rsb   r3, r3, #3

   c -= Pval(PIN_PRND_B) * 2;
   ldr   r0, [pc, #104]   ; (0x2000033c <main+116>)
   ldr   r4, [r0, #0]
   ands   r4, r1
   sub.w   r3, r3, r4, lsl #1


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Сб ноя 23, 2019 15:18:16 
Открыл глаза
Аватар пользователя

Зарегистрирован: Вс окт 20, 2019 13:03:56
Сообщений: 53
Рейтинг сообщения: 0
А вот хотел спросить, вообще есть какая нибудь книга, или руководство по программированию этих стм32 на Си, вроде Фрунзе и Магды для 8051, или Ревича и Белова для AVR?
Я так понимаю, про комповый Си (как и про комповый ассемблер) читать бесполезно, там все по-другому.


Последний раз редактировалось Shuspano Сб ноя 23, 2019 15:20:37, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Сб ноя 23, 2019 15:19:22 
Вымогатель припоя

Зарегистрирован: Пт июл 12, 2019 22:52:01
Сообщений: 596
Рейтинг сообщения: 0
А чем же "комповый" С отличается от "железячного"?
Абсолютно одно и то же!

_________________
Я на гитхабе, в ЖЖ


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Сб ноя 23, 2019 15:22:17 
Открыл глаза
Аватар пользователя

Зарегистрирован: Вс окт 20, 2019 13:03:56
Сообщений: 53
Рейтинг сообщения: 0
А чем же "комповый" С отличается от "железячного"?
Абсолютно одно и то же!

Разьве? Разьве там есть такое?
Код:
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOC, &GPIO_InitStructure);


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Сб ноя 23, 2019 15:27:21 
Собутыльник Кота
Аватар пользователя

Карма: 7
Рейтинг сообщений: 114
Зарегистрирован: Пн окт 11, 2010 19:00:08
Сообщений: 2937
Рейтинг сообщения: 0
Shuspano писал(а):
Разве там есть такое?
Разве в комповом Си нет функций и структур?

То что вы спрашиваете относится не к языку Си, а в библиотеке SPL.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Сб ноя 23, 2019 15:30:40 
Открыл глаза
Аватар пользователя

Зарегистрирован: Вс окт 20, 2019 13:03:56
Сообщений: 53
Рейтинг сообщения: 0
Shuspano писал(а):
Разве там есть такое?
Разве в комповом Си нет функций и структур?

То что вы спрашиваете относится не к языку Си, а в библиотеке SPL.

Да мне пока без разницы. Щас пока беспокоит вопрос: где и как узнать, что собственно писать, где описаны эти инструкции.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Сб ноя 23, 2019 17:57:08 
Мучитель микросхем

Карма: -14
Рейтинг сообщений: 1
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 464
Рейтинг сообщения: 0
Что касается последнего варианта, то он не всегда оптимален: зависит от конкретного варианта конкретного ядра.
Мы обсуждаем работу компилятора при создании кода для конкретного ядра CM4F (указанного в свойствах проекта). Компилятор имхо должен проводить оптимизацию под конкретное ядро, а не под коня в вакууме. А в CM4F все использованные команды (кроме LDR) - однотактные.

Добавлено after 15 minutes 29 seconds:
Результат GCC.
Неправильно скомпилили.
Во-первых: Если посмотреть на тот код, что я приводил, видно что PIN_PRND_B - выделяет 0-й бит из некоего IO-порта, а PIN_PRND_F - 10-й бит из другого IO-порта. у Вас в обоих случаях выделяется 0-й бит. Поэтому компилятор выполнил оптимизацию, видимо поместив #1 в R1.
Во-вторых: Где-то до этого кода должна быть загрузка #1 в R1 (MOVS R1, #1) которую Вы не привели - а это ещё одна команда.
В-третьих: Странно что компилятор у Вас выполнил загрузку #1 в R1, а потом сделал AND с R1. В сумме это требует 3 команды, в то время как с константой #1 в коде команды это можно было сделать за 2 команды. Или у Вас включена оптимизация по размеру, а не по скорости, или выбрано неправильное ядро (не CM3, CM4F).
В-четвёртых: Компилятор у Вас зачем то перегружал повторно указатель, потратив на это лишние команды LDR. Возможно как-то неправильно объявлен указатель на IO-порт. Хотя это уже и не относится к вопросу....

Добавлено after 2 minutes 8 seconds:
Да мне пока без разницы. Щас пока беспокоит вопрос: где и как узнать, что собственно писать, где описаны эти инструкции.
Читать мануал на желаемый МК, мануал на ядро и посмотреть примеры программ для данного МК. Ну и подучить си конечно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Сб ноя 23, 2019 18:08:41 
Грызет канифоль

Карма: -3
Рейтинг сообщений: 2
Зарегистрирован: Вс сен 05, 2010 15:35:50
Сообщений: 299
Рейтинг сообщения: 0
>> Читать мануал на желаемый МК, мануал на ядро и посмотреть примеры программ для данного МК. Ну и подучить си конечно.

Я так понял, человек не про это спрашивает. Интересует что-то, где хорошо описывалось бы программирование для STM со всеми его библиотеками и периферией.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Сб ноя 23, 2019 19:52:05 
Открыл глаза
Аватар пользователя

Зарегистрирован: Вс окт 20, 2019 13:03:56
Сообщений: 53
Рейтинг сообщения: 0
Фух... вроде мигает. Да, от знания асма толку никакого вообще. Ну да ладно.
мне вот интересен еще момент. Почему если подпрограмму пишу где нить внизу листинга, а вызываю ее где нибудь вверху, например:
Код:
while (1)
{
...
delay(8000000);
...
}

void delay(uint16_t time)
{}

то транслятор ругается. Транслирует, но в итоге задержка не работает. А в асме это не разу не проблема.


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

Часовой пояс: UTC + 3 часа


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

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


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

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


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