[Risolto][ARM assembly per STM32] Chiamata a procedura annidata, fallita
Inviato: mercoledì 10 giugno 2026, 15:18
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.
Nella routine esterna Timer1Setup, ho questo:
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:
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:
Per caso qualcuno di voi ha idea di come risolvere questo errore di "ndefined reference"?
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 Timer11SetupNella 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
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
/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;