[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4235525#p4235525"]
Ну так любую задачу можно разбить на подзадачи.[/uquote]Между можно и нужно большая разница.Вот прямо в вашей фразе звучит две отдельных задачи: сконфигурировать, переключать.
[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4235525#p4235525"]И сколько вариантов периферии вы реализовали? Отдельно светодиод. Что еще?[/uquote]Я работаю с радиотехниками, там всяких синтезаторов частот, аттенюаторов, dds, коречипов вагон и тележка. И в разных изделиях их применяют в разных сочетаниях и количествах. И это не считая всяких чисто наших эмбеддерских микросхем памяти, разнообразных датчиков, индикаторов, клавиатур и т.д. Так что, дофига и больше, если быть совсем точным.
[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4235525#p4235525"]У вас часто возникает задача генерировать такие контроллеры и настраивать именно урезанные пины?[/uquote]Ну вот в июне будет очередной проект с Microblaze. Только какое отношение моя практика имеет к принципу построения библиотеки?
[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4235525#p4235525"]Да, по фрагментам. Даже ваши фрагменты занимают раза в три больше места, чем аналогичный макрос.[/uquote]Аналогичный макрос? Так его просто не существует. Как можно сравнить размер с тем чего нет?
[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4235525#p4235525"]Выигрыш в пару тактов у вас только там, где вы заморочились с ручной оптимизацией (вроде байтового доступа к регистрам).[/uquote]Вы так ничего и не поняли. Нет никакой ручной оптимизации. Это делает компилятор по тем правилам, которые я ему один раз рассказал.
Спойлер
Код: Выделить всё
GpioA<0xFFFF> pa0_15;
GpioA<0x0FF0> pa4_11;
GpioA<0xFF00> pa8_15;
// pa0_15.clear();
LDR.N R0,??DataTable2_2 // &GPIOA->ODR
MOVS R1,#+0
STR R1,[R0, #+0] // 32 битный доступ в ODR
// pa4_11.clear();
MOV R2,#+4080
STRH R2,[R0, #+6] // 16 битный доступ в старшую часть BSRR
// pa8_15.clear();
MOVS R3,#+0
STRB R3,[R0, #+1] // 8 битный доступ во второй байт ODR
Спойлер
Код: Выделить всё
template<uint32_t PM=PinsMask>
static inline void clear()
{
if constexpr (PM == 0xFFFF)
base()->ODR = 0;
else if constexpr (PM == 0x00FF)
*pVU8(&base()->ODR) = 0;
else if constexpr (PM == 0xFF00)
*(pVU8(&base()->ODR) + 1) = 0;
else if constexpr((PM & 0xFF)==0)
*(pVU8(&base()->BSRR)+3) = PM>>8;
else
*(pVU16(&base()->BSRR)+1) = PM;
}[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4235525#p4235525"]Хорошо, но какое это имеет отношение к разбиению линии данных по портам?
Изменить способ обмена через define ничуть не сложнее.[/uquote]Такое, что вам придётся вручную раскладывать доступ по портам, а я просто укажу на каких ногах какой сигнал подключен и дальше... Ну вы знаете, компилятор "всё сделает сам".


