Привязка строк и указателей к флэш-памяти при использовании расширения 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.