|
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, 10:56
|
Участник

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

|
Ладно, а что по поводу таких вещей: Код mov32 R0,#($Port + GPIO_BSRR) Интересно, где именно происходит сложение "$Port + GPIO_BSRR" в данном случае $Port = 0x40001800, а GPIO_BSRR = 0x10. Для такой операции тоже ведь нужно использовать регистры, я пытался проследить этот момент, но именного таких чисел не увидел. И где вообще хранится константы когда мы используем их в виде "mov R0,#4" - вот число 4 здесь, процессор же должен от куда нибудь его взять? Откуда именно (если из ПЗУ, то как узнать по какому адресу компилятор что,где ложит)? Цитата(Golikov A. @ Jan 16 2014, 12:23)  ассемблер очевиднее С, только для ОЧЕНЬ маленьких программок из раздела мигаем лампочкой. Да и то С тут очевиднее... Любую программу же можно разбить на отдельные блоки/функции/файлы отвечающие за что-то одно. И можно будет во всем разобраться.
Сообщение отредактировал allsettingsdone - Jan 16 2014, 10:53
|
|
|
|
|
Jan 16 2014, 12:16
|

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

|
Цитата(allsettingsdone @ Jan 16 2014, 12:56)  Интересно, где именно происходит сложение "$Port + GPIO_BSRR" в данном случае $Port = 0x40001800, а GPIO_BSRR = 0x10. А где бы вы сделали это сложение? Еще раз оглашу ваши условия: "оба слагаемых константы и известны до начала выполнения программы". Цитата(allsettingsdone @ Jan 16 2014, 12:56)  Для такой операции тоже ведь нужно использовать регистры Простите, но все ассемблеры такие действия выполняют в уме. Цитата(allsettingsdone @ Jan 16 2014, 12:56)  И где вообще хранится константы когда мы используем их в виде "mov R0,#4" - вот число 4 здесь, процессор же должен от куда нибудь его взять? Это описано в разделе "About the instruction descriptions" прямо в начале описания ассемблерных команд. Часто бывает полезно один раз прочитать документацию с самого начала.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 16 2014, 13:34
|
Участник

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

|
Цитата(Сергей Борщ @ Jan 16 2014, 14:16)  А где бы вы сделали это сложение? Еще раз оглашу ваши условия: "оба слагаемых константы и известны до начала выполнения программы".
Простите, но все ассемблеры такие действия выполняют в уме. Это описано в разделе "About the instruction descriptions" прямо в начале описания ассемблерных команд. Часто бывает полезно один раз прочитать документацию с самого начала. Это макрос и от пользователя может прийти что угодно (просто в этом случае я сразу прописал), вот скажем я с юарта буду посылать имя порта, в конечном итоге отправляя его в аргумент этого макроса, тогда получается что приплюсовывать "GPIO_BSRR" к имени порта (у которых код тоже задефайнен, у каждого свой) микроконтроллер будет на лету? Он же не будет знать какой порт будет следующим. Как же так?
Сообщение отредактировал allsettingsdone - Jan 16 2014, 13:36
|
|
|
|
Сообщений в этой теме
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 Сергей Борщ Цитата(allsettingsdone @ Jan 16 2014, 00... Jan 16 2014, 07:40 SII Цитата(Сергей Борщ @ Jan 16 2014, 11:40) ... Jan 17 2014, 20:47  _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 scifi Цитата(allsettingsdone @ Jan 16 2014, 14... Jan 16 2014, 11:05 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
|
|
|