Привет, лор.
Речь про плюсы. Хочу разместить в начале прошивки структуру, содержащую некоторую инфу. Типа такого:
// вот упрощённая структура
struct AppInfo
{
uint32_t signature;
uint32_t version;
char name[20];
uint32_t crc;
}
// и вот я пытаюсь её снабдить CRC:
constexpr AppInfo appInfo __attribute__((section(".app_info"), used)) =
{
0x0002,
0x0001,
"My Device",
calcCrc32(&appInfo, offsetof(AppInfo, crc))
};
// вот как выглядит функция calcCrc32:
static constexpr uint32_t calcCrc32(const uint8_t* buf, size_t bufLen)
{
// тут вычисление crc
}
И вот тут ну никак не получается. Компилятор отказывается преобразовывать указатель в const uint8_t*
в compile-time. Я нагуглил кучу вопросов про это, и ни одного работающего решения. Вроде как в c++26 обещают что-то подкрутить. Единственное (очень костыльное) решение, которое я придумал - превратить структуру в массив uint8_t:
struct AppHeader
{
uint8_t bytes[128];
uint32_t crc;
};
constexpr AppInfo appInfo __attribute__((section(".app_info"), used)) =
{
.bytes =
"\0"
"\1"
"My Device",
.crc = calcCrc32(appInfo.bytes, sizeof(appInfo.bytes))
};```
Это коряво, придётся потом вручную парсить массив байтов, вычленяя элементы. Но деваться некуда, таков уж современный c++. Или так, или добавлять в процесс сборки отдельный скрипт для подсчёта crc32. Грустно.