Перейти к содержанию
    

Плавный переход C -> C++ под МК

48 минут назад, Arlleex сказал:

Объясните, пожалуйста, на пальцах, если не трудно.

std::aligned_storage резервирует память необходимого размера и с необходимым выравниванием с гарантией отсутствия неопределенного поведения.

placement new располагает в этой области необходимую вам структуру и возвращает указатель на нее. Дальше можно работать с этим указателем, мне больше нравится работать со ссылкой. Эта структура должна иметь конструктор, который не делает с этой структурой ничего (в данном случае это конструктор по умолчанию).

#include    <type_traits>
std::aligned_storage<sizeof(uint32_t), alignof(uint32_t)> Buffer[512 / sizeof(uint32_t)];

struct packet
{
    uint32_t    A;
    uint16_t    B;
    uint8_t     C;
};

#include    <new>
void test()
{
    auto const & Packet = *(new(Buffer) packet);

    uint32_t A = Packet.A;
    uint16_t B = Packet.B;
    uint8_t  C = Packet.C;

}

Фактически placement new() приводит переданный ему указатель к нужному типу и вызывает конструктор с этим указателем. Программист должен гарантировать, что переданный в placement new() указатель отвечает всем требованиям к выравниванию и прочему, 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А std::aligned_storage это что-то наподобие __attribute__((aligned(x)))?

Просто какой способ правильнее - атрибутами задать выравнивание и т.д., либо этим aligned_storage?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, Arlleex сказал:

А std::aligned_storage это что-то наподобие __attribute__((aligned(x)))?

Слушать аудиосказку Вовка в тридевятом царстве (1965 г.)

https://en.cppreference.com/w/cpp/types/aligned_storage

3 минуты назад, Arlleex сказал:

Просто какой способ правильнее - атрибутами задать выравнивание и т.д., либо этим aligned_storage?

std:: как бы намекает, что это будет работать всегда с любым компилятором без шаманства.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дискуссия в этой теме в основном ведется о самом языке С++. Меня интересует другое - при создании проекта С++  в IDE Keil будут ли сложности с использованием SPL? Взял небольшой миландровский пример проекта для К1986ВЕ92QI с инициализацией ядра и части периферии, и просто переименовал main.c в main.cpp. Проект оттранслировался, но  выскочила куча варнингов. На порядок больше, чем с main.c. Сам я привык уже к работе на C++. Где будет больше геммороя при работе в Keil - при возврате к С или при использовании С++? Речь именно о самой среде Keil с прилагаемым компилятором и паках со стандартными библиотеками. Не о сравнении  С и С++!!! 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Forger said:

На порядок больше, чем с main.c.

Больше? В нормальном проекте вообще не должно быть варнингов. Их исправление нельзя откладывать на потом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, aem сказал:

Меня интересует другое - при создании проекта С++  в IDE Keil будут ли сложности с использованием SPL?

Так spl-ные файлы .c-ные, соответственно, Keil будет их обрабатывать Си-компилятором, не C++. Покажите варнинги тогда.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все же некоторые пишут на С++ в Keil. Они не используют CMSIS и SPL? Или как-то иначе? В IAR народ обходит слева - https://habr.com/ru/post/459642/. А в Keil как? 

Хочется писать на С++ как привык, и использовать свои заделы. Колется вручную работать с ядром и периферией.

И вообще - вопрос, как я понимаю, не в среде. А в отсутствий SPL, написанной на С++? Без  разницы - Keil, IAR, Eclipse. SPL всё равно все сишные.

Как люди в таких условиях пишут для ARM на С++?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, aem said:

Хочется писать на С++ как привык, и использовать свои заделы.

А при чем тут keil? Это просто среда. Пишите как вам угодно, в рамках стандарта языка.

 

7 minutes ago, aem said:

В IAR народ обходит слева - https://habr.com/ru/post/459642/.

Не "народ", а отдельные граждане. Точно также можно "обходить" и на keil, если очень хочется.

 

8 minutes ago, aem said:

Все же некоторые пишут на С++ в Keil

Сейчас очень многие пишут сразу на плюсах (многие в стиле С по привычке), но всего-то лет 10 назад это были лишь единицы, энтузиасты так сказать )

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне из ++ пока что облегчили жизнь пространства имен и возможность запихивать функции простигосподи методы в структуры для инкапсуляции простигосподи сокрытия данных. И ВСЕ.

В остальном пока что это, скорее, бодания с вычурными ограничениями языка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, aem сказал:

Они не используют CMSIS и SPL? Или как-то иначе?

А там, где вы нарабатывали свои заделы (подозреваю, что в виндовсе) вы системные функции ОС не вызывали? Или думаете, они на плюсах написаны? Там все то же самое - могучий extern "C" позволяет вызывать сишные и прочие ассемблерные функции из плюсов в любой среде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, aem сказал:

Как люди в таких условиях пишут для ARM на С++?

Если вам не удобно, то скомпилируйте вначале функции SPL в библиотеку и вызывайте из своей программы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

48 минут назад, HardEgor сказал:

Если вам не удобно, то скомпилируйте вначале функции SPL в библиотеку и вызывайте из своей программы.

От необходимости extern "C" в прототипах это не спасет))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/23/2023 at 6:23 PM, Arlleex said:

От необходимости extern "C" в прототипах это не спасет))

Можно и не в прототипах

extern "C" {
     #include "..."
     #include "..."
     #include "..."
     #include "..."
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/4/2022 at 11:39 AM, Variant99 said:

Хорошо, что вы помните, что вчера написали в своём коде. А откройте его через полгодика. Вспомните ли, что такое например  mux[4]; Вот нам со стороны ну ваще непонять, че это за хреновинка приляпана, че она там содержит. Или isValid - это валидность чего? ХЗ. Мы тут потратили 2 страницы на объяснения, чтобы понять, что ж вы там пытаетесь написать то. 

А для этого надо не переменную делать длинную, а контекст задачи дробить, где уже не надо будет писать isValidSomeStufff, а будет ясно и без комментариев, что isValid.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...