使用链接器命令在C中分配一个特定位置的数组

问题描述:

我是一名初学者......我想写入我的嵌入式闪存中的特定内存位置......我如何在我的C头文件中提到它?然后使用链接器脚本将其链接到特定的内存位置。现在我已经将该数组声明为extern,并且编译正确。虽然喜欢,我需要告诉链接器,我需要在这个特定的位置。它应该在.ld文件中给出?什么是.dld文件?对于diab编译器,这不适用于GCC。我已经看到了一个用于冒泡排序的示例代码bubble.dld。但是在一些项目中.dld文件是在制作项目时创建的。它在哪一步创建?使用链接器命令在C中分配一个特定位置的数组

+1

元素是什么?你有一个内存映射闪存驱动器?这听起来很不寻常......这是什么硬件平台? – unwind

+0

是的,我有一个内存映射闪存..它的ST微控制器... –

+0

@unwind或帮助我如何将它写入正常的RAM位置... –

首先解决

在” .c “的:

// Talk to linker to place this in ".mysection" 
__attribute__((section(".mysection"))) char MyArrray[52]; 

在” .LD “:

MEMORY { 
    m_interrupts (RX) : ORIGIN = 0x00040000, LENGTH = 0x000001E8 
    m_text  (RX)  : ORIGIN = 0x00050000, LENGTH = 0x000BFE18 
    /* memory which will contain secion ".mysection" */ 
    m_my_memory (RX)  : ORIGIN = 0x00045000, LENGTH = 0x00000100 
} 

SECTIONS 
{ 
    /***** Other sections *****/ 

    /* place "mysection" inside "m_my_memory" */ 
    .mysection : 
    { 
    . = ALIGN(4); 
    KEEP(*(.mysection)); 
    . = ALIGN(4); 
    } > m_my_memory 

    /***** Other sections *****/ 
} 

解决方法二

在” .C “

extern char myArray[52]; 

在 “.LD”

MEMORY { 
    m_interrupts (RX) : ORIGIN = 0x00040000, LENGTH = 0x000001E8 
    m_text  (RX)  : ORIGIN = 0x00050000, LENGTH = 0x000BFE18 
    /* memory which will contain secion "myArray" */ 
    m_my_memory (RX)  : ORIGIN = 0x00045000, LENGTH = 0x00000100 
} 

SECTIONS 
{ 
    /***** Other sections *****/ 

    /* place "myArray" inside "m_my_memory" */ 
    .mysection : 
    { 
    . = ALIGN(4); 
    myArray = .; /* Place myArray at current address, ie first address of m_my_memory */ 
    . = ALIGN(4); 
    } > m_my_memory 

    /***** Other sections *****/ 
} 

this good manual了解更多如何放置在要

+0

非常感谢:)。我有一个exe文件为我的链接器..即,我在Windows环境中构建它。我应该用我的新的ld文件引用重建exe文件吗? –

+0

你不必重建你的链接器,只有你的最终应用 – Garf365

+0

:)它工作@ Garf365 ...非常感谢你 –