[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4005326#p4005326"]Если вы про мой код, то там массив указателей на функции[/uquote]Ну значит всё так как я писал. С несколькими конечными точками это проигрывает по коду. Не забываем, что я в классах, у меня всё инлайнится только в путь.
[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4005326#p4005326"]
Код: Выделить всё
if(USB->ISTR & USB_ISTR_CTR){
uint8_t epnum = USB->ISTR & USB_ISTR_EP_ID;
if(USB_EPx(epnum) & USB_EP_CTR_RX){ //OUT
epfunc_out[epnum](epnum);
ENDP_CTR_RX_CLR(epnum);
}
if(USB_EPx(epnum) & USB_EP_CTR_TX){//IN
epfunc_in[epnum](epnum | 0x80);
ENDP_CTR_TX_CLR(epnum);
}
}
[/uquote]На самом деле, всё хуже чем я думал. Много лишних чтений регистров. И зачем передавать в обработчик номер точки, если он в таблице однозначно к ней привязан. Применение uint8_t на 32-битном контроллере там где можно лучше избегать - могут порождаться лишние инструкуции усечения разрядности. Это же прерывание, тут чем быстрее, тем лучше.
[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4005326#p4005326"]поскольку для ep0 допустим размер 8 байт, а туда не то что Configuration или HID, но даже DeviceDescriptor не влезет.[/uquote]Да ладно. 64 только в путь.
[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4005326#p4005326"]Ну вам же надо сначала создать структуру, а потом заполнить ее значениями. И для нового класса делать и то и другое снова. Не похоже чтобы это добавляло какой-то безопасности по сравнению с байтовым массивом.[/uquote]Формат дескрипторов определён спецификацией. Описать формат данных как тип это самое обычное дело в программировании. Положил в заголовочный файл и пользуешься по необходимости. Заполнить типизированную структуру без ошибок куда проще, чем какой-то байтовый массив сформировать. Байтом больше, байтом меньше, съехали поля или нет - хрен его знает. А так всё по строго определённым полям разложено. Определить тип(класс) и создать объект этого типа - обычная практика программирования. Наличие типа, описывающего формат данных, всегда лучше его отсутствия. Не понимаю, почему такие элементарные вещи вызывают вопросы.
[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4005326#p4005326"]И для нового класса делать и то и другое снова.[/uquote]Там этих дескрипторов вагон и тележка, одним больше, одним меньше. Определил тип, положил в заголовочный файл и пусть себе лежит, хоть для всех классов разом, жрать не просит. Когда надо воспользовался.
[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4005326#p4005326"]Ну, это на любителя. Я предпочитаю включать тактирование периферии именно там, где периферия настраивается.[/uquote]Я разве против? А я предпочитаю периферию настраивать в одном месте. Ответите взаимностью?
[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4005326#p4005326"]А экономия на инициализации - пустая трата времени. Этот код выполняется единственный раз.[/uquote]Для меня пустая трата времени - рыскать по коду чтобы найти что включено, а что нет. Экономия в размере кода это лишь побочный эффект моего подхода. Запись одной константы в регистр против множества RMW. Но опять же, я не против вашего подхода, знаю много программистов, делающих так же. Хватает флэша, да и ладно.
[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4005326#p4005326"]В моем коде так вообще в рантайме настраивается:[/uquote]Зачем тащить в рантайм то что считается в компайлтайме? Это же всё константные данные.
[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4005326#p4005326"]Тогда зачем настраивать точки?[/uquote]Я не настраиваю точки. Это всего одна лишняя запись в таблице дескрипторов буферов. Проблема тут лишь в том, что не дошли руки эту запись под constexpr утащить. Понимаете, я хоть и люблю С++, но переписывать на него те места, где не получишь выигрыша в чём либо, особого смысла нет. А этот кусок был изначально на Си написан.
[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4005326#p4005326"]Си-шный код читать еще проще.[/uquote]Это действительно так, пока вы его макросами не обложили. Только обусловлено это сильно ограниченными возможностям языка по сравнению с С++. А расширенные возможности требуют расширенного синтаксиса. Почему-то Си программисты поголовно считают, что должны понимать код на языке, которого не знают. Изучите С++ и тоже будете понимать.
[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4005326#p4005326"]Ну и пренебрегать имнованными константами все же не стоит, читаемость они повышают.[/uquote]Во-первых, это не про мой код. Во-вторых, какие-то двойные стандарты. Типизировать данные ни-ни, а константы будь добр обозвать? Ну вот захотел я увидеть значение 65 в этом месте - имею право.