Пример 1.
1: using PL1 = PinList<PA_1, PA_2>;
2: using PL2 = PinList<PL1, GpioB<0xF0>, PC_2>;
3: static_assert(PL2::Size() == 7);
4: static_assert(PL2::PortCount() == 3);
Строка 1: Cоздаю список PL1 из двух пинов PA1 и PA2.
Строка 2: Cоздаю второй список PL2, состоящий из списка PL1, четырёх пинов порта GPIOB (PB4-PB7) и пина PC2.
Строка 3: Проверяю, что в результате развёртывания списка, порта и пинов в результирующий список попало 7 пинов.
Строка 4: Проверяю, что в списке есть пины с трёх разных портов (A,B,C).
Пример 2.
using PL1 = PinList<PA_1, PA_2>; using PL2 = PinList<PL1, GpioB<0xF0>, PA_2>;
При компиляции этого кода я получу ошибку "static assertion failed: PinList has Duplicates". Тут PA2 дважды попала в список. Это третий тип проверки.
Пример 3.
using PL1 = PinList<PA1<PinMode::Input_Floating>, PA2<PinMode::Analog>>; using PL2 = PinList<PL1, GpioB<0xF0, PinMode::PushPull_LowSpeed<>>, PC_0>;
PL2::modes();
Тут я создал список пинов, но в отличии от Примера 1, задал им режимы работы. Всем, кроме одного PC0. И если теперь вызвать метод установки режимов, то получу ошибку "static assertion failed: Pin mode undefined".
Пример 4.
using PL1 = PinList<PA_1, PA_2, PB_1, PB_2>;
PL1::set();
PL1::clear();
ldr r2, [pc, #76] ; 0x48000400 - GPIOB mov.w r0, #1207959552 ; 0x48000000 - GPIOA movs r3, #6 ; (1<<1) | (1<<2) str r3, [r0, #24] ; GPIOA->BSRR = (1<<1) | (1<<2); str r3, [r2, #24] ; GPIOB->BSRR = (1<<1) | (1<<2); strh r3, [r0, #26] ; *((uint16_t *)&GPIOA->BSRR+1) = (1<<1) | (1<<2); strh r3, [r2, #26] ; ; *((uint16_t *)&GPIOB->BSRR+1) = (1<<1) | (1<<2);
Создаём список из четырёх пинов на двух портах, устанвливаем их в единицу и сбрасываем в ноль. Подглядываем в листинг. Для установки записали 6 в BSRR. Для сброса записали 6 в старшие 16 бит BSRR. Все оптимизации сработали. Связь между C++ и asm установлена.
Да, ничего общего с автоматическим тестированием это не имеет. Все воздействия я задаю руками. И в случае с листингом проверяю глазами. Но это эмбэдд, тут за каждый байт/такт надо сражаться. С другой стороны, это библиотека, она пишется один раз и потом работает в десятках проектов.