从armcc迁移到armclang会导致节类型冲突

从armcc迁移到armclang会导致节类型冲突,c,compiler-errors,arm,embedded,clang,C,Compiler Errors,Arm,Embedded,Clang,由于ARM KeilµVision已将其默认编译器从armcc更改为armclang,因此我正在尝试迁移现有项目。在迁移指南的帮助下,通过简单地切换编译器生成的大多数新错误都很容易清除。但我似乎无法修复以下错误: Display/icons.c(54): error: 'iconBitMapArray' causes a section type conflict with 'pNULL' XRAM_VAR GUI_CONST_STORAGE GUI_BITMAP *iconBitMapArr

由于ARM KeilµVision已将其默认编译器从
armcc
更改为
armclang
,因此我正在尝试迁移现有项目。在迁移指南的帮助下,通过简单地切换编译器生成的大多数新错误都很容易清除。但我似乎无法修复以下错误:

Display/icons.c(54): error: 'iconBitMapArray' causes a section type conflict with 'pNULL'
XRAM_VAR GUI_CONST_STORAGE  GUI_BITMAP *iconBitMapArray[] =  // bitmaps for icons
                                        ^
Display/icons.c(44): note: declared here
XRAM_VAR GUI_CONST_STORAGE GUI_BITMAP pNULL =  // used for returning a pointer to a NULL image
以下是相关代码:

#define XRAM_VAR                __attribute__((section("XRAM_DATA")))

XRAM_VAR uint32_t icon_status_internal;
XRAM_VAR GUI_CONST_STORAGE GUI_BITMAP pNULL =  // used for returning a pointer to a NULL image
{
    0, /* XSize */
    0, /* YSize */
    0, /* BytesPerLine */
    0, /* BitsPerPixel */
    0, /* Pointer to picture data (indices) */
    0  /* Pointer to palette */
};

XRAM_VAR GUI_CONST_STORAGE GUI_BITMAP *iconBitMapArray[] =  // bitmaps for icons
{
        &pNULL,
        &bmIcon1,
        &bmIcon2,
        // ...etc.
};
变量
icon\u status\u internal
也会导致相同的错误

这里有几个类似的问题,错误似乎来自尝试将零初始化数据与初始化为非零值的数据放在同一节中。在bss中初始化的标志,
-fno zero
被提到了很多。我尝试将其添加到编译器字符串和链接器字符串中,但没有帮助

在的第8页,当使用链接时间优化(LTO)时,他们提出了两种可能的解决方案。我们没有使用LTO,但我无论如何都尝试过。我尝试将内存分配从默认更改为外部RAM

这也无济于事。另一个建议是将节名添加到已经存在的分散文件中

; Just the variables declared using __attribute__((section("XRAM_DATA")))
  RW_XRAM1 0x70000000 0x00010000  {  ; External Ram
   *.o(XRAM_DATA)
  }
使用
armcc
时,变量被放置在标有“XRAM_数据”的部分的
Data
type部分,没有任何特殊的编译器选项,如
.map
文件中所示:

pNULL                                    0x70000000   Data          20  icons.o(XRAM_DATA)
icon_status_internal                     0x70000014   Data           4  icons.o(XRAM_DATA)
iconBitMapArray                          0x70000018   Data         352  icons.o(XRAM_DATA)

当使用
armclang
armcc
did一样时,如何将所有这些变量放置在外部RAM的
Data
type部分中?有没有其他的解决办法我可以试试?我是否需要在外部RAM中创建单独的
bss
数据
部分?我还可以尝试什么?

图标\u status\u internal是未初始化的变量(.bss),
pNULL
iconBitMapArray
是初始化的变量(.data)。bss数据放在刚刚清除的内存中。数据放在内存部分,通常使用copytable对其进行初始化。关于
GUI\u CONST\u存储
,可能还有另一个问题,不管它创建了什么(例如CONST?)@kesselhaus我知道这些变量通常会放在不同的类型部分。但这应该可以通过在bss中初始化的
\uuuu属性\uuuu
-fno-zero进行控制。我想主要的问题是如何将所有这些变量放在外部RAM的
数据
类型部分?据我所知,
GUI\u CONST\u存储
只是定义为
CONST
。但是,GUI\u CONST\u存储可能正是问题所在,因为这告诉嵌入式编译器不要将它们放在.bss或.data中,而是放在.text或.rodata中。
图标状态内部
是一个未初始化的变量(.bss),
pNULL
iconBitMapArray
是初始化变量(.data)。bss数据放在刚刚清除的内存中。数据放在内存部分,通常使用copytable对其进行初始化。关于
GUI\u CONST\u存储
,可能还有另一个问题,不管它创建了什么(例如CONST?)@kesselhaus我知道这些变量通常会放在不同的类型部分。但这应该可以通过在bss中初始化的
\uuuu属性\uuuu
-fno-zero进行控制。我想主要的问题是如何将所有这些变量放在外部RAM的
数据
类型部分?据我所知,
GUI\u CONST\u存储
只是定义为
CONST
。但是,GUI\u CONST\u存储可能正是问题所在,因为这告诉编译器,特别是嵌入式编译器,不要将它们放在.bss或.data中,而是放在.text或.rodata中。