В одном случае будет 2-х байтовая movs, в другом - 4-х байтовая mov.w.
STM32 новичку в ARM что к чему
- Сообщения: 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.
- Реклама
- Сообщения: 6452
- Зарегистрирован: Пт сен 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
- Сообщения: 6452
- Зарегистрирован: Пт сен 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
- Сообщения: 6452
- Зарегистрирован: Пт сен 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
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
- Сообщения: 2562
- Зарегистрирован: Вт май 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
- Сообщения: 2562
- Зарегистрирован: Вт май 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
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="VladislavS",url="/forum/viewtopic.php?p=3903781#p3903781"]Если вы не видете разницы между "movs r2, #2" и "mov.w r2, #0x020000", то я ничем не могу помочь.[/uquote]
Да вы и так уже блеснули всем, чем могли.
Да вы и так уже блеснули всем, чем могли.
[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
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="VladislavS",url="/forum/viewtopic.php?p=3903790#p3903790"]Oxford, так вся суть в том чтобы не писать это на Си. Естественно, можно и на Си добиться такого же доступа к регистрам. Но это достаточно трудоёмко. Чуть что поменялось и переделыаай всё заново. Тут же всё отдано на откуп компилятору, он никогда не устаёт и оптимизирует, оптимизирует, оптимизирует...[/uquote]
Главное в сказки верить.
Главное в сказки верить.
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="Oxford",url="/forum/viewtopic.php?p=3903782#p3903782"]Reflector давай те код полностью на Си. я жду а там уже будем думать.[/uquote]
Вот код функции:
Т.к. данные в старшей половине PB, то очевидная оптимизация - это запись в старшую половину ODR, хотя такое можно сделать не везде. Если данные и WR находятся на одном порту, тогда можно изменить маску и очистить WR вместе с записью данных, но это все дополнительные проверки, плюс есть еще RS, потому не помню чтобы кто-то так делал. Шаблонная либа это делает автоматически, даже если все пины данных идут вразброс она их посортирует по портам и будет обрабатывать группами.
Вот код функции:
Код: Выделить всё
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И когда покажешь реализацию методов C++? Что за шаблонная либа и что за группировки пинов такие автоматические?
Последний раз редактировалось Oxford Пт окт 09, 2020 02:06:10, всего редактировалось 4 раза.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
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 ща мы этих калокуберов на чистую воду выведем
[/uquote]Смешно
учитывая что на последних страницах кое-кто уже дважды проблемы с этого самого "калокуба" сюда вытаскивал. 
Добавлено 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 ща мы этих калокуберов на чистую воду выведем


