-3

我以为我对 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)}; 

我希望字符串和指针进入闪存,但我最终得到的是 .rodata,其中指针和字符串在 C 启动代码期间被复制到 RAM。有没有办法在这里做我想做的事情(定义多个字符串并定义指向字符串的指针数组),以便它们留在闪存中并且在仍然使用 X 宏时不会复制到 RAM 中?谢谢,

4

1 回答 1

-1

与链接器和分散收集/链接器描述符文件一样,您的问题与宏扩展或 C 相比较少,可能与您的底层硬件有关。

const数据几乎总是指向.rodata,它由链接器描述符文件放置在内存映射中,它也(有点……并且可能非常间接地)指定需要由启动库初始化的东西。

您可能可以使用#pragma__attribute__()将部分名称从 更改.rodata.text,但众所周知,这类事情变化无常、易碎且非常特定于供应商。GNU 的做法与 Keil、IAR 或 GHS 不同,有时机制和未记录的特性(比如你在它适合你之前一直在研究它)会随着版本的变化而变化。

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

于 2016-04-21T00:53:05.697 回答