STM32 новичку в ARM что к чему
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: STM32 новичку в ARM что к чему
VladislavS, на компе можно просто popcnt вызвать же!
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
И на этапе компиляции.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Я так и не понял восторгов: если программист вызывает функцию для того, чтобы посчитать биты в заранее известной константе, разумно ли вводить это в стандарт? Или просто константы будут запрещены?
Что-то я не понимаю восторга: вплоть до 64-битных констант число единичных бит вычисляется не-двоешником практически в уме...
Что-то я не понимаю восторга: вплоть до 64-битных констант число единичных бит вычисляется не-двоешником практически в уме...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: STM32 новичку в ARM что к чему
Я так и не понял восторгов: если программист вызывает функцию для того, чтобы посчитать биты в заранее известной константе, разумно ли вводить это в стандарт? Или просто константы будут запрещены?
Такая функция используется в либе портов, допустим есть такой список:
Код: Выделить всё
PinList<PA5, PA6, PA7, PB10, PA0, PA1> pins;Будет найдено две последовательности, в обoих пины идут в обратном порядке: PA0, PA1 и PA5, PA6, PA7. Для каждой последовательности находятся маски 0x03 и 0xE0, если в маске больше двух бит, то будет использована реверсная инструкция RBIT, иначе ее применение не оправдано. Все это происходит на этапе компиляции и никакие константы заранее не известны
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
мда... занятно.
этак скоро дисциплину "программирование" в ВУЗах преподавать перестанут, ибо эфект обучения будет нулевой: достаточно функцию вычисления корней квадратного уравнения (классика!) обозвать constexpr, и получить на выходе что-то типа mov ax, 12 ret вместо всего алгоритма...
этак скоро дисциплину "программирование" в ВУЗах преподавать перестанут, ибо эфект обучения будет нулевой: достаточно функцию вычисления корней квадратного уравнения (классика!) обозвать constexpr, и получить на выходе что-то типа mov ax, 12 ret вместо всего алгоритма...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
посчитать биты в заранее известной константе, разумно ли вводить это в стандарт?
Во-первых, константа может быть неизвестна, а быть результатом сложных преобразований типов и данных. Во-вторых, это может быть и не константа вовсе, тогда компилятор будет сам разбираться что с ней делать - вызовет ли что-то похожее на мою функцию в рантайме или у процессора есть специальная инструкция для этого. Главное, что мне не надо думать об этом, а думать о бизнеслогике.Добавлено after 8 minutes 37 seconds:
достаточно функцию вычисления корней квадратного уравнения (классика!) обозвать constexpr, и получить на выходе что-то типа mov ax, 12 ret вместо всего алгоритма... 
Если на входе функции константные данные, то результат её "известен" до запуска программы. Так зачем тратить время программы на её выполнение? И C++ позволяет переложить это на плечи компилятора уже сейчас, а не "скоро".- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
давным-давно в другой ветке я говорил, что мечта всех программистов заключается в том, чтобы было можно написать "сделай мне хорошо" - и это вся программа, а компилятор разберется, что именно будет хорошо... но это оффтоп и я больше не будуVladislavS писал(а):И C++ позволяет переложить это на плечи компилятора уже сейчас, а не "скоро".
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Надеюсь, таки инструкцию popcnt и ей подобные внедрят в более свежие армы. Уж очень она хороша!
А еще инструкции, которые выдают самый старший единичный бит и самый младший единичный бит.
А еще инструкции, которые выдают самый старший единичный бит и самый младший единичный бит.
Re: STM32 новичку в ARM что к чему
А еще инструкции, которые выдают самый старший единичный бит и самый младший единичный бит.
Уже есть CLZ, предварительно можно биты развернуть при помощи RBIT.
Re: STM32 новичку в ARM что к чему
В большинстве случаев не позволяет. Покажите что сгенерирует компиль если значение не константно, а например считывается из порта.VladislavS писал(а):А вот так она у меня в библиотеке на С++ работает. Вычисляется на этапе компиляции, если аргумент позволяет.
И думаю вы знаете что const в Си вовсе не делает переменную константой. Попробуйте в Си-коде заменить const на #define.
Re: STM32 новичку в ARM что к чему
В большинстве случаев не позволяет. Покажите что сгенерирует компиль если значение не константно, а например считывается из порта.
В том коде не может быть не константа - это будет ошибка компиляции.
Стоп, это другой пример, я думал это все еще про либу портов
- DJZEM
- Потрогал лапой паяльник
- Сообщения: 342
- Зарегистрирован: Чт ноя 21, 2013 14:05:26
- Откуда: Україна
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Ох уж эти замудреные дядьки ))
Re: STM32 новичку в ARM что к чему
Бонус для Eddy_Em 
Спойлер
Код: Выделить всё
uint32_t getMinPriority(uint32_t value)
{
#ifdef __ARM_ARCH_6M__
static const uint8_t table[32] = { 0, 1, 2, 24, 3, 19, 6, 25, 22, 4, 20, 10, 16, 7, 12, 26, 31, 23, 18, 5, 21, 9, 15, 11, 30, 17, 8, 14, 29, 13, 28, 27 };
value = (value & -value) * 0x04D7'651F;
return table[value >> 27];
#else
return __CLZ(__RBIT(value));
#endif
}
getMinPriority(0x0F00'00F0); // 4
getMinPriority(0x0F00'0000); // 24
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
В большинстве случаев не позволяет.VladislavS писал(а):А вот так она у меня в библиотеке на С++ работает. Вычисляется на этапе компиляции, если аргумент позволяет.
Покажите что сгенерирует компиль если значение не константно, а например считывается из порта.
Будет такой же вызов функции, как под первым спойлером. Природу не обманешь.И думаю вы знаете что const в Си вовсе не делает переменную константой.
Посмотрите ещё раз листинг. Самая натуральная константа, лежит себе в сегменте кода. Не константа будет вот такСпойлер
Попробуйте в Си-коде заменить const на #define.
Легко. Ничего это в данном случае не меняет. Спойлер
Надеюсь, предложения саму функцию заменить макросом не последует?
Добавлено after 10 minutes 17 seconds:
Бонус для Eddy_Em 
Опять ты со своими крестами. Он апострофы не понимает Добавлено after 2 minutes 55 seconds:
Код: Выделить всё
return __CLZ(__RBIT(value));Re: STM32 новичку в ARM что к чему
Не знаешь, GCC так и не научили __RBIT в компайлтайме считать?
Вроде нет. 10-й в этом или следующем месяце появится, может там будет.
Добавлено after 1 hour 31 minute 30 seconds:
Хм, а превью gcc 10 для ARM оказывается еще в начале лета появился...
Re: STM32 новичку в ARM что к чему
...
Я в похожей ситуации его ловил на F1/F3, если volatile не добавлять:
Я в похожей ситуации его ловил на F1/F3, если volatile не добавлять:
Код: Выделить всё
for (int x = 0; x < 32; x++)
{
uint8_t pixels = VRAM[pixelsOffset++];
uint8_t attr = VRAM[attrOffset++];
uint32_t index = scrTableIndex[pixels];
uint32_t addr = (uint32_t)scrTable8 + 564 * (attr & 0x7F) + index;
auto p = (volatile uint64_t*)addr;
*buf++ = p[0];
*buf++ = p[1];
}поясните, пожалуйста, почему приключился hardfault ?
и к чему здесь принуждает компилятор применение volatile ?
размещению p в озу?
Re: STM32 новичку в ARM что к чему
поясните, пожалуйста, почему приключился hardfault ?
и к чему здесь принуждает компилятор применение volatile ?
и к чему здесь принуждает компилятор применение volatile ?
Там использовалась большая таблица, внутри 16-ти битные значения, соответственно адрес выровнен по границе 2-х байт, но копирование происходит сразу по 32 бита, потому нужна поддержка невыровненного доступа или придется увеличивать таблицу в 2 раза, а она и так 70КБ. M3/M4 поддерживают невыровненный доступ не для всех инструкций копирования и компилятор как раз генерил LDRD где такой поддержки нет. А с volatile он подставлял пару LDR и все работало. Возможно это непосредственно связано с ограничениями налагаемыми на volatile переменные, но думаю другой компилятор может руководиться другими правилами кодогенерации, так что по нормальному тут нужно задействовать инлайн ассм, но т.к. это был тестовый проект, то оставил как есть... Для WS2812 нужно 24 байта на диод, там можно выровнять массив с таблицей и не переживать
ps. Да, на самом деле адрес был (volatile uint32_t*)addr и 4 копирования.
pps. Там, на мой взгляд, сама таблица достаточно интересная... Кто догадается как использовалась такая строка?
Код: Выделить всё
00000000100000001100000011100000111100001111100011111100111111101111111
11010101001010101101010111010100000101111101001000011010111101101000010
01011100010001001100101100100100111001101001101101111001000111010001101
110010100010110110011101110110001010110000101001111010110001100110001Re: STM32 новичку в ARM что к чему
У вас "неправильный" компилятор и он дает неправильный мед!VladislavS писал(а):Легко. Ничего это в данном случае не меняет.
Вот GCC.
Спойлер

С константой тоже самое.
Спойлер

В этом нет необходимости. Будет предложение сменить компилятор на нормальный, а не то что вы используете, чтобы не вводить людей в заблуждение.VladislavS писал(а):Надеюсь, предложения саму функцию заменить макросом не последует?
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
Код: Выделить всё
return __CLZ(__RBIT(value));Спойлер
Добавлено after 10 minutes 11 seconds:
Будет предложение сменить компилятор на нормальный, а не то что вы используете, чтобы не вводить людей в заблуждение.
У вас есть методика поделить компиляторы на нормальные и нет? Судя по логам, Compiler Exploer использует "/opt/compiler-explorer/arm/gcc-arm-none-eabi-9-2019-q4-major/" - официально раздаваемый ARM компилятор. И версия всего на одну ступень ниже последней.Спойлер
Re: STM32 новичку в ARM что к чему
Сравните асм мой и ваш и найдите разницу.VladislavS писал(а):У вас есть методика поделить компиляторы на нормальные и нет?
Вы утверждаете что C++ генерирует лучший код чем Си https://radiokot.ru/forum/viewtopic.php ... 5#p3924275
И при этом зачем-то использовали разные версии CGG (8.2 для Си и 9.2.1 для C++).
На деле оказалось что между асм кодом Си и C++ разницы вообще нет.
У вас на компе нет компиля что не можете проверить?VladislavS писал(а):И как узнать, что ваш пример не в режиме C++ скомпилирован?