Привязка строк и указателей к флэш-памяти при использовании расширения X-macro

Мне показалось, что я хорошо понимаю X-макросы, но это меня очень сильно озадачило. Я определил следующий код:

#define FOR_DESCR_STRINGS(apply) \
    apply(LANGUAGE_ID_STRING, "\0x04\0x03\0x09\0x04")  \
    apply(MANUFACTURER_STRING, "Quest Engineering & Development, Inc.") \
    apply(PRODUCT_STRING, "PowerExpander Eq10E") \
    apply(SERIAL_NUMBER_STRING, "\0x00")              \
    apply(MS_OS_COMPAT_STRING "MSFT100\0xFF")

#define SELECT_DESCR_STRING_ID(a, b) a,
#define SELECT_DESCR_STRING(a, b) b
#define SELECT_DESCR_STRING_PTR(a, b) b,

enum
{
     FOR_DESCR_STRINGS(SELECT_DESCR_STRING_ID)
     DESCR_STRING_CNT
};

const uint8_t  DESCR_STRINGS[][] = /* Array of Descriptor Strings */
    {FOR_DESCR_STRINGS(SELECT_DESCR_STRING)};  

const uint8_t* DESCR_STRING_PTRS[] = /* Array of Descriptor String Ptrs */
    {FOR_DESCR_STRINGS(SELECT_DESCR_STRING_PTR)}; 

Я хотел, чтобы строки и указатели уходили во флэш-память, но в итоге я получаю.rodata, где указатели и строки копируются в ОЗУ во время кода запуска Си. Есть ли способ сделать то, что я хочу сделать здесь (определить несколько строк и определить массив указателей на строки), чтобы они оставались во флэш-памяти и не копировались в ОЗУ, все еще используя X-макросы? Спасибо,

1 ответ

Ваша проблема меньше связана с расширением макроса или C, как это происходит с компоновщиком и файлом дескриптора набора разброса / разброса, и, возможно, с вашим базовым оборудованием.

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

Вы могли бы использовать #pragma или же __attribute__() изменить название раздела с .rodata в .text, но такие вещи общеизвестно непостоянны, хрупки и очень специфичны для разных поставщиков. GNU делает это не так, как Keil, или IAR, или GHS, и иногда механизмы и недокументированные функции (например, такие, в которых тыкаешь, пока он не работает для тебя) меняются от версии к версии.

Даже если бы вы могли, вы можете обнаружить, что ваш USB-контроллер просто не может получить доступ к флэш-памяти, что в любом случае требует его расширения в SRAM.

Другие вопросы по тегам