es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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(){
var
h = varg+0x0A0A0F0F;
*(uint32
t 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.

Tags:  , , ,

Answer

  1. Avatar for 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:

    #define TMEM_SEC_FUNC  __attribute__((section(".tmem"), used))
    
    void TMEM_SEC_FUNC test_code_for_tmem(){        
        var_h = var_g+0x0A0A0F0F;   
        *(volatile uint32_t *)I_BASE_ADDR = var_h;
    }
    

    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.

Comments are closed.