Пока что я вижу лишь некую легкомысленность. Вы либо задавайте вопрос по существу, либо переставайте играть в кошки мышки.
STM32 новичку в ARM что к чему
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="VladislavS",url="/forum/viewtopic.php?p=3901822#p3901822"]Ну, значит, что-то есть, раз никто показать не может.[/uquote]
Пока что я вижу лишь некую легкомысленность. Вы либо задавайте вопрос по существу, либо переставайте играть в кошки мышки.
Пока что я вижу лишь некую легкомысленность. Вы либо задавайте вопрос по существу, либо переставайте играть в кошки мышки.
- Реклама
a5021 покажи как установить PA15 в ноль код свой напиши
, что непонятного? Легкомысленность он видит
Код пиши, а не видь 
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Oxford, может вы начнёте? У вас практически эталонный CMSIS, в отличии от пользователей HAL. Хорошая отправная точка для обсуждения будет.
Добавлено after 48 minutes 8 seconds:
Oxford, спасибо, спросонья не заметил сообщение. Именно это я и ожидал увидеть.
Сейчас доеду до компа, посмотрим что из этого компилятор сделает. А пока злопыхателям предлагается более оптимальный с точки зрения генерируемого компилятором кода предложить.
Добавлено after 58 minutes 43 seconds:
12 байт кода. Одного меня такая "дорогая" загрузка константы GPIO_BSRR_BR15 напрягает?


Добавлено 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Спойлер
У меня так в KEIL
0x080010A6 0381 LSLS r1,r0,#14
0x080010A8 6181 STR r1,[r0,#0x18]
Там код будет зависеть еще от предыдущего кода.
Если к примеру убрать код предыдущий то будет так
0x08001094 F04F4000 MOV r0,#0x80000000
0x08001098 6188 STR r0,[r1,#0x18]
Нормально он все делает. Какой компилятор?
0x080010A6 0381 LSLS r1,r0,#14
0x080010A8 6181 STR r1,[r0,#0x18]
Там код будет зависеть еще от предыдущего кода.
Если к примеру убрать код предыдущий то будет так
0x08001094 F04F4000 MOV r0,#0x80000000
0x08001098 6188 STR r0,[r1,#0x18]
Нормально он все делает. Какой компилятор?
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Реклама
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[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 вот так написано про порты.
То есть. Мы имеем полное право сделать так
Минус два байта без всяких "как звёзды лягут".
[uquote="Oxford",url="/forum/viewtopic.php?p=3901888#p3901888"]Если к примеру убрать код предыдущий то будет так
0x08001094 F04F4000 MOV r0,#0x80000000
0x08001098 6188 STR r0,[r1,#0x18][/uquote]В среднем по больнице и у IAR, и у GCC так же.
В то же время, в RM вот так написано про порты.
Спойлер
Код: Выделить всё
*((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А зачем 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]
*((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
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Без запятых трудно понять что имелось в виду. Но разница то есть.
так больше инструкций становиться. Хрень короче.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Не становится. Загрузка адреса GPIOA->BSRR есть в любом случае. Она, естественно, не будет выполняться каждый раз, если где-то до этого была работа c GPIO. А в "чистом поле" для STR r1,[r0,#0x18] нужно два регистра предварительно загрузить в любом случае. Чудес не бывает.
Я об этом вообще не думаю. Не было никогда нужды считать байты и такты. В разных местах все по разному будет все от кода зависит и уровня оптимизации настроенной.
Поэтому выдумывать придумывать что-то нет смысла. Я просто программирую что мне нужно и все.
Даже если я напишу три раза подряд дрыгание ногой это будет выглядеть так:
Поэтому выдумывать придумывать что-то нет смысла. Я просто программирую что мне нужно и все.
Даже если я напишу три раза подряд дрыгание ногой это будет выглядеть так:
Код: Выделить всё
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
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="Oxford",url="/forum/viewtopic.php?p=3901950#p3901950"]Даже если я напишу три раза подряд дрыгание ногой это будет выглядеть так:
[/uquote]А R1 опять из воздуха взялось? И зачем каждый раз LSLS? Когда достаточно STR повторить.
Код: Выделить всё
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]Код: Выделить всё
//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 раз.
Нет не достаточно. не три сброса, а сброс, установка, сброс. Покажите свой код сброс, установка, сброс
Последний раз редактировалось Oxford Пн окт 05, 2020 11:00:38, всего редактировалось 1 раз.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="Oxford",url="/forum/viewtopic.php?p=3901964#p3901964"]не три сброса, а сброс, установка, сброс[/uquote]Просмотрел, поправил.
Ну у меня перед этим потому что MODER работает. Плюс с какой оптимизацией вы компилируете настройки.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Раз ты сброс-установка-сброс привёл в пример. Давай я покажу что получится, если учесть байтовый доступ. Но, с вашего позволения, на С++. Боюсь запутаться во всех этих адресах и константах на С. Пусть компилятор сам посчитает.
Точно не имеет смысла?
Код: Выделить всё
//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]
Конечно не имеет. Потому что у вас расход памяти больше на С++ за счет ООП. Плюс гемор программирования.
На Си не хуже.
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]
К сожалению, я понимаю что вы хотели сказать что С++ лучше Си, но увы на Си меньше расходов и проще.
На Си не хуже.
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
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="Oxford",url="/forum/viewtopic.php?p=3901974#p3901974"]Конечно не имеет. Потому что у вас расход памяти больше на С++ за счет ООП.[/uquote]Это неправда. Давай не будем C vs С++. Я напишу на С, пусть вас не смущает, результат будет байт в байт.
[uquote="Oxford",url="/forum/viewtopic.php?p=3901974#p3901974"]На Си не хуже.[/uquote]Дело не в Си, а в байтовом доступе к порту. И он даёт реальную экономию. На вашем же примере
Код: Выделить всё
*((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;Код: Выделить всё
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
[uquote="VladislavS",url="/forum/viewtopic.php?p=3901971#p3901971"]Раз ты сброс-установка-сброс привёл в пример.[/uquote]Атомарная установка/сброс - это конечно хорошо. Но вот почему ST не догадался сделать атомарный toggle пина? Infineon вот догадался. В семействе XMC4000 при записи лог."1" одновременно в set и в reset позицию производится атомарный toggle состояния пина.
Вроде бы очевидное решение, но почему-то ST не догадался так сделать.
Вроде бы очевидное решение, но почему-то ST не догадался так сделать.
В чем экономия во флеше что ли? ну да какие то байты есть выигрыш.
Ну вот мой код же. К тому же легко читаем, по сравнением с вашим.
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 битные.
Ну вот мой код же. К тому же легко читаем, по сравнением с вашим.
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
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford


