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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

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

Сообщение a5021 »

Сказ про то, что ООП лучше прилегает к эмбеду? Ну-ну.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 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
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 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
Контактная информация:
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3903781#p3903781"]Если вы не видете разницы между "movs r2, #2" и "mov.w r2, #0x020000", то я ничем не могу помочь.[/uquote]
Да вы и так уже блеснули всем, чем могли.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3903790#p3903790"]Oxford, так вся суть в том чтобы не писать это на Си. Естественно, можно и на Си добиться такого же доступа к регистрам. Но это достаточно трудоёмко. Чуть что поменялось и переделыаай всё заново. Тут же всё отдано на откуп компилятору, он никогда не устаёт и оптимизирует, оптимизирует, оптимизирует...[/uquote]

Выкладывай исходник посмотрим
Последний раз редактировалось Oxford Пт окт 09, 2020 02:05:03, всего редактировалось 5 раз.
Инженер R@D

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

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3903790#p3903790"]Oxford, так вся суть в том чтобы не писать это на Си. Естественно, можно и на Си добиться такого же доступа к регистрам. Но это достаточно трудоёмко. Чуть что поменялось и переделыаай всё заново. Тут же всё отдано на откуп компилятору, он никогда не устаёт и оптимизирует, оптимизирует, оптимизирует...[/uquote]
Главное в сказки верить.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Oxford",url="/forum/viewtopic.php?p=3903782#p3903782"]Reflector давай те код полностью на Си. я жду а там уже будем думать.[/uquote]
Вот код функции:

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

GPIOB->BSRR = 0xFF00'0000 | (data & 0xFF00);
GPIOB->BSRR = GPIO_BSRR_BR_1;	// WR = 0
GPIOB->BSRR = GPIO_BSRR_BS_1;	// WR = 1
		
GPIOB->BSRR = 0xFF00'0000 | ((data & 0xFF) << 8);
GPIOB->BSRR = GPIO_BSRR_BR_1;	// WR = 0
GPIOB->BSRR = GPIO_BSRR_BS_1;	// WR = 1
Т.к. данные в старшей половине PB, то очевидная оптимизация - это запись в старшую половину ODR, хотя такое можно сделать не везде. Если данные и WR находятся на одном порту, тогда можно изменить маску и очистить WR вместе с записью данных, но это все дополнительные проверки, плюс есть еще RS, потому не помню чтобы кто-то так делал. Шаблонная либа это делает автоматически, даже если все пины данных идут вразброс она их посортирует по портам и будет обрабатывать группами.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

И когда покажешь реализацию методов C++? Что за шаблонная либа и что за группировки пинов такие автоматические?
Последний раз редактировалось Oxford Пт окт 09, 2020 02:06:10, всего редактировалось 4 раза.
Инженер R@D

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

Сообщение VladislavS »

Reflector, бесполезно. Тут пример с clear одного бита то не понимают, а списки пинов это из другой вселенной. Припоминаю то обсуждение записи в LCD, где пришли к возможности совместить wr=0 и установку data. А у вас это в библиотеке учтено и делается автоматом при появлении такой возможности.

Добавлено after 6 minutes 4 seconds:
[uquote="Oxford",url="/forum/viewtopic.php?p=3903801#p3903801"]И когда покажешь реализацию методов C++?8)[/uquote]Не думаю, что вы готовы это увидеть. Там реально сложный код.

[uquote="Oxford",url="/forum/viewtopic.php?p=3903801#p3903801"]a5021 ща мы этих калокуберов на чистую воду выведем 8)[/uquote]Смешно :) учитывая что на последних страницах кое-кто уже дважды проблемы с этого самого "калокуба" сюда вытаскивал. :)))
Ответить

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