реклама на сайте
подробности

 
 
> STM32 Ассемблер. Идеи и приёмы написания, Правила хорошего тона и макросы
allsettingsdone
сообщение Jan 15 2014, 22:50
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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
Прикрепленные файлы
Прикрепленный файл  test11_ASM.7z ( 93.49 килобайт ) Кол-во скачиваний: 28
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Jan 16 2014, 07:40
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
SII
сообщение Jan 17 2014, 20:47
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 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), то что на ассемблере, что на Си придётся переписывать код, относящийся к инициализации синхронизации, работе с периферией и т.д. -- поскольку эти вещи у разных МК различаются. Однако код, собственно решающий задачу, остаётся неизменным. Конечно, это при условии, если он написан достаточно грамотно -- но то же самое относится и к коду на ЯВУ (если ты в каждой функции напихал код, зависящий от конкретной модели МК, то и переделывать каждую функцию придётся).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 09:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01505 секунд с 7
ELECTRONIX ©2004-2016