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

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

Сообщение a5021 »

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

Сообщение Oxford »

BRR просто младшие 16 бит работают как сброс. А у BSRR младшие 16 бит работают на установку, старшие на сброс.

У STM32F405/415, STM32F407/417, STM32F427/437, STM32F446xx, STM32F75xxx and STM32F74xxx например нету BRR. Видать в старших сериях этот регистр убрали.
Инженер R@D

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

Сообщение VladislavS »

[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

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

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

Сообщение a5021 »

[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

Сообщение VladislavS »

А теперь то же без BRR.
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Странно, что позиционируя себя такими сведующим человеком вы теперь не в состоянии представить, что будет без 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]
И чтобы уж совсем ясно представить, какие там еще мысли не в состоянии пересечься теперь уже в вашей голове, попробуйте проиллюстрировать пользу BRR на вашем же примере:

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

GPIOA->BSRR = (0xFF<<(2+16)) | (x<<2);
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="a5021",url="/forum/viewtopic.php?p=3903691#p3903691"]Сообщаю вам, что будет то же самое[/uquote]
В одном случае будет 2-х байтовая movs, в другом - 4-х байтовая mov.w.
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Давайте сразу про беды и напасти, которые за этим фактом скрываются. Закончите, можете плавно переходить вот к этому:

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

GPIOA->BSRR = GPIO_BSRR_BS0 | GPIO_BSRR_BR1;
    ldr r3, =0x40010800
    ldr r2, =0x00020001
    str r2, [r3, #16]
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Про че речь то опять?
Инженер R@D

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

Сообщение a5021 »

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

Сообщение Oxford »

:))) https://www.youtube.com/watch?v=1IAwkEdRZZw


[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]

И чо дальше? :tea: Функцию не выполняет нужную? Вроде CPU исполнил что от него просили на языке C
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Oxford",url="/forum/viewtopic.php?p=3903753#p3903753"]И чо дальше? :tea: Функцию не выполняет нужную? Вроде CPU исполнил что от него просили на языке C[/uquote]
Есть у меня либа для работы с дисплеями, если выбросить все лишнее, то одна из функций выглядит следующим образом:

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

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>;
функция скомпилируется в 6 инструкций:

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

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]
Если бы либа писалась на С, то в ней бы наверняка не было совмещенной записи данных и WR, т.к. заранее не известно где находятся управляющие пины, а убрав еще и оптимизацию обращения к BSRR получим:
Спойлер

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

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]
Тестируем делая заливку экрана на F303 и получаем 6.5 тактов на байт для первого случая и 9 тактов для второго, причем у F3 самые быстрые порты, а добавилось как раз 3 записи в порт, так что на других сериях разница будет еще больше. Наконец я могу сделать даже так и все продолжит работать, компилятор сам будет разбираться с оптимизациями:

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

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>;
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Давай уже тогда код на Си что там у тебя выполняется. Посмотрим.
Инженер R@D

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

Сообщение a5021 »

[uquote="Reflector",url="/forum/viewtopic.php?p=3903767#p3903767"]Если бы либа писалась на С, то в ней бы наверняка[/uquote]
Ценность доказательств в сослагательном наклонении "наверняка" не превышает 00 рублей 00 копеек.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Oxford",url="/forum/viewtopic.php?p=3903771#p3903771"]Давай уже тогда код на Си что там у тебя выполняется. Посмотрим.[/uquote]
Второй пример, только там нужно clear() и set() переписать через BSRR. Кстати, я просмотрел, clear() то тоже делает оптимизацию при обращению к старшей половине BSRR :)
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

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

Сообщение VladislavS »

Если вы не видете разницы между "movs r2, #2" и "mov.w r2, #0x020000", то я ничем не могу помочь.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Reflector давай те код полностью на Си. я жду а там уже будем думать.

Полностью функцию все что там делается на си. :tea: Потестим посмотрим.
Инженер R@D

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

Сообщение VladislavS »

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

Сообщение 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]
Инженер R@D

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

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