STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3901822#p3901822"]Ну, значит, что-то есть, раз никто показать не может.[/uquote]
Пока что я вижу лишь некую легкомысленность. Вы либо задавайте вопрос по существу, либо переставайте играть в кошки мышки.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

a5021 покажи как установить PA15 в ноль код свой напиши :tea: , что непонятного? Легкомысленность он видит :facepalm: Код пиши, а не видь :)))
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Без умников как-нибудь разберусь, что мне делать.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Oxford, может вы начнёте? У вас практически эталонный CMSIS, в отличии от пользователей HAL. Хорошая отправная точка для обсуждения будет.

Добавлено after 48 minutes 8 seconds:
Oxford, спасибо, спросонья не заметил сообщение. Именно это я и ожидал увидеть.

Код: Выделить всё

GPIOA->BSRR = GPIO_BSRR_BR15;
Сейчас доеду до компа, посмотрим что из этого компилятор сделает. А пока злопыхателям предлагается более оптимальный с точки зрения генерируемого компилятором кода предложить.

Добавлено after 58 minutes 43 seconds:

Код: Выделить всё

//GPIOA->BSRR = GPIO_BSRR_BR15;
        LDR.N    R1,??main_0      ;; 0x40020018
        MOV      R0,#-2147483648
        STR      R0,[R1, #+0]
        // ...
??main_0:
        DC32     0x40020018
12 байт кода. Одного меня такая "дорогая" загрузка константы GPIO_BSRR_BR15 напрягает?
СпойлерИзображение

Изображение
bc1.png
(19.42 КБ) 107 скачиваний
bc2.png
(5.12 КБ) 98 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

У меня так в KEIL

0x080010A6 0381 LSLS r1,r0,#14
0x080010A8 6181 STR r1,[r0,#0x18]
Screenshot_11.png
(11.11 КБ) 156 скачиваний
Там код будет зависеть еще от предыдущего кода.
Если к примеру убрать код предыдущий то будет так

0x08001094 F04F4000 MOV r0,#0x80000000
0x08001098 6188 STR r0,[r1,#0x18]

Нормально он все делает. Какой компилятор?
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Oxford",url="/forum/viewtopic.php?p=3901888#p3901888"]Там код будет зависеть еще от предыдущего кода.[/uquote]Ну да, аргумент для сдвига же где-то раньше взять надо было. Но кейлу зачёт, однозначно.

[uquote="Oxford",url="/forum/viewtopic.php?p=3901888#p3901888"]Если к примеру убрать код предыдущий то будет так

0x08001094 F04F4000 MOV r0,#0x80000000
0x08001098 6188 STR r0,[r1,#0x18][/uquote]В среднем по больнице и у IAR, и у GCC так же.

В то же время, в RM вот так написано про порты.
СпойлерИзображение
bc3.png
(35.67 КБ) 83 скачивания
То есть. Мы имеем полное право сделать так

Код: Выделить всё

*((volatile uint8_t *)&GPIOA->BSRR+3) = GPIO_BSRR_BR15>>24;

Код: Выделить всё

//*((volatile uint8_t *)&GPIOA->BSRR+3) = GPIO_BSRR_BR15>>24;
        LDR.N    R1,??main_0      ;; 0x4002001b
        MOVS     R0,#+128
        STRB     R0,[R1, #+0]
        // ..
??main_0:
        DC32     0x4002001b
Минус два байта без всяких "как звёзды лягут".
Реклама
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

А зачем STM32 все 32 битные им нет разницы.

*((volatile uint8_t *)&GPIOA->BSRR+3) = GPIO_BSRR_BR15>>24;

0x0800154A 2180 MOVS r1,#0x80
0x0800154C 4807 LDR r0,[pc,#28] ; @0x0800156C
0x0800154E 76C1 STRB r1,[r0,#0x1B]
Последний раз редактировалось Oxford Пн окт 05, 2020 10:35:18, всего редактировалось 1 раз.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Без запятых трудно понять что имелось в виду. Но разница то есть.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

так больше инструкций становиться. Хрень короче.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Не становится. Загрузка адреса GPIOA->BSRR есть в любом случае. Она, естественно, не будет выполняться каждый раз, если где-то до этого была работа c GPIO. А в "чистом поле" для STR r1,[r0,#0x18] нужно два регистра предварительно загрузить в любом случае. Чудес не бывает.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Я об этом вообще не думаю. Не было никогда нужды считать байты и такты. В разных местах все по разному будет все от кода зависит и уровня оптимизации настроенной.
Поэтому выдумывать придумывать что-то нет смысла. Я просто программирую что мне нужно и все.

Даже если я напишу три раза подряд дрыгание ногой это будет выглядеть так:

Код: Выделить всё

0x0800154A 0388      LSLS          r0,r1,#14
0x0800154C 6188      STR           r0,[r1,#0x18]
   285:         GPIOA->BSRR = GPIO_BSRR_BS15;      
0x0800154E 0C00      LSRS          r0,r0,#16
0x08001550 6188      STR           r0,[r1,#0x18]
   286:         GPIOA->BSRR = GPIO_BSRR_BR15; 
   287:          
0x08001552 0400      LSLS          r0,r0,#16
0x08001554 6188      STR           r0,[r1,#0x18]
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Oxford",url="/forum/viewtopic.php?p=3901950#p3901950"]Даже если я напишу три раза подряд дрыгание ногой это будет выглядеть так:

Код: Выделить всё

0x0800154A 0388      LSLS          r0,r1,#14
0x0800154C 6188      STR           r0,[r1,#0x18]
   285:         GPIOA->BSRR = GPIO_BSRR_BS15;      
0x0800154E 0C00      LSRS          r0,r0,#16
0x08001550 6188      STR           r0,[r1,#0x18]
   286:         GPIOA->BSRR = GPIO_BSRR_BR15; 
   287:          
0x08001552 0400      LSLS          r0,r0,#16
0x08001554 6188      STR           r0,[r1,#0x18]
[/uquote]А R1 опять из воздуха взялось? И зачем каждый раз LSLS? Когда достаточно STR повторить.

Код: Выделить всё

//GPIOA->BSRR = GPIO_BSRR_BR_15;
        LDR.N    R1,??main_0      ;; 0x48000018
        MOV      R0,#-2147483648
        STR      R0,[R1, #+0]
//GPIOA->BSRR = GPIO_BSRR_BS_15;
        MOV      R2,#+32768
        STR      R2,[R1, #+0]
//GPIOA->BSRR = GPIO_BSRR_BR_15;  
        STR      R0,[R1, #+0]
Последний раз редактировалось VladislavS Пн окт 05, 2020 10:59:56, всего редактировалось 1 раз.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Нет не достаточно. не три сброса, а сброс, установка, сброс. Покажите свой код сброс, установка, сброс
Последний раз редактировалось Oxford Пн окт 05, 2020 11:00:38, всего редактировалось 1 раз.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Oxford",url="/forum/viewtopic.php?p=3901964#p3901964"]не три сброса, а сброс, установка, сброс[/uquote]Просмотрел, поправил.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Ну у меня перед этим потому что MODER работает. Плюс с какой оптимизацией вы компилируете настройки.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Раз ты сброс-установка-сброс привёл в пример. Давай я покажу что получится, если учесть байтовый доступ. Но, с вашего позволения, на С++. Боюсь запутаться во всех этих адресах и константах на С. Пусть компилятор сам посчитает.

Код: Выделить всё

//PA_15::clear();
        LDR.N    R1,??main_0      ;; 0x48000019
        MOVS     R0,#+128
        STRB     R0,[R1, #+2]
//PA_15::set();
        STRB     R0,[R1, #+0]
//PA_15::clear();
        STRB     R0,[R1, #+2]
Точно не имеет смысла?
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Конечно не имеет. Потому что у вас расход памяти больше на С++ за счет ООП. Плюс гемор программирования.
На Си не хуже.

0x080013EC F04F4100 MOV r1,#0x80000000
0x080013F0 6181 STR r1,[r0,#0x18]
285: GPIOA->BSRR = GPIO_BSRR_BS15;
0x080013F2 0C0A LSRS r2,r1,#16
0x080013F4 6182 STR r2,[r0,#0x18]
286: GPIOA->BSRR = GPIO_BSRR_BR15;
287:
288:
289:
0x080013F6 6181 STR r1,[r0,#0x18]

К сожалению, я понимаю что вы хотели сказать что С++ лучше Си, но увы на Си меньше расходов и проще.
Последний раз редактировалось Oxford Пн окт 05, 2020 11:14:13, всего редактировалось 1 раз.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Oxford",url="/forum/viewtopic.php?p=3901974#p3901974"]Конечно не имеет. Потому что у вас расход памяти больше на С++ за счет ООП.[/uquote]Это неправда. Давай не будем C vs С++. Я напишу на С, пусть вас не смущает, результат будет байт в байт.

Код: Выделить всё

*((volatile uint8_t *)&GPIOA->BSRR+3) = GPIO_BSRR_BR_15>>24;
*((volatile uint8_t *)&GPIOA->BSRR+1) = GPIO_BSRR_BS_15>>8;
*((volatile uint8_t *)&GPIOA->BSRR+3) = GPIO_BSRR_BR_15>>24;
[uquote="Oxford",url="/forum/viewtopic.php?p=3901974#p3901974"]На Си не хуже.[/uquote]Дело не в Си, а в байтовом доступе к порту. И он даёт реальную экономию. На вашем же примере

Код: Выделить всё

        LDR.N    R1,??main_0      ;; 0x48000019
        MOVS     R0,#+128
        STRB     R0,[R1, #+2]
        STRB     R0,[R1, #+0]
        STRB     R0,[R1, #+2]
Мудрый кот
Сообщения: 1846
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3901971#p3901971"]Раз ты сброс-установка-сброс привёл в пример.[/uquote]Атомарная установка/сброс - это конечно хорошо. Но вот почему ST не догадался сделать атомарный toggle пина? Infineon вот догадался. В семействе XMC4000 при записи лог."1" одновременно в set и в reset позицию производится атомарный toggle состояния пина.
Вроде бы очевидное решение, но почему-то ST не догадался так сделать. :dont_know:
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

В чем экономия во флеше что ли? ну да какие то байты есть выигрыш.

Ну вот мой код же. К тому же легко читаем, по сравнением с вашим.
GPIOA->BSRR = GPIO_BSRR_BR15;
GPIOA->BSRR = GPIO_BSRR_BS15;
GPIOA->BSRR = GPIO_BSRR_BR15;

MOV r1,#0x80000000
STR r1,[r0,#0x18]
LSRS r2,r1,#16
STR r2,[r0,#0x18]
STR r1,[r0,#0x18]

нет разницы байт или 32 бита. STM32 32 битные.
Последний раз редактировалось Oxford Пн окт 05, 2020 11:23:25, всего редактировалось 1 раз.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Ответить

Вернуться в «ARM»