Например TDA7294

Форум РадиоКот • Просмотр темы - GCC Inline ассемблер, загрузить константу в регистр
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Пн июл 15, 2019 22:53:23

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


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



Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: GCC Inline ассемблер, загрузить константу в регистр
СообщениеДобавлено: Пн мар 25, 2019 19:12:54 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Пн сен 05, 2011 11:03:06
Сообщений: 151
Откуда: Тула
Рейтинг сообщения: 0
Мне нужно сделать ассемблерную вставку в GCC код. В ассемблерный код передается 32 битная константа, которая загружается в регистр. Процессор - кортекс-м1. В чистом ассемблере загрузка идет как то так:
Код:
    LDR R0,[DAT]
DAT:
    .WORD 0x12345678

Но если я то же самое делаю во встроенном ассемблере:
Код:
    asm(".word %0"
    ::"i"(k)
    );

И вызываю вставку - myasm(0x12345678), то вместо .word 0x12345678 компилятор подставляет константу с решеткой - .word #0x12345678, что является ошибкой. Решетка в этом месте совсем не нужна.
Как мне заставить ассемблер не писать эту решетку?
Или еще какой способ введения константы в регистр подскажите.

_________________
Сопротивлениям слова не давали.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: GCC Inline ассемблер, загрузить константу в регистр
СообщениеДобавлено: Вт мар 26, 2019 15:34:22 
Прорезались зубы

Карма: 9
Рейтинг сообщений: 73
Зарегистрирован: Чт ноя 06, 2014 14:09:06
Сообщений: 219
Рейтинг сообщения: 0
Или еще какой способ введения константы в регистр подскажите.


Я не сильно понял, что Вы хотите, но:
генерит такой ассемблерный код:


Это не то, что Вы хотите?

Да, пролог и эпилог я убрал (__attribute__((naked))) для того, чтобы не выдавать лишнего (что не важно для понимания данного вопроса) в выходной ассемблерный файл.


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

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

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

Не в сети
 Заголовок сообщения: Re: GCC Inline ассемблер, загрузить константу в регистр
СообщениеДобавлено: Вт мар 26, 2019 21:37:27 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Пн сен 05, 2011 11:03:06
Сообщений: 151
Откуда: Тула
Рейтинг сообщения: 0
Я не сильно понял, что Вы хотите, но:

Конкретно, мне нужно формировать точные задержки. Для этого загрузить параметр в регистр, а потом прокрутить цикл. Короче, аналог _delay_us() от WinAVR.
Ваш код работает, фигурные скобки в push/pop добавить только. Но одна проблема, регистр я не выбираю. А это скрытая бомба.
Также работает такой код:
Код:
asm("ldr r0,%0\n\t"::"m"(n));

Здесь регистр контролируется, но опять лишние команды, а это лишние такты. Поэтому хотелось бы получить чистый код.

_________________
Сопротивлениям слова не давали.


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

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

Онлайн просмотровщик Gerber-файлов от PCBWay
Не в сети
 Заголовок сообщения: Re: GCC Inline ассемблер, загрузить константу в регистр
СообщениеДобавлено: Ср мар 27, 2019 01:27:55 
Прорезались зубы

Карма: 9
Рейтинг сообщений: 73
Зарегистрирован: Чт ноя 06, 2014 14:09:06
Сообщений: 219
Рейтинг сообщения: 0
Конкретно, мне нужно формировать точные задержки.

Насколько точные? SysTick Current Value Register не подходит для этих целей?

Но одна проблема, регистр я не выбираю. А это скрытая бомба.

Скрытая бомба, это когда Вы выбираете регистр и его же использует компилятор, не зная что он портится в Вашем asm-коде.

Также работает такой код:
Код:
asm("ldr r0,%0\n\t"::"m"(n));

Здесь регистр контролируется, но опять лишние команды, а это лишние такты. Поэтому хотелось бы получить чистый код.


Опять Вы загадки задаете. Раз уверены, что это можно сделать циклом (никакие кэши/pipeline и прочее не помешают Вам - я не читал Cortex-M1 Technical Reference Manual - мне не надо было), напишите без загадок, какой ассемблерный код должен быть сгенерен. В конце концов можно эту фунцию сделать на чистом asm (не inline).


Вернуться наверх
 
Материалы вебинара: "Литиевые ХИТы FANSO или что нужно знать инженеру о батарейках"

На сайте Компэл доступны материалы вебинара, посвященного литиевым батарейкам FANSO. На мероприятии говорилось о том, на какие параметры следует обращать внимание, выбирая литиевый ХИТ, и как избежать некоторых проблем, затрагивались вопросы тестирования и пассивации батареек, и мн. др.
Вы можете посмотреть видеозапись вебинара, ознакомиться с презентацией и ответами на вопросы.
Подробнее>>
Не в сети
 Заголовок сообщения: Re: GCC Inline ассемблер, загрузить константу в регистр
СообщениеДобавлено: Ср мар 27, 2019 20:26:50 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Пн сен 05, 2011 11:03:06
Сообщений: 151
Откуда: Тула
Рейтинг сообщения: 0
Насколько точные? SysTick Current Value Register не подходит для этих целей?

Меньше микросекунды. SysTick задействован на другие цели.

Цитата:
Скрытая бомба, это когда Вы выбираете регистр и его же использует компилятор, не зная что он портится в Вашем asm-коде.

Вы неправы. Компилятор все знает. Для этого в clobber листе прописываются регистры которые задействованы в ассемблерной вставке.

Цитата:
Опять Вы загадки задаете. Раз уверены, что это можно сделать циклом (никакие кэши/pipeline и прочее не помешают Вам - я не читал Cortex-M1 Technical Reference Manual - мне не надо было), напишите без загадок, какой ассемблерный код должен быть сгенерен. В конце концов можно эту фунцию сделать на чистом asm (не inline).

На чистом asm я не смогу вставить inline код. Только в виде вызова подпрограммы, а в ARMах на вызов и возврат тратится огромное количество тактов, что не приемлемо. А еще придется перед каждым вызовом считать на лету тики,частоты. А в inline коде я это посчитаю на этапе компиляции в дефайнах. Короче идея не годится.
Код если без обвязки, выглядит как то так:

_________________
Сопротивлениям слова не давали.


Вернуться наверх
 
Конденсаторы Panasonic. Часть 1. Алюминий

Известная своими инновациями компания Panasonic даже в столь традиционные изделия как алюминиевые электролитические конденсаторы ухитряется вносить оригинальные и полезные конструктивные дополнения.
Отдельно можно выделить инновационное направление Panasonic, занимающееся разработкой и производством решений по отводу тепла, основу которого составляют специальные графитовые листы (семейство PGS). Емкостное направление Panasonic выпускает полимерные, пленочные и классические электролитические конденсаторы, о которых пойдет речь.
Подробнее>>
Не в сети
 Заголовок сообщения: Re: GCC Inline ассемблер, загрузить константу в регистр
СообщениеДобавлено: Ср мар 27, 2019 20:48:12 
Прорезались зубы

Карма: 9
Рейтинг сообщений: 73
Зарегистрирован: Чт ноя 06, 2014 14:09:06
Сообщений: 219
Рейтинг сообщения: 0
Меньше микросекунды. SysTick задействован на другие цели.

Я говорю, не про прерывния. А про счетчик. Какая на него подана частота? Если у Вас SysTick "тикает", то можно вычислить значение сетчика, при котором надо выходить из цикла ожидания.

Вы неправы. Компилятор все знает. Для этого в clobber листе прописываются регистры которые задействованы в ассемблерной вставке.


Цитата:
Код:
asm("ldr r0,%0\n\t"::"m"(n));

Хм. И где же в Вашем коде указано, что r0 портится?


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


Не в сети
 Заголовок сообщения: Re: GCC Inline ассемблер, загрузить константу в регистр
СообщениеДобавлено: Ср мар 27, 2019 22:42:22 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Пн сен 05, 2011 11:03:06
Сообщений: 151
Откуда: Тула
Рейтинг сообщения: 0
Хм. И где же в Вашем коде указано, что r0 портится?

Глупый вопрос задаете. Это не рабочий код. Вопрос я спрашивал про константу, а уж с клобер листом я сам разберусь.

_________________
Сопротивлениям слова не давали.


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


Не в сети
 Заголовок сообщения: Re: GCC Inline ассемблер, загрузить константу в регистр
СообщениеДобавлено: Пт мар 29, 2019 12:21:49 
Собутыльник Кота
Аватар пользователя

Карма: 25
Рейтинг сообщений: 598
Зарегистрирован: Сб май 14, 2011 22:16:04
Сообщений: 2521
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
paskal писал(а):
Конкретно, мне нужно формировать точные задержки. Для этого загрузить параметр в регистр, а потом прокрутить цикл.
Вы не можете знать точное время выполнения той или иной инструкции в STM32 с его арбитражем шин, временем доступа к памяти программ и регистром предвыборки (не помню его аббревиатуру).

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


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

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

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

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

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

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


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

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


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

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


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