ВходНаше всё Теги codebook PARTS Поиск Опросы Закон Пятница
28 января
/1164621
Топик полностью
VladislavS. (14.01.2022 20:29, просмотров: 99) ответил VVB на Какие инструменты модульного тестирования (на ПК) можно использовать для вариативного шаблона, вариативной шаблонной лямбде и прочих прелестей С++20?
Попробую показать как можно тестировать работу метапрограмм. 

Пример 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 установлена.


Да, ничего общего с автоматическим тестированием это не имеет. Все воздействия я задаю руками. И в случае с листингом проверяю глазами. Но это эмбэдд, тут за каждый байт/такт надо сражаться. С другой стороны, это библиотека, она пишется один раз и потом работает в десятках проектов.