Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: Литература для stm32

Пт май 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


Добавлено after 3 minutes 35 seconds:
А какой push-pull нужен чтобы зажечь светодиод или включить реле?
Предлагается угадать какой из? Или таки надо указать?

Что за контроллер без push-pull режима?
В FPGA порты встроенного микроконтроллера можно синтезировать только на вход, чтобы не тратить лишние ресурсы.

Re: Литература для stm32

Пт май 20, 2022 15:12:23

VladislavS, красиво! поскольку я знал, о чем идет речь, то все понял.
но комментарии не помешали бы... не понял, что такое sizeof... - это что, троеточие теперь тоже часть ключевых слов языка? и это самое сайзоф - это что такое? функция, макрос, ключевое слово, класс и т.п.?!

Re: Литература для stm32

Пт май 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


Добавлено after 2 minutes 31 second:
что такое sizeof... - это что
Это то же самое что и sizeof, только возвращает количество элементов в пачке параметров. Фактически ключевое слово языка.

Re: Литература для stm32

Пт май 20, 2022 15:19:00

кстати, только сейчас заметил, что в постановке задачи используется ЧИСЛО, а у вас - список... так что ваше решение для другой задачи, однако...
:))) пока писал - опередили. однако, и тут количество байтов в числе у вас должно быть заранее известно... похоже, и тут не от этой задачи решение.

Добавлено after 1 minute 30 seconds:
имхо, (боюсь ошибиться), тут и без шаблона можно обойтись, только конструктором структуры...

Re: Литература для stm32

Пт май 20, 2022 15:23:19

и тут количество байтов в числе у вас должно быть заранее известно...
Вычисли количество байт из числа или списка - дело техники. Зависит от постановки задачи. Я же не знаю критерия.

Re: Литература для stm32

Пт май 20, 2022 15:29:00

я хотел попробовать... но споткнулся об невозможность описать в структуре массив фиксированной длины, которая может быть известна (вычислена) только в конструкторе...

Re: Литература для stm32

Пт май 20, 2022 15:31:10

однако, и тут количество байтов в числе у вас должно быть заранее известно... похоже, и тут не от этой задачи решение.

Размер всегда можно по максимуму выбрать, а после массива сохранить получившийся в конце всех расчетов размер. Потом другой небольшой класс будет копировать в себя столько сколько нужно и использоваться будет уже его массив, а предыдущий компилятор выкинет.

Re: Литература для stm32

Пт май 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


Добавлено after 22 minutes 30 seconds:
Кто-то запрещает сделать 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>();


Добавлено after 12 minutes 21 second:
я хотел попробовать... но споткнулся об невозможность описать в структуре массив фиксированной длины, которая может быть известна (вычислена) только в конструкторе...
Показывай что не получается. Ибо это как раз то что в моём примере, по описанию. Какую-то мелочь не учёл скорее всего.
Код:
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;

Re: Литература для stm32

Пт май 20, 2022 16:50:54

Нормально вы так в сторону от основной темы ушли ☺
Ну, раз уж здесь офтоп начался, и я поофтоплю: окончательно разосрался с нацистскими админами "киберфорума", так что там меня забанили нафиг ☺
А где бы еще можно было потрепаться на разные околожелезячные и прочие темы? Но чтобы в администрации/модераторах не было такого количество мудаков, как там?

Re: Литература для stm32

Пт май 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,

Как заменить LOGICAL_MINMAX на вашу структуру?
Предлагается угадать какой из? Или таки надо указать?

Предлагается вполне типичная задача - зажечь светодиод или включить реле. Желательно так, чтобы этот код переносился с камня на камень без изменений.
В FPGA порты встроенного микроконтроллера можно синтезировать только на вход, чтобы не тратить лишние ресурсы.
Давайте еще пример с необходимостью проверки на конкретную плату, в которой переключение на выход приведет к выгоранию порта.

Re: Литература для stm32

Пт май 20, 2022 18:38:24

Eddy_Em писал(а):А где бы еще можно было потрепаться на разные околожелезячные и прочие темы? Но чтобы в администрации/модераторах не было такого количество мудаков, как там?
здесь в администрации мудаков мало, их вне её хватает, так что смотрите сами... чтобы не увеличить случайно поголовье :)))

VladislavS писал(а):Показывай что не получается.
да что я могу показать, если я синтаксиса С++ не знаю вообще, тем более все фишки?! я попытался ваш код переделать "по наитию", но понял, что не понял, как можно получить число, вычислить, сколько в нем байтов, и это количество использовать для указания размера статического массива... в случае списка байтов все понятно уже... со списком и _VA_ARGS_ можно и на Си реализовать, и даже проще будет выглядеть, хоть и без автоматики вычисления количества аргументов (хотя я не помню, может и в Си аналог есть)

Re: Литература для stm32

Пт май 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


Добавлено after 42 minutes 56 seconds:
А как этим пользоваться?
...
Как заменить LOGICAL_MINMAX на вашу структуру?
Очевидно, что весь дескриптор написать в том же стиле. Механизм я показал, дальше самостоятельно.

Желательно так, чтобы этот код переносился с камня на камень без изменений.
Я же показал как. Определяете тип PushPull и код будет независим от чипа. Где тут что-то про чип сказано?
Код:
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();
}


Давайте еще пример с необходимостью проверки на конкретную плату, в которой переключение на выход приведет к выгоранию порта.
Это делается легко, но оставлю вам на самостоятельную проработку. Я делал свой GPIO для Microblaze на Verylog. Работает раз в 5 быстрее, чем тот что Vivado в библиотеке предлагает.

Re: Литература для stm32

Пт май 20, 2022 21:49:37

Очевидно, что весь дескриптор написать в том же стиле. Механизм я показал, дальше самостоятельно.

Я пока не понимаю даже как вашу структуру хоть куда-то вывести, не то что дописать рабочий дескриптор. Обычное приведение типов не работает. Или ваш foo не переменная?
Ваш подход вызывает проблемы на ровном месте.
Где тут что-то про чип сказано?
Ровно там, где вы стали выдумывать дурацкие примеры с разными вариантами push-pull.
Это делается легко, но оставлю вам на самостоятельную проработку.
Нет уж, я вашу работу делать не собираюсь.

Re: Литература для stm32

Пт май 20, 2022 22:54:44

Я пока не понимаю даже как вашу структуру хоть куда-то вывести, не то что дописать рабочий дескриптор.
Весь дескриптор должен быть одним вариативным шаблоном структуры. В списке параметров у него составные части (одну из них я по вашей просьбе показал как реализовать), которые конструктор этой структуры (структура в С++ это класс) соберёт в один массив и расположит во флэш.

Или ваш foo не переменная?
Ага, constexpr переменная, лежащая в сегменте ".rodata". :cry: Удивительно, почему добавление в обычную структуру конструктора сделало непонятным как её применять?
Код:
auto* p = foo.buf;
p это указатель на ваш дескриптор. Вернее на кусочек дескриптора, но смысл от этого не меняется. Из таких собрать полный дескриптор дело техники.

Ваш подход вызывает проблемы на ровном месте.
Ну, тут мои полномочия уже всё. Книжки за вас читать я не могу. Продолжайте вымучивать макросами.

Ровно там, где вы стали выдумывать дурацкие примеры с разными вариантами push-pull.
Ну ведь они и есть разные, с этим не поспоришь. Я просто хотел уточнить, какой из них должен быть выставлен.

Нет уж, я вашу работу делать не собираюсь.
Не надо мне свои фантазии приписывать. Не мне горящие порты приглючились.

Re: Литература для stm32

Сб май 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]);
  }
}

Ну, тут мои полномочия уже всё. Книжки за вас читать я не могу. Продолжайте вымучивать макросами.

Ну все так все. Не можете продемонстрировать преимущества своего подхода - стоило ли его тогда рекламировать?
Ну ведь они и есть разные, с этим не поспоришь. Я просто хотел уточнить, какой из них должен быть выставлен.
Повторяю в третий раз: тот, который нужен для зажигания светодиода и управления реле.
Не надо мне свои фантазии приписывать. Не мне горящие порты приглючились.
Вам только сгенерированные контроллеры приглючились, что встречается еще реже.

Re: Литература для stm32

Сб май 21, 2022 07:39:52

почему даже банальный код дампа переменной не работает:

Re: Литература для stm32

Сб май 21, 2022 07:47:23

Я все еще не знаю как это сделать вашим способом.
Ничего удивительного. Вы же не думали, что выучите С++ по одному моему сообщению? Тут надо: книжка -> упражнения -> практика -> вопросы -> гугл -> практика и т.д.

Это вы мне скажите, почему даже банальный код дампа переменной не работает:
Нет, это вы мне скажите, почему у вас вызывает трудности банально вывести содержимое структуры? Собственно, вот это поможет вашему коду
Код:
uint8_t *buf = (uint8_t *)&foo;
А для вашего LOGICAL_MIN, скорее всего, больше вот так подойдёт - проще общий дескриптор собирать будет.


Ну все так все. Не можете продемонстрировать преимущества своего подхода - стоило ли его тогда рекламировать?
Я рекламировал? Вы что-то путаете. Вы попросили помочь "раскрутить" LOGICAL_MIN, так как не можете макросами его побороть. Я за десять минут накидал разные варианты решения - выбирайте. Наверное, это и есть одно из преимуществ - быстро и понятно. Другое - контроль данных, всякую хрень как в макрос не засунешь. Писать вам весь HID дескриптор я не собираюсь, даже "на слабо" :)))

Повторяю в третий раз: тот, который нужен для зажигания светодиода и управления реле.
Любой из них зажжёт светодиод и реле. Повторяю вопрос в четвёртый раз - какой из них выбрать? И почему для светодиода, а не затвора транзистора? Чем светодиод так примечателен, что для него целый метод в библиотеке GPIO написан? Не проще ли простенький классик, описывающий поведение светодиода и работающий с любым GPIO, накидать? А GPIO оставить то что должен делать GPIO. Для затравки код из предыдущего моего сообщения.

Вам только сгенерированные контроллеры приглючились, что встречается еще реже.
Вы вообще диалог вести умеете? Вы же сами спросили "Что за контроллер без push-pull режима?". Я привёл пример из своей практики. На то что вам такого не попадалось, отвечу цитатой
There are more things in heaven and earth, Horatio,
Than are dreamt of in your philosophy.

W. Shakespeare, Hamlet


Добавлено after 1 minute 9 seconds:
Reflector, спасибо, рецепт оказался одинаковый :)
Последний раз редактировалось VladislavS Сб май 21, 2022 08:32:48, всего редактировалось 1 раз.

Re: Литература для stm32

Сб май 21, 2022 08:27:06

Вы что-то путаете. Вы попросили помочь "раскрутить" LOGICAL_MIN, так как не можете макросами его побороть. Я за десять минут накидал
привели кусок кода, который непонятно куда вставлять.
Любой из них зажжёт светодиод и реле. Повторяю вопрос в четвёртый раз - какой из них выбрать? И почему для светодиода, а не затвора транзистора? Чем светодиод так примечателен, что для него целый метод в библиотеке GPIO написан?
Повторяю в пятый раз: меня как программиста не волнует какой режим будет выставлен, меня волнует как светодиод зажечь.
А на счет специального метода - для типичной задачи должно быть типичное решение. А работа с кнопками, светодиодами, реле - типичная задача.
Вы вообще диалог вести умеете? Вы же сами спросили "Что за контроллер без push-pull режима?". Я привёл пример из своей практики
И у вас регулярно возникает задача перевести в push-pull режим именно эти ноги? Разговор-то начался именно с этого.
А так еще классическая ATmega8 есть, у которой ADC6, ADC7 могут работать только как АЦП, но не как GPIO.
---
Пока что преимущество вашего подхода абсолютно неочевидно: читать сложнее, кода больше. Ну можно добавить ненужные проверки, которые ни от чего не спасут.

Re: Литература для stm32

Сб май 21, 2022 09:27:15

привели кусок кода, который непонятно куда вставлять.
Ну извините, продолжайте упражнения с макросами...

Повторяю в пятый раз: меня как программиста не волнует какой режим будет выставлен, меня волнует как светодиод зажечь.
Вы смешиваете в одном предложении две разные задачи:
1. Установить режим на ноге, к которой подключен светодиод. Очень странно, что вас не волнует, что это за режим будет.
2. Зажечь светодиод. Тут надо просто сделать LED::On(); действительно ничего не зная о режиме.

А на счет специального метода - для типичной задачи должно быть типичное решение. А работа с кнопками, светодиодами, реле - типичная задача.
Всё верно. Светодиод, кнопка и даже реле типовые объекты наших схем и заслуживают написания для них, пусть и простенького, но отдельного от GPIO кода. Пусть GPIO занимается GPIO, там своих задач хватает.

И у вас регулярно возникает задача перевести в push-pull режим именно эти ноги?
Вы не поверите, у меня никогда не возникает задача перевести только входные ноги в режим push-pull. А если я попытаюсь это сделать, то не смогу, так как компилятор посредством моего класса "покрутит у виска" и не даст этого сделать.

А так еще классическая ATmega8 есть, у которой ADC6, ADC7 могут работать только как АЦП, но не как GPIO.
Ну значит они не являются объектом управления библиотекой GPIO вовсе. Нет порта - нет проблемы.

Пока что преимущество вашего подхода абсолютно неочевидно: читать сложнее, кода больше. Ну можно добавить ненужные проверки, которые ни от чего не спасут.
Тут стоило бы поставить ВАШЕ ЖИРНОЕ IMHO. Ибо существует и совершенно противоположное мнение : читать проще (я вот в голове макросы раскручивать вообще не умею, а классы, шаблоны и функции вижу как работают), исходного кода меньше (шаблоны, да ещё с if constexpr, пишутся один раз для разных данных и инстанцируются по мере необходимости автоматически), результирующий код лучше по быстродействию, дополнительные проверки позволяют избегать многих ошибок. Ну и конечно же, можно сделать много такого, чего макросам даже и не снилось.

Добавлено after 19 minutes 9 seconds:
Вот даже не надо далеко ходить, пару сообщений выше, сравните
Код:
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);

Re: Литература для stm32

Сб май 21, 2022 09:33:07

Пока что преимущество вашего подхода абсолютно неочевидно: читать сложнее, кода больше. Ну можно добавить ненужные проверки, которые ни от чего не спасут.

Есть у меня тестовый проект, я там могу раскомментировать одну строку и подключить хедер для проверки, допустим, менюшки:

Т.к. здесь все внутри своего пространства имен, то можно одну строку закомментить, раскомментить другую и тестить какие-нибудь RGB светодиоды... И если присмотреться то видно, что почти в каждый класс пробрасываются пины при этом ни разу явно не указывается режим или AF, единственное для SPI я указал скорость портов High вместо VeryHigh. Все настраивается автоматически, если в класс энкодера передали Timer3, то для F730R8 TIM3_CH1 можно заремапить на PA6/PB4/PC6 и скомпилируется код только с этими пинами иначе получим осмысленное сообщение об ошибке, потому что пока пины доберутся до функции инициализации они путешествуют по целому ряду других классов:

Или хотим мы не SPI дисплей, можно заменить пару строк и подключиться при помощи FMC:
Код:
using fmc = FmcBank1<8, PD7, PE6>;
LcdFmc<RM68140, LcdOrient::LandscapeRev, fmc, PB13, 1, 1, 1, 5, 3, 3, Dma1Stream1<>> lcd;
lcd.init();

Опять же все пины проверяются и им присваивается AF, кроме пина сброса. Если не нравится FMC, можно к тем же пинам подключиться при помощи ногодрыга:
Код:
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);

Т.е. либа выводит сразу 10(18) бит, если все пины будут с одного порта, то будет одна запись в BSRR, иначе будет как минимум не хуже ручной оптимизации и точно без ошибок присущих ручной оптимизации...
Ответить