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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 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]
Мудрый кот
Сообщения: 1762
Зарегистрирован: Вт авг 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
Контактная информация:
Мудрый кот
Сообщения: 1762
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3901976#p3901976"]Дело не в Си, а в байтовом доступе к порту. И он даёт реальную экономию.[/uquote]Да это понятно и очевидно. Давно так делаю. И не только с регистрами установки/сброса сост.пинов, а с любыми IO-регистрами периферии, позволяющими байтовый доступ. Загрузка константы 0...255 в Cortex-M выгоднее, чем другие значения. И по размеру и по скорости.

Добавлено after 1 minute 8 seconds:
[uquote="Oxford",url="/forum/viewtopic.php?p=3901980#p3901980"]В чем экономия во флеше что ли?[/uquote]Экономия флеша ведёт к экономии тактов. В общем случае.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

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

Сообщение Oxford »

Считывается одинаково. Выполняется одинаково. Повторяю нет разницы они 32 битные.
Но думать вы можете как угодно.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Мудрый кот
Сообщения: 1762
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="Oxford",url="/forum/viewtopic.php?p=3901980#p3901980"]MOV r1,#0x80000000
STR r1,[r0,#0x18]
LSRS r2,r1,#16
STR r2,[r0,#0x18]
STR r1,[r0,#0x18]

нет разницы байт или 32 бита. STM32 32 битные.[/uquote]
А то, что в примере VladislavS 4 команды, а у вас - 5 команд (для тех же действий) - конечно не заметили? И что у него все команды 2-байтовые, а у вас первая 4-байтная - тоже не заметили?? 8)
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Меня это абсолютно не волнует сколько там байт. пусть будет больше значит больше.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Мудрый кот
Сообщения: 1762
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="Oxford",url="/forum/viewtopic.php?p=3901986#p3901986"]Считывается одинаково. Выполняется одинаково.[/uquote]Ложь.
Ответить

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