Например TDA7294

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



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

Часовой пояс: 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).


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

Выбор оптимального плавкого предохранителя требует учета многих параметров. Для упрощения выбора оптимального предохранителя и автоматизации расчетов Littelfuse предлагает онлайн-утилиту. Подробнее>>
Не в сети
 Заголовок сообщения: 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 коде я это посчитаю на этапе компиляции в дефайнах. Короче идея не годится.
Код если без обвязки, выглядит как то так:

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


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

Практически во всех радиоэлектронных устройствах массово применяются линейные понижающие стабилизаторы напряжения типа КРЕН в корпусе TO220 (другое обозначение – 78хх) и им подобные для формирования основного напряжения питания схемы.
Данные стабилизаторы позволяют без особых затрат получить нужное для каскада или узла схемы напряжение, если устройство питается от внешнего источника с более высоким напряжением. Для этого требуются… Подробнее>>
Не в сети
 Заголовок сообщения: 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
Сообщений: 2522
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
paskal писал(а):
Конкретно, мне нужно формировать точные задержки. Для этого загрузить параметр в регистр, а потом прокрутить цикл.
Вы не можете знать точное время выполнения той или иной инструкции в STM32 с его арбитражем шин, временем доступа к памяти программ и регистром предвыборки (не помню его аббревиатуру).

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


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

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

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

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

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

Часовой пояс: 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