в этом случае с макросами Волкова не очень красиво получается, так как там в одном месте через запятую перечислены указатель на порт volatile void *, маска unsigned short, и активный уровень, который вообще не имеет типа, так как просто приклеивается препроцессором в нужное место. соответственно последнее сильно мешает, так как засунуть эту H или L из препроцессора в переменную ещё как-то можно, а вот обратно - никак. препроцессор не может достать значение переменной и вклеить в кусок кода.
можно попробовать сделать похожие макросы Волкова, небольшие inline функции, void on(const tPin &pin){ if (pin.polarity == "H") pin.port|= pin.mask; else pin.port &= ~pin.mask; }
typedef struct{ volatile void * port; unsigned short mask; unsigned char polarity; }tPin;
const tPin LED0 = {GPIOA, (1<<5), "H"};
и потом уже создавать массив таких стуктур. но работать это будет уже не так быстро. так как проверки уровня и извлечение нужного порта будет происходить не во время компиляции макроса в единственную инструкцию, а во время исполнения.
другой тупой способ: void on_n(int n){ switch(n){ case 0: on(LED0); case 1: on(LED1); case 2: on(LED2); case 3: on(LED3); ... } }
on_n(i);
|