У каких нет? Мне, кстати, сей регистр всегда казался непонятным.
STM32 новичку в ARM что к чему
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="VladislavS",url="/forum/viewtopic.php?p=3902914#p3902914"]BRR не у всех STM32 есть.[/uquote]
У каких нет? Мне, кстати, сей регистр всегда казался непонятным.
У каких нет? Мне, кстати, сей регистр всегда казался непонятным.
- Реклама
BRR просто младшие 16 бит работают как сброс. А у BSRR младшие 16 бит работают на установку, старшие на сброс.
У STM32F405/415, STM32F407/417, STM32F427/437, STM32F446xx, STM32F75xxx and STM32F74xxx например нету BRR. Видать в старших сериях этот регистр убрали.
У STM32F405/415, STM32F407/417, STM32F427/437, STM32F446xx, STM32F75xxx and STM32F74xxx например нету BRR. Видать в старших сериях этот регистр убрали.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="a5021",url="/forum/viewtopic.php?p=3902076#p3902076"]Старые семейства (F1, F2) умеют только word access.[/uquote][uquote="a5021",url="/forum/viewtopic.php?p=3903307#p3903307"]Мне, кстати, сей регистр всегда казался непонятным.[/uquote]Как эти две мысли могут существовать в голове одновременно и не пересечься? Сравниваем на F1Разница очевидна.
[uquote="Oxford",url="/forum/viewtopic.php?p=3903391#p3903391"]Видать в старших сериях этот регистр убрали.[/uquote]А зачем он нужен, при наличии 16-битного доступа к старшей части BSRR? Сравниваем на F3А вот тут, как раз, разницы считай и нет. Только зря потраченные транзисторы.
Код: Выделить всё
GPIOA->BSRR = GPIO_BSRR_BS0;
GPIOA->BSRR = GPIO_BSRR_BR0;
LDR.W R5,??main_0 ;; 0x40010810
MOVS R0,#+1
STR R0,[R5, #+0]
MOV R1,#+65536
STR R1,[R5, #+0]Код: Выделить всё
GPIOA->BSRR = GPIO_BSRR_BS0;
GPIOA->BRR = GPIO_BRR_BR0;
LDR.W R5,??main_0 ;; 0x40010810
MOVS R0,#+1
STR R0,[R5, #+0]
STR R0,[R5, #+4][uquote="Oxford",url="/forum/viewtopic.php?p=3903391#p3903391"]Видать в старших сериях этот регистр убрали.[/uquote]А зачем он нужен, при наличии 16-битного доступа к старшей части BSRR? Сравниваем на F3
Код: Выделить всё
GPIOA->BSRR = GPIO_BSRR_BS_0;
GPIOA->BRR = GPIO_BRR_BR_0;
LDR.N R1,??main_0 ;; 0x48000018
MOVS R0,#+1
STR R0,[R1, #+0]
STR R0,[R1, #+16]Код: Выделить всё
GPIOA->BSRR = GPIO_BSRR_BS_0;
*((volatile uint16_t *)&GPIOA->BSRR+1) = GPIO_BSRR_BR_0>>16;
LDR.N R1,??main_0 ;; 0x48000018
MOVS R0,#+1
STR R0,[R1, #+0]
STRH R0,[R1, #+2]- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="VladislavS",url="/forum/viewtopic.php?p=3903420#p3903420"]Как эти две мысли могут существовать в голове одновременно и не пересечься?[/uquote]
В вас умер посредственный пеар-менеджер -- вы создаете информационный шум на пустом месте и уверены, что никто не заметит чепушистости повода.
Вывод -- разницы нет. Вы зря потратили время.
В вас умер посредственный пеар-менеджер -- вы создаете информационный шум на пустом месте и уверены, что никто не заметит чепушистости повода.
Сравниваем с другого ракурса:Сравниваем на F1Код: Выделить всё
GPIOA->BSRR = GPIO_BSRR_BS0; GPIOA->BSRR = GPIO_BSRR_BR0; LDR.W R5,??main_0 ;; 0x40010810 MOVS R0,#+1 STR R0,[R5, #+0] MOV R1,#+65536 STR R1,[R5, #+0]Разница очевидна.Код: Выделить всё
GPIOA->BSRR = GPIO_BSRR_BS0; GPIOA->BRR = GPIO_BRR_BR0; LDR.W R5,??main_0 ;; 0x40010810 MOVS R0,#+1 STR R0,[R5, #+0] STR R0,[R5, #+4]
Код: Выделить всё
GPIOA->BSRR = GPIO_BSRR_BS0;
movs r1, #1
movs r2, #2
ldr r3, =0x40010800
str r1, [r3, #16]
GPIOA->BRR = GPIO_BRR_BR1;
str r2, [r3, #20]- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
- Реклама
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Странно, что позиционируя себя такими сведующим человеком вы теперь не в состоянии представить, что будет без BRR.
Сообщаю вам, что будет то же самое:
И чтобы уж совсем ясно представить, какие там еще мысли не в состоянии пересечься теперь уже в вашей голове, попробуйте проиллюстрировать пользу BRR на вашем же примере:
Сообщаю вам, что будет то же самое:
Код: Выделить всё
GPIOA->BSRR = GPIO_BSRR_BS0;
movs r1, #1
mov.w r2, #0x020000
ldr r3, =0x40010800
str r1, [r3, #16]
GPIOA->BSRR = GPIO_BSRR_BR1;
str r2, [r3, #16]
Код: Выделить всё
GPIOA->BSRR = (0xFF<<(2+16)) | (x<<2);- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="a5021",url="/forum/viewtopic.php?p=3903691#p3903691"]Сообщаю вам, что будет то же самое[/uquote]
В одном случае будет 2-х байтовая movs, в другом - 4-х байтовая mov.w.
В одном случае будет 2-х байтовая movs, в другом - 4-х байтовая mov.w.
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Давайте сразу про беды и напасти, которые за этим фактом скрываются. Закончите, можете плавно переходить вот к этому:
Код: Выделить всё
GPIOA->BSRR = GPIO_BSRR_BS0 | GPIO_BSRR_BR1;
ldr r3, =0x40010800
ldr r2, =0x00020001
str r2, [r3, #16]Про че речь то опять?
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="Reflector",url="/forum/viewtopic.php?p=3903706#p3903706"][uquote="a5021",url="/forum/viewtopic.php?p=3903691#p3903691"]Сообщаю вам, что будет то же самое[/uquote]
В одном случае будет 2-х байтовая movs, в другом - 4-х байтовая mov.w.[/uquote]
И чо дальше?
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="Oxford",url="/forum/viewtopic.php?p=3903753#p3903753"]И чо дальше?
Функцию не выполняет нужную? Вроде CPU исполнил что от него просили на языке C[/uquote]
Есть у меня либа для работы с дисплеями, если выбросить все лишнее, то одна из функций выглядит следующим образом:
В случае удачно подобранных пинов, например, таких:
функция скомпилируется в 6 инструкций:
Если бы либа писалась на С, то в ней бы наверняка не было совмещенной записи данных и WR, т.к. заранее не известно где находятся управляющие пины, а убрав еще и оптимизацию обращения к BSRR получим:
Тестируем делая заливку экрана на F303 и получаем 6.5 тактов на байт для первого случая и 9 тактов для второго, причем у F3 самые быстрые порты, а добавилось как раз 3 записи в порт, так что на других сериях разница будет еще больше. Наконец я могу сделать даже так и все продолжит работать, компилятор сам будет разбираться с оптимизациями:
Есть у меня либа для работы с дисплеями, если выбросить все лишнее, то одна из функций выглядит следующим образом:
Код: Выделить всё
static void writeData(uint16_t data)
{
PinList<typename Pins::WR, typename Pins::Data>::write(data >> 8);
Pins::WR::set();
PinList<typename Pins::WR, typename Pins::Data>::write(data & 0xFF);
Pins::WR::set();
}Код: Выделить всё
using lcd = Lcd<RM68140, LcdOrient::LandscapeRev, PB7, GpioB<0xFF00>, PB2, PB0, PB1, PB6, 0, 4, 0>;Код: Выделить всё
DF F8 CC E0 ldr.w lr, [pc, #204]
2F 4F ldr r7, [pc, #188]
C4 F8 18 E0 str.w lr, [r4, #24]
A5 61 str r5, [r4, #24]
A7 61 str r7, [r4, #24]
A5 61 str r5, [r4, #24]Спойлер
Код: Выделить всё
GPIOB->BSRR = 0xFF00'0000 | (data & 0xFF00);
Pins::WR::clear();
Pins::WR::set();
GPIOB->BSRR = 0xFF00'0000 | ((data & 0xFF) << 8);
Pins::WR::clear();
Pins::WR::set();
Код: Выделить всё
36 4F ldr r7, [pc, #216]
DF F8 E4 E0 ldr.w lr, [pc, #228]
35 48 ldr r0, [pc, #212]
C4 F8 18 E0 str.w lr, [r4, #24]
3D 80 strh r5, [r7, #0]
A5 61 str r5, [r4, #24]
A0 61 str r0, [r4, #24]
3D 80 strh r5, [r7, #0]
A5 61 str r5, [r4, #24]
Код: Выделить всё
using lcdPins = PinList<PB6, PB5, PB8, PB3, PC10, PC1, PC11, PC0, PB7, PB4, PB9, PC3, PC13, PC2, PC12, PA1>;
using lcd = Lcd<ILI9481, LcdOrient::Portrait, PA5, lcdPins, PC5, PA7, PA3, PinDummy<>, 1, 4, 1>;Давай уже тогда код на Си что там у тебя выполняется. Посмотрим.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="Reflector",url="/forum/viewtopic.php?p=3903767#p3903767"]Если бы либа писалась на С, то в ней бы наверняка[/uquote]
Ценность доказательств в сослагательном наклонении "наверняка" не превышает 00 рублей 00 копеек.
Ценность доказательств в сослагательном наклонении "наверняка" не превышает 00 рублей 00 копеек.
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="Oxford",url="/forum/viewtopic.php?p=3903771#p3903771"]Давай уже тогда код на Си что там у тебя выполняется. Посмотрим.[/uquote]
Второй пример, только там нужно clear() и set() переписать через BSRR. Кстати, я просмотрел, clear() то тоже делает оптимизацию при обращению к старшей половине BSRR
Второй пример, только там нужно clear() и set() переписать через BSRR. Кстати, я просмотрел, clear() то тоже делает оптимизацию при обращению к старшей половине BSRR
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Если вы не видете разницы между "movs r2, #2" и "mov.w r2, #0x020000", то я ничем не могу помочь.
Reflector давай те код полностью на Си. я жду а там уже будем думать.
Полностью функцию все что там делается на си.
Потестим посмотрим.
Полностью функцию все что там делается на си.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Oxford, так вся суть в том чтобы не писать это на Си. Естественно, можно и на Си добиться такого же доступа к регистрам. Но это достаточно трудоёмко. Чуть что поменялось и переделыаай всё заново. Тут же всё отдано на откуп компилятору, он никогда не устаёт и оптимизирует, оптимизирует, оптимизирует...
KEIL так сделал
GPIOA->BSRR[0] = GPIO_BSRR_BS_0;
0x08000354 480D LDR r0,[pc,#52] ; @0x0800038C
0x08000356 2101 MOVS r1,#0x01
0x08000358 6181 STR r1,[r0,#0x18]
GPIOA->BSRR[0] = GPIO_BSRR_BR_1;
0x0800035A 0449 LSLS r1,r1,#17
0x0800035C 6181 STR r1,[r0,#0x18]
GPIOA->BSRR[0] = GPIO_BSRR_BS_0;
0x08000354 480D LDR r0,[pc,#52] ; @0x0800038C
0x08000356 2101 MOVS r1,#0x01
0x08000358 6181 STR r1,[r0,#0x18]
GPIOA->BSRR[0] = GPIO_BSRR_BR_1;
0x0800035A 0449 LSLS r1,r1,#17
0x0800035C 6181 STR r1,[r0,#0x18]
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford


