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

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

|
Встраивать асемблеровский код в проект на С я не планирую, идея в написании всего проекта на асм, так что я условился приблизительно регистры R0-R3 использовать с оглядкой на то что они будут постоянно меняться, так как задействованы почти во всех макросах. А уже по ходу выполнения программы буду держать в поле зрения другие регистры с ключевой информацией. Вот ещё что интересно: одно и то же действие можно сделать разными командами и бывает не понятно как лучше поступить. Вот например загрузка в регистр адреса из памяти: (кусочек кода из макроса) Код mov32 R0,#$Port или Код ldr R0,=$Port В итоге эти две строчки равнозначны и вот какую из них лучше применять совсем непонятно. Хотелось бы узнать как бы идею и философию подхода к программированию на ассемблере для мк. (может есть годные примеры такого?) Встраивать асемблеровский код в проект на С я не планирую, идея в написании всего проекта на асм, так что я условился приблизительно регистры R0-R3 использовать с оглядкой на то что они будут постоянно меняться, так как задействованы почти во всех макросах. А уже по ходу выполнения программы буду держать в поле зрения другие регистры с ключевой информацией. Вот ещё что интересно: одно и то же действие можно сделать разными командами и бывает не понятно как лучше поступить. Вот например загрузка в регистр адреса памяти: (кусочек кода из макроса) Код mov32 R0,#$Port или Код ldr R0,=$Port В итоге эти две строчки равнозначны и вот какую из них лучше применять совсем непонятно. Или вот ещё Код mov32 R0,#($Port + GPIO_BSRR) Тоже интересно где именно происходит это сложение? Как я понимаю в на эту строчку уйдет далеко не два такта микроконтроллера? Хотелось бы узнать как бы идею и философию подхода к программированию на ассемблере для мк. (может есть годные примеры такого?) PS: с BFI разобрался
Сообщение отредактировал allsettingsdone - Jan 16 2014, 06:27
|
|
|
|
Сообщений в этой теме
allsettingsdone STM32 Ассемблер. Идеи и приёмы написания Jan 15 2014, 22:50 Golikov A. Все зависит от того чего вы хотите в итоге.
Если ... Jan 16 2014, 01:58 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 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
|
|
|