[uquote="iddqd",url="/forum/viewtopic.php?p=3937124#p3937124"]Там где мне вот именно перфоманс (а может и размер кода) важен, я вообще скажу reg32_write(reg, val) на какой-нибудь BSRR.[/uquote]И получите неоптимальный код. Потому что
[uquote="iddqd",url="/forum/viewtopic.php?p=3937124#p3937124"]И это будет чуть не 1 инструкция асма,[/uquote]это не будет одна инструкция. Это будет загрузка адреса BSRR в РОН и загрузка val в другой РОН. С последующей командой STR. Это если reg32_write в той же единице трансляции находится. А то ещё ведь ещё и её вызов может произойти. А C++ метод на этапе компиляции сначала проверит, а не совпадает ли маска выводимых данных с 0xFF, 0xFFFF. Тогда И BSRR никакой не нужен, а можно командой STRB или STRH прямо байт или слово в ODR пульнуть. Но, допустим, счастья не случилось и надо писать в BSRR. Опять начинаем анализ записываемых данных с целью определить, нельзя ли обойтись командами STRB или STRH. Потому что, если вспомнить систему команд ARM (да, да, С++ программисты её знают), то константы меньшей разрядности загружаются в РОН проще, что приводит к более быстрому и компактному коду. А так как методы класса статические, описаны в заголовочном файле, то всё гарантировано заинлайнится. И вот тогда действительно будет всего несколько ассемблерных инструкций. Звучит сложно и как фантастика, но на деле все просто. Пример делает 10 импульсов на PA9.
Код: Выделить всё
//Repeat<10>([]{ PA_9::set(); PA_9::clear(); });
MOVS R0,#+2
LDR.N R1,??DataTable1_4 ;; 0x48000019
STRB R0,[R1, #+0]
STRB R0,[R1, #+2]
STRB R0,[R1, #+0]
STRB R0,[R1, #+2]
STRB R0,[R1, #+0]
STRB R0,[R1, #+2]
STRB R0,[R1, #+0]
STRB R0,[R1, #+2]
STRB R0,[R1, #+0]
STRB R0,[R1, #+2]
STRB R0,[R1, #+0]
STRB R0,[R1, #+2]
STRB R0,[R1, #+0]
STRB R0,[R1, #+2]
STRB R0,[R1, #+0]
STRB R0,[R1, #+2]
STRB R0,[R1, #+0]
STRB R0,[R1, #+2]
STRB R0,[R1, #+0]
STRB R0,[R1, #+2]
Хренушки твоя reg32_write(reg, val) вызванная 20 раз даст такой код!
[uquote="iddqd",url="/forum/viewtopic.php?p=3937124#p3937124"]А мне это нафига?[/uquote]Стандартный аргумент, когда не можешь. Знакомо.
[uquote="iddqd",url="/forum/viewtopic.php?p=3937124#p3937124"]К тому же в этом коде потом ардуинщик "типа знающий плюсы" дров наломает мама не горюй,[/uquote]Наоборот. Он не полезет внутрь библиотек, а будет вызывать простые и понятные методе типа serial.begin.
[uquote="iddqd",url="/forum/viewtopic.php?p=3937124#p3937124"]Есть шанс что код на этой почве поймут не так как это было задумано.[/uquote]Кто поймёт? Код компилятор должен понимать. Мнение безграмотных читателей в топку.
[uquote="iddqd",url="/forum/viewtopic.php?p=3937124#p3937124"]Для сей я могу написать стартап сам. Для плюсов я это не сделать не возьмусь.[/uquote]Ну, это лишь говорит о полном непонимании вопроса, который вы так многословно обсуждаете. К сообщению приложен стартап для GCC под С и С++. Какая из строчек вам непонятна?
[uquote="iddqd",url="/forum/viewtopic.php?p=3937124#p3937124"]Вот лично вы смогете накорябать плюсам стартап? А может еще и на плюсах?! А то сям на сях - можно. На кортексах без ассемблера вообще, что прикольно.[/uquote]А думаете кто мне стартапы пишет? Если бы вы читали форум, а не только писали, то уже давно бы нашли мой иниверсальный стартап для Cortex-M, который совместим с GCC, IAR и Keil.
[uquote="iddqd",url="/forum/viewtopic.php?p=3937124#p3937124"]
Насколько тривиально на С все размудрить для таких списков пинов?
Оно и на сях придет к чему-то весьма культурному, если не страдать фигней.[/uquote]Вы даже не поняли в чём подвох. Печально.
[uquote="iddqd",url="/forum/viewtopic.php?p=3937124#p3937124"]
В IAR и Keil стартап по ResetHandler передаёт управление стандартной библиотеке. Она сама знает есть ли конструкторы и вызывает их.
Вот именно это мне и не нравится. Есть какие-то волшебники, рангом покруче вас, которые вот так могут. А вот лично вы понятия не имеете что они делают, как это работает, но вы почему-то типа круче.[/uquote]Когда я лет 20 назад осваивал работу в IAR, то исследовал что делает стартовая библиотека. Смотрел исходники, щупал отладчиком. Пришел к выводу, что там нет ничего лишнего и писали её профи. Именно поэтому для IAR я смело ResetHandler перенаправляю на __cmain и знаю что всё будет Оk.
[uquote="iddqd",url="/forum/viewtopic.php?p=3937124#p3937124"]Вот чем мне ассемблерщики нравятся - не верят в черную магию черных ящиков. И знают что у них внутри.[/uquote]Вера начинается там где заканчиваются знания. Знания С++ программиста обычно гораздо выше. По крайней мере, тех с кем я сталкивался по жизни. Им не надо верить в чёрную магию, они её сами делают.
[uquote="iddqd",url="/forum/viewtopic.php?p=3937124#p3937124"]И интересно сколько упражнений местных вообще пройдут проверку такими тулзами без мата статического анализатора.[/uquote]Покажите мне как ассемблерные вставки его проходят. Ага.