Это С++ читаемый? Ну-ну…
Особенно когда там используются шаблоны. Прямо читабельный донельзя!
Я на гитхабе, в ЖЖ
Этот текст легко читает любой знающий корейский язык. Намёк понятен? Почему каждый считает, что должен с лёгкостью читать неизвесьный ему язык программирования?이 텍스트는 한국어를 아는 사람이 쉽게 읽을 수 있습니다.
как по мне, "специалисту" С++, в шаблонах крайне сложно уследить за тем, что куда подставляется и когда. т.е. где "шаблон" для подстановки, а где "как есть" все останется. вот я на все эти ваши С++ версии смотрю - вроде нутром понимаю, как там и что, но страшно даже пробовать...Reflector писал(а):Что в шаблонах нечитаемого?
Код: Выделить всё
extern "C" void SysTick_Handler()
{
PA_15::toggle();
}Код: Выделить всё
SysTick_Handler:
LDR.N R1,??DataTable1_6 ;; 0x4001080c
LDR R2,[R1, #+0] ;; Read ODR
LSLS R3,R2,#+16
MOV R0,#+32768
BPL.N ??SysTick_Handler_0
STR R0,[R1, #+8] ;; Write BRR
BX LR
??SysTick_Handler_0:
STR R0,[R1, #+4] ;; Wtite BSRR
BX LR ;; return Код: Выделить всё
typedef PinList<Pb1, Pb0, Pb2, Pb1, Pc3, Pc4, Pc5> Group1;Код: Выделить всё
static inline constexpr uint32_t countSetBits(uint32_t value)
{
uint32_t bits = 0;
while (value)
{
value &= value - 1;
bits++;
}
return bits;
}Код: Выделить всё
template <uint32_t GpioID, uint16_t PM=0xFFFF>
class TSimplePort
{
static_assert(PM>0, "Wrong mask");
static inline auto base() { return (GPIO_TypeDef*)GpioID; }
public:
TSimplePort() = default;
static inline void toggle()
{
if constexpr (PM == 0xFFFF)
base()->ODR = ~base()->ODR;
else
if constexpr (countSetBits(PM)==1)
if(base()->ODR & PM) base()->BRR = PM; else base()->BSRR = PM;
else
base()->BSRR = (PM << 16) | (~base()->ODR & PM);
}
};Код: Выделить всё
template <uint32_t GpioID, uint16_t PM=0xFFFF>Код: Выделить всё
static_assert(PM>0, "Wrong mask");Код: Выделить всё
static inline auto base() { return (GPIO_TypeDef*)GpioID; }Код: Выделить всё
TSimplePort() = default;Код: Выделить всё
using TestPort = TSimplePort<uint32_t(GPIOA_BASE)>;
TestPort::toggle();
LDR.W R5,??main_0 ;; 0x4001080c
LDR R0,[R5, #+0] ;; Read ODR
MVNS R0,R0
STR R0,[R5, #+0] ;; Write ODRКод: Выделить всё
using TestPort = TSimplePort<uint32_t(GPIOA_BASE), (1<<2)>;
TestPort::toggle();
LDR.W R5,??main_0 ;; 0x4001080c
LDR R0,[R5, #+0] ;; Read ODR
LSLS R1,R0,#+29
ITTEE MI
MOVMI R0,#+4
STRMI R0,[R5, #+8] ;; Write BRR
MOVPL R1,#+4
STRPL R1,[R5, #+4] ;; Write BSRR
Код: Выделить всё
using TestPort = TSimplePort<uint32_t(GPIOA_BASE), (1<<2)|(1<<1) >;
TestPort::toggle();
LDR.W R5,??main_0 ;; 0x4001080c
LDR R0,[R5, #+0] ;; Read ODR
MVNS R0,R0
AND R0,R0,#0x6
ORR R0,R0,#0x60000
STR R0,[R5, #+4] ;; Write BSRRКод: Выделить всё
if(((GPIO_TypeDef*)GpioID)->ODR & PM) ((GPIO_TypeDef*)GpioID)->BRR = PM; else ((GPIO_TypeDef*)GpioID)->BSRR = PM;