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

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3116
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 24.04 LTS Noble Numbat
Sesso: Maschile
Località: Roma, Italia

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

Messaggio 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"?
Ultima modifica di DoctorStrange il giovedì 18 giugno 2026, 12:42, modificato 1 volta in totale.
Avatar utente
salerno91
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1050
Iscrizione: martedì 10 luglio 2007, 12:11

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

Messaggio 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.
Ciao :D
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3116
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 24.04 LTS Noble Numbat
Sesso: Maschile
Località: Roma, Italia

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

Messaggio 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
Avatar utente
salerno91
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1050
Iscrizione: martedì 10 luglio 2007, 12:11

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

Messaggio da salerno91 »

Figurati! ARM è sempre un casino :D
Ciao :D
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: Bing [Bot] e 2 ospiti