Pagina 1 di 1

[Risolto][ARM assembly per STM32] Chiamata a procedura annidata, fallita

Inviato: mercoledì 10 giugno 2026, 15:18
da DoctorStrange
Buonasera a tutti,

Sviluppo un firmware per un microcontrollore di tipo STM32C031, in linguaggio ARM assembly con instruction set thumb-2.
Sembra che io abbia qualche problema nel chiamare routine annidate.

Questa la procedura che eseguo. All'interno di una procedura, chiamo la routine primaria di un modulo timer esterno, tramite un semplice

Codice: Seleziona tutto

bl Timer11Setup
.

Nella routine esterna Timer1Setup, ho questo:

Codice: Seleziona tutto

Timer1Setup:    ldr     r0,=sram_base_address                                   
                ldr     r1,=Timer1SRAMOffset2                                   
                add     r0,r0,r1                                                
                mov     r1,lr                                                   
                str     r1,[r0]                                                 
                                                                                
                ldr     r0,=rcc_base_address                                    
                ldr     r1,=rcc_ioprstr_offset                                  
                add     r0,r0,r1                                                
                ldr     r1,[r0]                                                 
                ldr     r2,=0x01                                                
                mvns    r2,r2                                                   
                ands    r1,r1,r2                                                
                str     r1,[r0]         
                
              @ULTERIORI IMPOSTAZIONI
              
              bl	SetCCMR
                                                      
                                                                                 
                ldr     r0,=sram_base_address                                   
                ldr     r1,=Timer1SRAMOffset2                                   
                add     r0,r0,r1                                                
                ldr     r1,[r0]                                                 
                mov     lr,r1                                                   
                                                                                
                bx      lr                                                      
                                                                                
                .align  0x02                                                    
                .ltorg                                                          
                .end    Timer1Setup                                                                                                                            

Poco sotto, all'interno del medesimo file, dichiaro l'intera procedra "SetCCMR". La chiamata a questa seconda procedura mi genera errore.

Logicamente, ho dicharato globali tutte le funzioni:

Codice: Seleziona tutto

                .file           "Timer1"

                .thumb

                .syntax         unified
                .cpu            cortex-m0plus

                .global         Timer1Setup, SetCCMR, SetCCR

                .type           Timer1Setup, %function
               .type   SetCCMR, %function
               .type   SetCCR, %function

                .text
                
Questo l'errore:

/path/bin/arm-none-eabi-ld: /path/Timer1.o: in function `Timer1Setup':
/path/Timer1.s:374: undefined reference to `SetCCMR'


Questo il modo in cui compilo:

Codice: Seleziona tutto

$PercorsoAssembler/arm-none-eabi-as -mcpu=cortex-m0plus -g3 -mthumb -o $SorgenteAsm/Timer1.o $SorgenteAsm/Timer1.s;

$PercorsoAssembler/arm-none-eabi-ld -T $SorgenteAsm/LinkerScript.ld --gc-sections -relax --entry="vectors" $SorgenteAsm7Timer1.o  $SorgenteAsm/debugger.elf; 
Per caso qualcuno di voi ha idea di come risolvere questo errore di "ndefined reference"?

Re: [ARM assembly per STM32] Chiamata a procedura annidata, fallita

Inviato: giovedì 18 giugno 2026, 0:21
da salerno91
Ciao dove compili c'è un 7 al posto dello slash ($SorgenteAsm7Timer1.o), in più non so se siano in un altro file, ma comunque non stai linkando tutte le global quando compili.

Re: [ARM assembly per STM32] Chiamata a procedura annidata, fallita

Inviato: giovedì 18 giugno 2026, 12:41
da DoctorStrange
Ti ringrazio per l'interesse ma il carattere "7" è solo un refuso. Alla fine ho scoperto che il problema era dovuto al mio abuso della direttiva ".end". Vedi la routine dove, alla fine, ho messo

Codice: Seleziona tutto

.end Timer1Setup
?
Ecco il problema è qui. E' venuto fuori, che all'interno di un "file" deve esistere un'unica direttiva ".end", che viene vista come la dichiarazione di fine del file io, invece, ad ogni subroutine inserivo il ".end" convinto (erroneamente) che ogni subroutine andasse dichiarata con il .end al fine di specificare nel file "elf" risultato del linking finale dove iniziasse e finisse ogni routine.

Comunque grazie

Re: [Risolto][ARM assembly per STM32] Chiamata a procedura annidata, fallita

Inviato: sabato 20 giugno 2026, 13:31
da salerno91
Figurati! ARM è sempre un casino :D