在C

时间:2016-09-30 08:19:31

标签: c linker

我目前有一个C项目,我必须将特定值(0xaa)写入特定地址(0x3fec0),我想在编程序列中编写它。我找到的解决方案如下:

我在链接器文件中写了另一节:

/* Custom flag section in linker file */
_flag_start = 0x3fec0;
.flag _flag_start :
{
    KEEP(*(.flag));
}

我将值写为静态变量:

static uint8_t flag __attribute__((section (".flag"))) __attribute__((__used__)) = 0xaa;

效果很好,我设法在正确的地址写下正确的值。然而,它也会生成一个非常重的二进制文件:因为我将此部分设置为0x3fec0,我的二进制文件将是261824字节(十进制的0x3fec0),意味着大约255KB,就好像它填充空数据直到它到达此地址。

我的问题是:如何执行相同的操作,但不会影响二进制文件的大小?

2 个答案:

答案 0 :(得分:1)

您可以尝试将其输出为另一种格式,例如Motorola s-record(srec)或intel HEX。 您用来刷新设备的程序可能支持这些格式,并跳过不同地址范围之间的无用数据,以加快传输速度。

答案 1 :(得分:0)

我发现解决方案更容易理解,实施,并且效果很好。

我只是创建了一个包含字节" 0xAA"的.bin文件。并将我的MCU专用编程器写入我的设备(如果您想了解规格,它是Atmel MCU,我使用的是atprogram程序)。我在我的MCU上用正确的偏移量(0x3fec0)写了这个二进制文件的内容,所以它会在正确的位置。