Вс май 22, 2022 14:46:01
И для них каждый раз нужна разная конфигурация порта? Стандартных недостаточно?Я работаю с радиотехниками, там всяких синтезаторов частот, аттенюаторов, dds, коречипов вагон и тележка.
Я вполне представляю какого размера ваш код для портов. Явно больше моих 200 строк.Аналогичный макрос? Так его просто не существует. Как можно сравнить размер с тем чего нет?
Еще раз: компилятор подобные оптимизации делать не вправе.Вы так ничего и не поняли. Нет никакой ручной оптимизации. Это делает компилятор
Вот именно это и есть ручная оптимизация: вы берете регистр и руками выбираете в какой байт писать, или вообще писать не в ODR, а в BSRR.Объяснение того что происходит под прошлым спойлером тут
Нет, в ваших краях я не бывал.Это там где Принцессы «пукают фиалками»?
Так вы поэтому свой код не показываете, что боитесь что вам в любую мелочь будут тыкать.И это рассказывает человек, у которого в коде официально костыль задокументирован, иначе два раза вызывается
Нет, я просто повешу на один порт и на этом проблемы заканчиваются. Или воспользуюсь более подходящими интерфейсами вместо ногодрыга.Такое, что вам придётся вручную раскладывать доступ по портам
Есть еще удобство чтения, переносимости и модификации кода.только вот спор об эффективности мне кажется великой глупостью: для чего вам создали МК с дикими мегагерцами?
Этим можно назвать даже использование библиотек.и пару слов о кодогенераторах. имхо, это тоже тупик для интеллекта.
И поэтому на предложение показать его выхлоп вы ответили "так же"? Хотя очевидно, что отличия будут, пусть даже косметические.Т нет в рукаве никакого продвинутого конфигуратора с кодогенератором эффективного кода? А.
У меня - есть ! Написан совместно с коллегами
Вс май 22, 2022 15:48:15
SPI::spi3::Init(SPI::SPI_BR::PCLK_DIV2, SPI::CPOL::_0, SPI::CPHA::_1);
using SPI3_CS2 = GPIO::PA_0;
using SPI_AD5142 = SPI::TSIMPLE_SPI<SPI::spi3, SPI3_CS2>;
using AD5142 = TAD5142<SPI_AD5142>;
enum class RDAC_NUM : uint16_t { _1 = 0x0000, _2 = 0x0100 };
template<typename TSPI>
class TAD5142
{
public:
TAD5142() = delete;
static inline void SoftwareReset()
{
TSPI::template Write<16>(0xB000);
}
static inline void SetRDAC(RDAC_NUM r_num, uint8_t rdac)
{
TSPI::template Write<16>(0x1000 + uint16_t(r_num) + rdac);
}
static inline void RDAC2EEPROM(RDAC_NUM r_num)
{
TSPI::template Write<16>(0x7001 + uint16_t(r_num));
}
};
struct __attribute__((__packed__)) USB_DEVICE_DESCRIPTOR
{
uint8_t bLength; // размер дескриптора
DescriptorType bDescriptorType; // тип дескриптора
uint16_t bcdUSB; // версия usb
uint8_t bDeviceClass; // класс устройства
uint8_t bDeviceSubClass; // подкласс
uint8_t bDeviceProtocol; // протокол
uint8_t bMaxPacketSize0; // максимальный размер пакета для нулевой конечной точки
uint16_t idVendor; // VID
uint16_t idProduct; // PID
uint16_t bcdDevice; // версия (ревизия) устройства
uint8_t iManufacturer; // индекс строки с названием производителя
uint8_t iProduct; // индекс строки с названием устройства
uint8_t iSerialNumber; // индекс строки с серийным номером устройства
uint8_t bNumConfigurations; // количество поддерживаемых конфигураций
};
constexpr USB_DEVICE_DESCRIPTOR DeviceDescriptor =
{
.bLength = sizeof(DeviceDescriptor),
.bDescriptorType = DescriptorType::DEVICE,
.bcdUSB = 0x0200, // usb 2.0
.bDeviceClass = 0x02, // Communications and CDC Control
.bDeviceSubClass = 0x02, //
.bDeviceProtocol = 0x00, // No class specific protocol required
.bMaxPacketSize0 = 0x40, // 64
.idVendor = 0x0483, // VID
.idProduct = 0x5740, // PID
.bcdDevice = 0x0200, //
.iManufacturer = 0x01, //
.iProduct = 0x02, //
.iSerialNumber = 0x03, //
.bNumConfigurations = 0x01 //
};
Вс май 22, 2022 18:48:53
public:
static DataT Read()
{
return Regs()->ODR;
}
static void Write(DataT value)
{
Regs()->ODR = value;
}
static void ClearAndSet(DataT clearMask, DataT value)
{
Regs()->BSRR = (value | (uint32_t)clearMask << 16);
}
static void Set(DataT value)
{
Regs()->BSRR = value;
}
static void Clear(DataT value)
{
Regs()->BSRR = ((uint32_t)value << 16);
}
static void Toggle(DataT value)
{
Regs()->ODR ^= value;
}
static DataT PinRead()
{
return Regs()->IDR;
}
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
return ((uint16_t)GPIOx->ODR);
}
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
GPIOx->ODR = PortVal;
}
Вс май 22, 2022 19:04:23
Тогда зачем вы их перечисляли в качестве ответа на вопрос о настройках порта?В них вообще не нужна конфигурация порта.
А учитывая, что мой макрос выполняет все, что требуется, получается, в вашем 95% - мусор?Ну так ваш макрос и делает не больше 5% от моего.
И поэтому их нет смысла даже обсуждать. Вы бы еще хвастаться начали, как создаете целочисленные переменные.Большинство дескрипторов имеют строго определённый формат
Хотите сказать, это компилятор вам в исходник код вписывает? У вас ручная оптимизация В ИСХОДНИКЕ.Да сколько же можно тупить? Это делаю не я, а компилятор
Можно так. Можно демонстративно накостылить еще больше, чтобы говноразводке соответствовал еще и говнокод. Ну там магических констант насыпать, Ардуинские библиотеки вперемешку с ST-HAL'ом. Хотя я такое вряд ли осилю.Пошлёте заказчика, который принесёт плату, разведённую на ногодрыг, лесом?
Вс май 22, 2022 19:07:16
Вс май 22, 2022 19:31:02
pa0_15.clear();
pa4_11.clear();
pa8_15.clear();
Вс май 22, 2022 19:42:55
Вс май 22, 2022 20:11:29
//===========
// MSD Descriptor Type
//===============
struct __attribute__((__packed__)) USB_MSD_DESCRIPTOR
{
USB_INTERFACE_DESCRIPTOR Interface_0; // MSD Interface
USB_ENDPOINT_DESCRIPTOR EndPoint_1; // | Data IN Endpoint
USB_ENDPOINT_DESCRIPTOR EndPoint_2; // | Data OUT Endpoint
};
//===========
// CDC VCP Configuration Descriptor Type
//===============
struct __attribute__((__packed__)) USB_CDC_VCP_CONFIGURATION_DESCRIPTOR
{
USB_CONFIGURATION_DESCRIPTOR Config;
USB_CDC_VCP_DESCRIPTOR cdc;
};
//============
// MSD + CDC Configuration Descriptor Type
//================
struct __attribute__((__packed__)) USB_MSD_CDC_CONFIGURATION_DESCRIPTOR
{
USB_CONFIGURATION_DESCRIPTOR Config;
USB_MSD_DESCRIPTOR msd;
USB_INTERFACE_ASSOCIATION_DESCRIPTOR iad;
USB_CDC_VCP_DESCRIPTOR cdc;
};
Вс май 22, 2022 20:15:44
Но этот метод можно заранее прописать, и Си-ки это сделают, все равно вы в коде не будете жонглировать пинами, и у вас будет четкая привязка к пинам.VladislavS писал(а):Смысл был в том, что для разных наборов данных выбирается разный метод.
Вс май 22, 2022 20:38:20
Вс май 22, 2022 20:39:11
Вс май 22, 2022 20:52:12
Как раз на автомате и без участия программистаVladislavS писал(а):Делать подобное стоит, только если всё на автомате, без участия программиста
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;
}
вы же листин показываете, если тут оптимизация кода пошла ну тогда давайте конкретно посмотрим. И если уж листин показываете, тогда пишите на каком компиляторе вы этого добились, iar или arm-gcc или может какой там у вас еще есть.VladislavS писал(а):Вот вы смотрите на листинги разных clear() и зачем-то хотите их отдельно скомпилировать.
Вс май 22, 2022 21:15:01
То есть вы подменили задачу и обвиняете меня, что настаиваю на исходной? Исходная задача была именно про ConfigurationDescriptor и HIDDescriptor, это вас зачем-то понесло на DeviceDescriptor, который меняется примерно никогда.Вот и объясните, какого рожна вы на очередной круг поехали?
Ну то есть как я и говорил, надо лазить туда-сюда чтобы настроить дескриптор. Номера дескрипторов, номера точек, размеры, параметры. А потом еще раз чтобы заполнить их значениями.Вообще не проблема. Собирается из типовых дескрипторов на раз два.
А кто тут хвастался, что все элементарно делается? viewtopic.php?p=4234849#p42348492. Я знаю как это сделать с помощью шаблона. Это несложная, но кропотливая работа. Мне она на практике не нужна. HID пробовал, но на практике не использую. Соответственно и время на это тратить не хочу.
То есть нормального решения нет, пошли уродливые костыли?3. В отличии от "чудоконфигуратора для GPIO", для HID есть неплохая общедоступная программа, которой можно быстро состряпать любой HID.
Я не преуспел только с определением размера. Сейчас стоит костыль с ручным указанием. К счастью, требуется оно нечасто.4. Судя по вашему вопросу в этой теме, с макросами вы тоже не сильно преуспели.
Оптимальное решение из написанных вами РУЧНЫХ оптимизаций. Сколько можно повторять это?!Я не делаю это руками. Это делает компилятор. Cколько раз можно повторять? Я написал правила, компилятор сам по ним выбирает оптимальные решения.
Сделают, конечно, какая разница на каком языке заниматься ручной оптимизацией.В том то и дело что не сделают. Во-первых, это как раз и будет ручная оптимизация.
Вс май 22, 2022 21:19:35
Вс май 22, 2022 21:28:18
Вызов с параметром покажите.VladislavS писал(а):О, ещё один!
Я вижу оптимизацию компилятора. А для каждого пина можно свой метод прописать.VladislavS писал(а):Ну так я исходный код приложил, сопоставьте его с листингом.
Еще как большая. В совокупности эта разница вылазит в хорошие килобайты.VladislavS писал(а):На разных компиляторах будет небольшая разница
arm-gcc
Program Size:
text data bss dec hex filename
21685 144 808 22637 586d Proekt_32F030.elf
iar
14'784 bytes of readonly code memory
1'718 bytes of readonly data memory
1'864 bytes of readwrite data memory
Вс май 22, 2022 22:26:30
Пн май 23, 2022 06:12:52
Пн май 23, 2022 06:16:46
Пн май 23, 2022 07:23:33
Пн май 23, 2022 10:18:31
Именно об этом я и говорю: сначала создаешь структуру, потом заполняешь ее поля. Структуры-то для разных устройств разные.У вас какая-то извращённая фантазия. Просто берёшь и заполняешь поля структуры. Вы что прямо из головы дескрипторы пишете?
Опять в двух местах менять.Ну так оно элементарно и делается, просто надо аккуратно все возможные поля по спецификации закодировать.
Где костыли? Удобный визуальный инструмент,
Опять вы упорно игнорируете то, что я вам говорю. Вы РУКАМИ прописали четыре (или сколько там) вариантов. Да, компилятор потом может еще пройтись, что-то свернуть.Да поймите же
Какое ваше дело до чужих достижений? Своими хвастайтесь, тогда их и будем обсуждать.Да едрическая ты сила. "Театр одного актера", млин. Его спрашивают: