C 使用X宏扩展时将字符串和指针强制放入闪存

C 使用X宏扩展时将字符串和指针强制放入闪存,c,embedded,x-macros,C,Embedded,X Macros,我原以为我对X-macros很了解,但这真的让我难堪。我定义了以下代码: #define FOR_DESCR_STRINGS(apply) \ apply(LANGUAGE_ID_STRING, "\0x04\0x03\0x09\0x04") \ apply(MANUFACTURER_STRING, "Quest Engineering & Development, Inc.") \ apply(PRODUCT_STRING, "PowerExpander Eq

我原以为我对X-macros很了解,但这真的让我难堪。我定义了以下代码:

#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)}; 
我希望字符串和指针进入flash,但我最终得到的是.rodata,在C启动代码期间指针和字符串被复制到RAM中。在这里我想做什么(定义多个字符串和定义字符串的指针数组),这样它们就可以留在闪存中,并且在仍然使用X宏的情况下不会复制到RAM中?
谢谢,

与链接器和分散聚集/链接器描述符文件以及底层硬件相比,宏扩展或C的问题更少

const
数据几乎总是指向
.rodata
,它由链接器描述符文件放置在内存映射中,该文件还(某种程度上……可能非常间接地)指定需要由启动库初始化或不需要初始化的内容

您可以使用
#pragma
uuu属性()
将节名从
.rodata
更改为
.text
,但这类内容变化无常、脆弱,而且非常特定于供应商。GNU的做法不同于Keil、IAR或GHS,有时机制和未记录的特性(就像这样,你一直戳到它适合你)会随着版本的变化而变化


即使可以,您可能会发现您的USB控制器根本无法访问闪存,因此您必须将其扩展到SRAM中。

我认为,创建阵列的方式(X宏与否)与它们为什么以RAM而不是闪存结尾无关。这是非常具体的操作系统,系统,闪存类型,加载策略和其他设置,你最终会得到什么。例如,某些闪存无法随机寻址,加载程序在启动时将整个图像加载到RAM中。更多示例:在某些系统上,某些闪存的访问速度比RAM慢,因此,特定于系统的工具会做出相应的权衡决策。。。告诉我们更多关于你处理的事情,我们可能会有一些想法。这显然与X宏无关。好吧,那么可能只是对C的误解。我想也许我需要更全面地模仿我在没有X宏的情况下所做的事情。谢谢,实际上USB控制器可以访问闪存。如果我离散地这样做以强制它进入闪存,我需要这样做
constuint8_t PRODUCT_STRING[]={“PowerExpander Eq10E”}然后我需要引用uint32\u t数组中的指针。枚举很简单。我想我需要用我的x-macro扩展更直接地模拟这一点。谢谢你的意见。