Пт май 20, 2022 14:50:38
template<uint8_t... data>
struct __attribute__((packed)) LOGICAL_MIN
{
uint8_t size{};
uint8_t buf[sizeof...(data)]{data...};
constexpr LOGICAL_MIN()
{
size = sizeof...(data)+19;
}
};
constexpr __attribute__((used)) LOGICAL_MIN<1,2,3,4,5> foo;
SECTION `.rodata`:CONST:REORDER:ROOT(2)
DATA
DATA8
DC8 24, 1, 2, 3, 4, 5
Пт май 20, 2022 15:12:23
Пт май 20, 2022 15:15:18
template<uint8_t sz>
struct __attribute__((packed)) LOGICAL_MIN
{
uint8_t size{sz+19};
uint8_t buf[sz]{};
static_assert ((sz>0)&(sz<5));
constexpr LOGICAL_MIN(uint32_t data)
{
for(auto i=0; i<sz; i++,data>>=8) buf[sz-i-1]=data;
}
};
constexpr __attribute__((used)) LOGICAL_MIN<3> foo(0x010203);
SECTION `.rodata`:CONST:REORDER:ROOT(2)
DATA
DATA8
DC8 22, 1, 2, 3
Пт май 20, 2022 15:19:00
Пт май 20, 2022 15:23:19
Пт май 20, 2022 15:29:00
Пт май 20, 2022 15:31:10
Пт май 20, 2022 16:14:37
template<typename T>
class LOGICAL_MIN
{
static constexpr auto CalcSize()
{
// Тут вбиваем критерий выбора размера
return sizeof(T);
}
static constexpr auto sz = CalcSize();
static_assert ((sz>0)&(sz<5));
public:
uint8_t buf[sz+1]{};
constexpr LOGICAL_MIN(T data)
{
buf[0]=sz+19;
for(auto i=0; i<sz; i++,data>>=8) buf[sz-i]=data;
}
};
constexpr LOGICAL_MIN foo((uint16_t)0x01020304);
SECTION `.rodata`:CONST:REORDER:ROOT(2)
DATA
DATA8
DC8 21, 3, 4
Мне-то откуда знать что в вашем коде?Кто-то запрещает сделать GPIO_PP в моём случае?
using PushPull = PinMode::PushPull_LowSpeed<>;
using LED=PA13<>;
LED::mode<PushPull>();
using mode1 = PushPull;
using mode2 = PinMode::Input_PullUp;
PA13<mode1>::mode();
PA13<mode2>::mode();
PinList<PA_1, PA_2, LED, GpioB<>>::mode<PushPull>();
template<uint8_t... data>
struct LOGICAL_MIN
{
uint8_t buf[sizeof...(data)+1]{sizeof...(data), data...};
};
constexpr LOGICAL_MIN<1,2,3,4,5> foo;
Пт май 20, 2022 16:50:54
Пт май 20, 2022 18:32:31
А как этим пользоваться?Код:
static const uint8_t USB_HIDDescriptor[] = {
//keyboard
USAGE_PAGE( USAGEPAGE_GENERIC ),//0x05, 0x01,
USAGE( USAGE_KEYBOARD ), // 0x09, 0x06,
COLLECTION( COLL_APPLICATION, // 0xA1, 0x01,
REPORT_ID( 1 ), // 0x85, 0x01,
USAGE_PAGE( USAGEPAGE_KEYBOARD ), // 0x05, 0x07,
USAGE_MINMAX(224, 231), //0x19, 0xE0, 0x29, 0xE7,
LOGICAL_MINMAX(0, 1), //0x15, 0x00, 0x25, 0x01,
REPORT_FMT(1, 8), //0x75, 0x01, 0x95, 0x08
INPUT_HID( HID_DATA | HID_VAR | HID_ABS ), // 0x81, 0x02,
Предлагается угадать какой из? Или таки надо указать?
Давайте еще пример с необходимостью проверки на конкретную плату, в которой переключение на выход приведет к выгоранию порта.В FPGA порты встроенного микроконтроллера можно синтезировать только на вход, чтобы не тратить лишние ресурсы.
Пт май 20, 2022 18:38:24
здесь в администрации мудаков мало, их вне её хватает, так что смотрите сами... чтобы не увеличить случайно поголовьеEddy_Em писал(а):А где бы еще можно было потрепаться на разные околожелезячные и прочие темы? Но чтобы в администрации/модераторах не было такого количество мудаков, как там?
да что я могу показать, если я синтаксиса С++ не знаю вообще, тем более все фишки?! я попытался ваш код переделать "по наитию", но понял, что не понял, как можно получить число, вычислить, сколько в нем байтов, и это количество использовать для указания размера статического массива... в случае списка байтов все понятно уже... со списком и _VA_ARGS_ можно и на Си реализовать, и даже проще будет выглядеть, хоть и без автоматики вычисления количества аргументов (хотя я не помню, может и в Си аналог есть)VladislavS писал(а):Показывай что не получается.
Пт май 20, 2022 19:44:46
template<uint32_t data>
class LOGICAL_MIN
{
static constexpr auto CalcSize()
{ // Тупо в лоб
if constexpr (data>0x00FF'FFFF) return 4;
else if constexpr (data>0x0000'FFFF) return 3;
else if constexpr (data>0x0000'00FF) return 2;
else return 1;
}
static constexpr auto sz = CalcSize();
public:
uint8_t buf[sz]{};
constexpr LOGICAL_MIN()
{
auto x = data;
for(auto i=0; i<sz; i++,x>>=8) buf[sz-i-1]=x;
}
};
constexpr __attribute__((used)) LOGICAL_MIN<0x010203> foo;
SECTION `.rodata`:CONST:REORDER:ROOT(2)
DATA
DATA8
DC8 1, 2, 3
template <typename TPin, bool invert = false>
struct TLED
{
static inline void SetMode() { TPin::template mode<PushPull>(); }
static inline void On() { invert ? TPin::clear() : TPin::set(); }
static inline void Off() { invert ? TPin::set() : TPin::clear(); }
};
auto foo()
{
using LED = TLED<GPIO::PA_13>;
LED::SetMode(); // Переключит режим в PushPull
LED::On();
LED::Off();
}
Пт май 20, 2022 21:49:37
Очевидно, что весь дескриптор написать в том же стиле. Механизм я показал, дальше самостоятельно.
Ровно там, где вы стали выдумывать дурацкие примеры с разными вариантами push-pull.Где тут что-то про чип сказано?
Нет уж, я вашу работу делать не собираюсь.Это делается легко, но оставлю вам на самостоятельную проработку.
Пт май 20, 2022 22:54:44
auto* p = foo.buf;
Сб май 21, 2022 00:31:12
Я все еще не знаю как это сделать вашим способом.Весь дескриптор должен быть одним вариативным шаблоном структуры. В списке параметров у него составные части (одну из них я по вашей просьбе показал как реализовать), которые конструктор этой структуры (структура в С++ это класс) соберёт в один массив и расположит во флэш.
Удивительно, почему добавление в обычную структуру конструктора сделало непонятным как её применять?
#include <stdio.h>
#include <inttypes.h>
template<uint8_t sz>
struct __attribute__((packed)) LOGICAL_MIN{
uint8_t size{sz+19};
uint8_t buf[sz]{};
static_assert ((sz>0)&(sz<5));
constexpr LOGICAL_MIN(uint32_t data){
for(auto i=0; i<sz; i++,data>>=8) buf[sz-i-1]=data;
}
};
constexpr __attribute__((used)) LOGICAL_MIN<3> foo(0x010203);
int main(){
uint8_t *buf = (char*)&foo;
int sz = sizeof(foo);
printf("%i\n", sz);
for(int i=0; i<sz; i++){
printf("%.2X ", buf[i]);
}
}
Ну, тут мои полномочия уже всё. Книжки за вас читать я не могу. Продолжайте вымучивать макросами.
Повторяю в третий раз: тот, который нужен для зажигания светодиода и управления реле.Ну ведь они и есть разные, с этим не поспоришь. Я просто хотел уточнить, какой из них должен быть выставлен.
Вам только сгенерированные контроллеры приглючились, что встречается еще реже.Не надо мне свои фантазии приписывать. Не мне горящие порты приглючились.
Сб май 21, 2022 07:39:52
template<uint8_t sz>
struct __attribute__((packed)) LOGICAL_MIN
{
uint8_t size{ sz + 19 };
uint8_t buf[sz]{};
static_assert (sz > 0 && sz < 5);
constexpr LOGICAL_MIN(uint32_t data)
{
for (auto i = 0; i < sz; i++, data >>= 8)
buf[sz - i - 1] = data;
}
};
constexpr __attribute__((used)) LOGICAL_MIN<3> foo(0x010203);
int main()
{
auto* buf = (uint8_t*)&foo;
int sz = sizeof(foo);
rtt.println(sz);
for (int i = 0; i < sz; i++)
{
rtt.println("{02x}"_fs, buf[i]);
}
}
>> 4
>> 16
>> 01
>> 02
>> 03
Сб май 21, 2022 07:47:23
uint8_t *buf = (uint8_t *)&foo;
template<uint32_t data>
class LOGICAL_MIN
{
static constexpr auto CalcSize()
{
if constexpr (data>0x00FF'FFFF) return 4;
else if constexpr (data>0x0000'FFFF) return 3;
else if constexpr (data>0x0000'00FF) return 2;
else return 1;
}
static constexpr auto sz = CalcSize();
public:
uint8_t buf[sz+1]{};
constexpr LOGICAL_MIN()
{
auto x = data; buf[0] = sz+19;
for(auto i=0; i<sz; i++,x>>=8) buf[sz-i]=x;
}
};
constexpr LOGICAL_MIN<0x010203> foo;
int main()
{
printf("%i\n", sizeof(foo));
for(auto &x : foo.buf) printf("%.2X ", x);
}
There are more things in heaven and earth, Horatio,
Than are dreamt of in your philosophy.
W. Shakespeare, Hamlet
Сб май 21, 2022 08:27:06
привели кусок кода, который непонятно куда вставлять.Вы что-то путаете. Вы попросили помочь "раскрутить" LOGICAL_MIN, так как не можете макросами его побороть. Я за десять минут накидал
Повторяю в пятый раз: меня как программиста не волнует какой режим будет выставлен, меня волнует как светодиод зажечь.Любой из них зажжёт светодиод и реле. Повторяю вопрос в четвёртый раз - какой из них выбрать? И почему для светодиода, а не затвора транзистора? Чем светодиод так примечателен, что для него целый метод в библиотеке GPIO написан?
И у вас регулярно возникает задача перевести в push-pull режим именно эти ноги? Разговор-то начался именно с этого.Вы вообще диалог вести умеете? Вы же сами спросили "Что за контроллер без push-pull режима?". Я привёл пример из своей практики
Сб май 21, 2022 09:27:15
uint8_t *buf = (uint8_t *)&foo;
for(int i=0; i<sizeof(foo); i++)
printf("%.2X ", buf[i]);
for(auto &x : foo.buf)
printf("%.2X ", x);
Сб май 21, 2022 09:33:07
namespace menuTmpl
{
inline PB1 lcdLed;
inline PC2 greenLed;
inline Encoder<PC6, PC7, Timer3> encoder;
inline PC_Keyboard<PA0, PC1, Timer12> pcKeyb;
using lcdStream = Dma1Stream4<0>; // SPI2_TX
using spi2 = Spi2<PB13, PB14, PB15, false, PB12, PinDummy<>, PinSpeed::High>;
inline LcdSpi<ILI9341, LcdOrient::LandscapeRev, spi2, PB11, PA8, lcdStream> lcd;
enum class Key : uint16_t { None = 0xFFFF, Up = 0x41, Down = 0x42, Enter = 0x0A, ReleaseEnter = 0x800A, LongEnter = 0x10A, Back = 0x7F };
constexpr Key keysTbl[] = { Key::Up, Key::Down, Key::Back, Key::Enter };
constexpr ButtonConfig conf =
{
.queueSize = 4,
.shortMask = 0b1110,
.longMask = 0b0001,
.releaseMask = 0b0001,
.repeatMask = 0b1100
};
using keysPins = PinList<PC13, PA1, PB0, PB10>;
inline ButtonsTbl<keysPins, keysTbl, conf> buttons;
.....
(greenLed | lcdLed).mode<PinMode::PushPull_MediumSpeed>();
lcdLed.set();
buttons.init();
encoder.init(100);
pcKeyb.init();
lcd.init(SpiBaudRate::Presc_4);
Menu<decltype(lcd), menuItems> menu(console_8x12, Rect(10, 10, 250, 120));
....
template<Pin Ch1, Pin Ch2 = PinDummy<>, Pin Ch3 = PinDummy<>, Pin Ch4 = PinDummy<>, Pin Etr = PinDummy<>>
static consteval auto timer()
{
#if defined(STM32G041K8)
constexpr auto ch1 = setAF<Ch1, "1:AF2,PA8 2:AF2,PA0,PA5,PA15 3:AF1,PA6,PB4 14:AF4,PA4,PA7,AF0,PB1 16:AF5,PA6,AF2,PB8 17:AF5,PA7,AF2,PB9">();
constexpr auto ch2 = setAF<Ch2, "1:AF2,PA9,AF1,PB3 2:AF2,PA1,PB3 3:AF1,PA7,PB5 15:AF5,PA3,PB15,AF2,PC2">();
constexpr auto ch3 = setAF<Ch3, "1:AF2,PA10,AF1,PB6 2:AF2,PA2 3:AF1,PB0">();
constexpr auto ch4 = setAF<Ch4, "1:AF2,PA11 2:AF2,PA3 3:AF1,PB1">();
constexpr auto etr = setAF<Etr, "1:AF2,PA12 2:AF2,PA0,PA5,PA15">();
#elif defined ...
static_assert(ch1.af != AltFunc(-1), "CH1 pin is Invalid!");
.....
return ch1 | ch2 | ch3 | ch4 | etr;
}
using fmc = FmcBank1<8, PD7, PE6>;
LcdFmc<RM68140, LcdOrient::LandscapeRev, fmc, PB13, 1, 1, 1, 5, 3, 3, Dma1Stream1<>> lcd;
lcd.init();
using lcdDataPins = PinList<PE10, PE9, PE8, PE7, PD1, PD0, PD15, PD14>;
Lcd<RM68140, LcdOrient::Landscape, PB13, lcdDataPins, PD7, PE6, PD5, PD4, 0, 8, 0> lcd;
PinList<Pins::RS, Pins::WR, Pins::Data>::write(reg);