c - 在编译时将多个文件中的变量收集到一个连续的内存块中

标签 c gcc linker microchip custom-sections

我想在多个 *.c 文件中定义(并初始化)一个结构的多个实例,但我希望它们在编译时聚集到一个连续的数组中。我一直在研究使用自定义部分并将该部分的开始和结束地址用作结构数组的开始和结束,但我还没有完全弄清楚细节,我宁愿不写自定义链接描述文件,如果我能摆脱它的话。这是我的第一次黑客攻击的总结,但不太奏效:

// mystruct.h:
typedef struct { int a; int b; } mystruct;

// mycode1.c:
#include "mystruct.h"
mystruct instance1 = { 1, 2 } __attribute__((section(".mysection")));

// mycode2.c:
#include "mystruct.h"
mystruct instance2 = { 3, 4 } __attribute__((section(".mysection")));

// mystruct.c:
extern char __mysection_start;
extern char __mysection_end;
void myfunc(void) {
    mystruct * p = &__mysection_start;
    for ( ; p < &__mysection_end ; p++) {
        // do stuff using p->a and p->b
    }
}

最佳答案

为了使用自定义节,您必须在自定义链接描述文件中定义其起始地址。复制设备的链接描述文件并将新部分添加到其 SECTIONS block 中:

/* in custom.gld */
mysection 0x2000 :
{
    *(mysection);
} >data

要使您的对象进入此部分,请使用部分属性:

/* mycode1.c: */
#include "mystruct.h"
mystruct __attribute__((section("mysection"))) instance1 = { 1, 2 };

/* mycode2.c: */
#include "mystruct.h"
mystruct __attribute__((section("mysection"))) instance2 = { 3, 4 };

现在,要获取自定义部分的边界,您可以使用 .startof.(section_name).sizeof.(section_name) 汇编器运算符:

#include "mystruct.h"

char *mysection_start;
char *mysection_end;
size_t mysection_size;

int main(void)
{
    asm("mov #.startof.(mysection), W12");
    asm("mov #.sizeof.(mysection), W13");
    asm("mov W12, _mysection_start");
    asm("mov W13, _mysection_size");

    mysection_end = mysection_start + mysection_size;

    mystruct *p = (mystruct *)mysection_start;
    for ( ; (char *)p < mysection_end ; p++)
    {
        // do stuff using p->a and p->b
    }
}

关于c - 在编译时将多个文件中的变量收集到一个连续的内存块中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17708212/

相关文章:

c - 在C中扩展动态内存的最佳方法

c - Segmentation fault和Struct的关系

c - 让 for 循环处理负数

C99:复数的虚部能否为负零

c++ - LLVM/Clang 是否支持弱链接的 'weak' 属性?

assembly - 错误 LNK2019 : unresolved external symbol __imp____acrt_iob_func referenced in function _printf in VS2019

c - 内循环以 j=2 开始时的时间复杂度

c++ - 为 iPhone 构建时出现 GCC 链接器错误

c - 为什么 *foo++= *++foo 可能未定义?

ffmpeg - 链接主程序时,我的共享库中未定义的 FFMPEG 引用