我正在使用gcc为ARM Cortex-M4F微 Controller 编译一些代码。我的应用程序使用了我已方便地写入C文件的大量数据:大型的int和float数组,指向这些各种数组,各种结构的圆形链接列表等。

当我对此进行编译时,它总共增加了大约500K的数据,再加上实际应用的数百K。 gcc将所有这些数据方便地放入.data节中;然后,ld尝试构建将.data节放入RAM并将.text(代码)节放入FLASH的小精灵。我使用的MCU没有500K RAM,因此无法构建ELF,但确实具有1M FLASH。我尝试更改链接程序脚本,以便将.data和.text都放入“工作”的FLASH中,但是还有其他一些代码期望它的数据进入RAM,因此最终执行失败;我无法彻底改变。

我需要告诉gcc将C文件中的每个单个对象放入.text部分,以便它可以与其余的非可变内容一起进入FLASH,或者至少可以指示我的链接器其他一些部分编写脚本处理方法,以免干扰内存中没有问题的现有Blob。我不知道该怎么做。这是我所拥有的非常精简的例子

/* data.c */
static char* option_array_0_0[] =
{
    "O=0.40",
    "K=FOO",
    "JAR=JAR",
};

static int width_array_0_0[] =
{
    0,
    1,
    1,
};

Window window_array_0[] =
{
    {
        option_array,
        width_array,
    },
};

/* main.c */
extern Window window_array_0[];
int main()
{
    /* Do stuff */
}

data.c,window_array_0中的内容以及与其链接的所有内容(或大多数其他内容,可能是字符串数组将进入.text?)都放在了.data中,我的链接描述文件放入了RAM中。我希望将其全部放在不同的部分,然后将其放入闪存中。那里有成千上万种此类数组,外加数百种结构和数十种其他信息。这可能改变吗?作为测试,我用char [500000]随机数据替换了我的“window_array_0”,并且在编译过程中没有抱怨,所以我假设将其全部放入.text中(正如所期望的那样),我只是不知道如何制作对任意对象执行此操作。
谢谢你的帮助。

最佳答案

大多数编译器/链接器,如果您将变量声明为static const,它将把它放置在文本部分而不是数据中。显然,这些必须预先初始化并且不能在运行时进行修改,但这是进入Flash的唯一方法。

10-04 21:57
查看更多