|
STM32 Ассемблер. Идеи и приёмы написания, Правила хорошего тона и макросы |
|
|
|
Jan 15 2014, 22:50
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 22-01-13
Пользователь №: 75 284

|
По ассемблеру для арм документации и разного рода примеров гораздо меньше для С. Начал осваивать и возникли сомнения, правильный ли подход частого использования макросов и где та грань, свыше которой не стоит заморачиваться с написанием кода. В ассемблера я не силён, в основном по-любительски пишу на С. Но вот раз начал осваивать асм, сделал несколько элементарных макросов для битовых операций, настройки и использования портов. Вопрос в том правильно ли это делать и использовать таким образом (когда в коде используются много макросов), или может быть есть более рациональный способ, как лучше писать на асме для арм. Вот примерчик: STM32F100RB. И что конкретно делает команда bfi R1,R2,#$Pin,#4 ? Определение макросов: Код ;-------------------------------------- ;Start_GPIO_Conf $Port,$PinRange - начало настройки порта, где $Port - имя порта (GPIOA,..), $PinRange - верхняя/нижняя тетрада порта (GPIO_CR_H/GPIO_CR_L) macro Start_GPIO_Conf $Port,$PinRange mov32 R0,#$Port ;загружаем в регистр "R0" имя порта (его код) из памяти ldr R1,[R0,#$PinRange];загружаем в регистр "R1" значение по адресу из памяти "R0 + #GPIO_CR_H(0x00)" или "R0 + #GPIO_CR_H(0x04)" mend ;-------------------------------------- ;GPIO_Conf $Pin,$Mode - настройка ножек выбраного порта, где $Pin - номер ножки (CNF_Pin_0,..), $Mode - режим ножки (GPIO_OUT_50_PP,..) macro PinConfig $Pin,$Mode movs R2,#$Mode bfi R1,R2,#$Pin,#4 mend ;-------------------------------------- ;End_GPIO_Conf $Port,$PinRange - конец настройки порта, где $Port - имя порта (GPIOA,..), $PinRange - верхняя/нижняя тетрада порта (GPIO_CR_H/GPIO_CR_L) macro End_GPIO_Conf $Port,$PinRange str R1,[R0,#$PinRange];загружаем в память по адресу "R0 + #GPIO_CR_H(0x00)" или "R0 + #GPIO_CR_H(0x04)" значение "R1" mend ;-------------------------------------- ;SetBit_GPIO $Port,$Pin macro SetBit_GPIO $Port,$Pin mov32 R0,#($Port + GPIO_BSRR) mov32 R1,#$Pin str R1,[R0] mend ;-------------------------------------- ;ResetBit_GPIO $Port,$Pin macro ResetBit_GPIO $Port,$Pin mov32 R0,#($Port + GPIO_BRR) mov32 R1,#$Pin str R1,[R0] mend ;-------------------------------------- Использование в программе: Код ;-------------------------------------- Start_GPIO_Conf GPIOC,GPIO_CR_H PinConfig CNF_Pin_9,GPIO_OUT_50_PP PinConfig CNF_Pin_8,GPIO_OUT_50_PP End_GPIO_Conf GPIOC,GPIO_CR_H ;-------------------------------------- SetBit_GPIO GPIOC,PIN9 SetBit_GPIO GPIOC,PIN8 ;-------------------------------------- Пробный проект в Keil 5 прикреплен:
Сообщение отредактировал allsettingsdone - Jan 15 2014, 22:55
|
|
|
|
|
 |
Ответов
|
Jan 16 2014, 07:40
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(allsettingsdone @ Jan 16 2014, 00:50)  Использование в программе: Код ;-------------------------------------- SetBit_GPIO GPIOC,PIN9 SetBit_GPIO GPIOC,PIN8 ;-------------------------------------- Разворачиваем, получаем Код mov32 R0,#(GPIOC + GPIO_BSRR) mov32 R1,#PIN9 str R1,[R0] mov32 R0,#(GPIOC + GPIO_BSRR) mov32 R1,#PIN8 str R1,[R0] Дважды грузится R0 одинаковым значением. И где хваленый выигрыш от Ассемблера? Такого даже самый плохой Си-компилятор себе не позволяет. Не морочьте себе и нам голову, лучше потратьте это время и эти усилия на более глубокое изучение Си или Си с плюсами. Поверьте, это будет гораздо продуктивнее и полезнее. Ассемблер на уровне, достатотчном для анализа листингов и пошаговой отладки вы уже знаете.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 17 2014, 20:47
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414

|
Цитата(Сергей Борщ @ Jan 16 2014, 11:40)  Разворачиваем, получаем Код mov32 R0,#(GPIOC + GPIO_BSRR) mov32 R1,#PIN9 str R1,[R0] mov32 R0,#(GPIOC + GPIO_BSRR) mov32 R1,#PIN8 str R1,[R0] Дважды грузится R0 одинаковым значением. И где хваленый выигрыш от Ассемблера? Такого даже самый плохой Си-компилятор себе не позволяет. Не морочьте себе и нам голову, лучше потратьте это время и эти усилия на более глубокое изучение Си или Си с плюсами. Поверьте, это будет гораздо продуктивнее и полезнее. Ассемблер на уровне, достатотчном для анализа листингов и пошаговой отладки вы уже знаете Постоянная бесполезная перезагрузка регистров одними и теми же значениями -- любимое занятие GCC. Вообще, высокая эффективность компиляторов -- это сказки. Даже лучшие из них дают не такой уж хороший код. Другое дело, что далеко не всегда имеет смысл писать вручную на ассемблере -- обычно производительность и компактность не являются главными критериями, хотя иногда они и важны. В общем, надо подходить к этому без фанатизма. Сравнительная скорость разработки программы на ассемблере и языке высокого уровня очень сильно зависит от задачи и от системы команд. Если там сплошные опросы, манипуляции с битами и переходы по условиям, разница весьма невелика. А вот если сложные расчёты -- очень заметная (то, что на ЯВУ пишется за 5-10 мин, на ассемблере можно и час, и два делать). Скорость отладки больше зависит от используемого языка; с числом строк программы она на самом деле связана лишь в том случае, если сравниваются программы на одном и том же языке. Между Си и ассемблером по числу ошибок особой разницы нет: и там, и там крайне легко допустить какие-нибудь ляпы, но на Си их искать часто бывает сложней (там куда более заковыристые проблемы могут быть по сравнению с ассемблером, где, пожалуй, основной источник ошибок -- неверный номер регистра). Вот если сравнивать ассемблер и Си с Адой или хотя бы Паскалем -- разница в числе ошибок будет в разы. Цитата(Golikov A. @ Jan 16 2014, 22:00)  Но моя убежденность в том что сишный код с одной платформы на другую еще можно перенести, а асмовый - практически всегда беда... Что значит с платформы на платформу? Если речь о разных архитектурах процессоров (скажем, с IA-32 на ARM или наоборот), то код на любом языке высокого уровня можно перенести, если есть компилятор, ну а на ассемблере нельзя -- ведь он прямо отражает архитектуру машины. Но если говорить о процессорах одной архитектуры, тогда проблем нет. Скажем, если надо перенести программу с какого-нибудь STM32 на какой-нибудь NXPшный микроконтроллер (и тот, и другой принадлежат к архитектуре ARM), то что на ассемблере, что на Си придётся переписывать код, относящийся к инициализации синхронизации, работе с периферией и т.д. -- поскольку эти вещи у разных МК различаются. Однако код, собственно решающий задачу, остаётся неизменным. Конечно, это при условии, если он написан достаточно грамотно -- но то же самое относится и к коду на ЯВУ (если ты в каждой функции напихал код, зависящий от конкретной модели МК, то и переделывать каждую функцию придётся).
|
|
|
|
Сообщений в этой теме
allsettingsdone STM32 Ассемблер. Идеи и приёмы написания Jan 15 2014, 22:50 Golikov A. Все зависит от того чего вы хотите в итоге.
Если ... Jan 16 2014, 01:58 allsettingsdone Встраивать асемблеровский код в проект на С я не п... Jan 16 2014, 05:38 scifi Цитата(allsettingsdone @ Jan 16 2014, 09... Jan 16 2014, 06:46 Golikov A. Поддерживаю.
Весь проект на ассемблере - это долго... Jan 16 2014, 07:10  _Pasha Цитата(SII @ Jan 18 2014, 00:47) Между Си... Jan 17 2014, 21:09   SII Цитата(_Pasha @ Jan 18 2014, 01:09) Псевд... Jan 18 2014, 06:37    _Pasha Цитата(SII @ Jan 18 2014, 10:37) Псевдоко... Jan 18 2014, 08:04 Ozelot Топикстартер задал конкретный вопрос в надежде пол... Jan 16 2014, 07:50 allsettingsdone Как раз читаю одну из этих книг. Что касается С, т... Jan 16 2014, 08:18 scifi Цитата(allsettingsdone @ Jan 16 2014, 12... Jan 16 2014, 09:42 jcxz Цитата(allsettingsdone @ Jan 16 2014, 14... Jan 16 2014, 11:08 MALLOY2 Цитатано когда пишешь на С, то не всегда очевидно ... Jan 16 2014, 09:57 Golikov A. ассемблер очевиднее С, только для ОЧЕНЬ маленьких ... Jan 16 2014, 10:23 allsettingsdone Ладно, а что по поводу таких вещей:
Кодmov32 R0,... Jan 16 2014, 10:56 scifi Цитата(allsettingsdone @ Jan 16 2014, 14... Jan 16 2014, 11:05 Сергей Борщ Цитата(allsettingsdone @ Jan 16 2014, 12... Jan 16 2014, 12:16  allsettingsdone Цитата(Сергей Борщ @ Jan 16 2014, 14:16) ... Jan 16 2014, 13:34   Сергей Борщ Цитата(allsettingsdone @ Jan 16 2014, 15... Jan 16 2014, 15:02 SasaVitebsk 1. Для некоторых процессоров ассемблер достаточно ... Jan 16 2014, 11:19 Golikov A. Так вам про это и долдонят битый час
Когда начина... Jan 16 2014, 13:55 jcxz Цитата(Golikov A. @ Jan 16 2014, 19:55) в... Jan 16 2014, 17:10  mantech Цитата(jcxz @ Jan 16 2014, 21:10) Хотя я ... Jan 17 2014, 17:25   scifi Цитата(mantech @ Jan 17 2014, 21:25) ЗЫ. ... Jan 17 2014, 18:27 Golikov A. ага или на асм ДСПешника со сдвоенным АЛУ,
помню... Jan 16 2014, 18:00 jcxz Цитата(Golikov A. @ Jan 17 2014, 00:00) п... Jan 16 2014, 18:57 _Pasha Я бы если бы так упорно писал бы на ассемблере(бы)... Jan 16 2014, 19:01 Golikov A. вам видать плохой компилятор достался ну или у вас... Jan 17 2014, 07:13 _Pasha Цитата(Golikov A. @ Jan 17 2014, 11:13) а... Jan 17 2014, 08:09  SasaVitebsk Цитата(_Pasha @ Jan 17 2014, 12:09) Подоз... Jan 17 2014, 10:24  Сергей Борщ Цитата(_Pasha @ Jan 17 2014, 10:09) Подоз... Jan 17 2014, 10:54 Golikov A. не я про другое.
иногда интерпритатор работает ме... Jan 17 2014, 10:11 _Pasha Цитата(Golikov A. @ Jan 17 2014, 14:11) и... Jan 17 2014, 17:00  Golikov A. Цитата(_Pasha @ Jan 17 2014, 21:00) Надо ... Jan 17 2014, 20:10 Golikov A. напишите виндус ан ассемблере, а потом рассказывай... Jan 18 2014, 06:27 megabuks Добрый день
Что-бы не плодить темы. Помогите старт... Jun 8 2014, 03:38 jcxz Возьмите любой cstartup.asm (или как он там называ... Jun 8 2014, 05:03
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|