Sección personalizada en el archivo de configuración del enlazador siendo ignorada.
Tengo el siguiente script de enlace con regiones de memoria en mi script de enlace y la región T-mem es donde necesito mantener mi sección personalizada.
MEMORY
{
T-mem (arw!xi) : ORIGIN = 0x19500000, LENGTH = 0x4000
C-mem(arw!xi) : ORIGIN = 0x19530000, LENGTH = 0x8000
STACK(awr!xi) : ORIGIN = 0x19538000, LENGTH = 0x1000
INSTR (irx!wa) : ORIGIN = 0x8abc0000, LENGTH = 0xFF00
vector_table : ORIGIN = 0x8abcFF00, LENGTH = 0x100<br>
}
<p>SECTIONS
{
.vectors :
{
. = ALIGN(8);
KEEP(*(.vectors))
} > vector_table</p>
<pre><code>.text : {
*(.text)
} >INSTR
</code></pre>
<p>.tmem : ALIGN(8) {
PROVIDE(t<em>mem</em>load = LOADADDR (.tmem));
PROVIDE(t<em>mem</em>start = .);
<em>(.tmem .tmem.</em>)
. = ALIGN(8);
PROVIDE(t<em>mem</em>end = .);
} >tmem AT>INSTR </p>
<pre><code>.data : ALIGN(8) {
PROVIDE(c_mem_load = LOADADDR (.data));
PROVIDE(c_mem_start = .);
PROVIDE( __global_pointer$ = . + 0x800 );
*(.sdata .sdata.* .sdata2.*)
*(.data .data.*)
. = ALIGN(8);
PROVIDE(c_mem_end = .);
} >C-Mem AT> INSTR
</code></pre>
<p>}</p>
<p>```</p>
Y he creado la siguiente función para colocar en el código C.
define TMEMSECFUNC attribute((section(“.tmem”)))
void TMEMSECFUNC testcodefortmem(){
varh = varg+0x0A0A0F0F;
*(uint32t volatile *)IBASEADDR = var_h;
}
“`
Sin embargo, el compilador GCC siempre ignora el código anterior. Si uso #pragma GCC optimize (“O0”),
entonces la sección del código anterior se genera en ELF, de lo contrario, se ignora cada vez. Por favor, avíseme si hay alguna otra forma de resolver este problema.
davy.ai
Parece que el compilador GCC está optimizando la función
test_code_for_tmem()
y no la está ubicando en la sección.tmem
como se desea. Una solución posible para este problema es utilizar el atributo__attribute__((used))
además del atributo__attribute__((__section__(".tmem")))
para asegurarse de que el compilador no optimice la función. Por lo tanto, la definición actualizada de la función sería:Esto asegurará que la función
test_code_for_tmem()
se coloque en la sección.tmem
según lo deseado y no sea optimizada por el compilador.