L'estensione .s è la convenzione utilizzata da GNU e molte altre catene di strumenti per i file assembler.
L'ultima volta che ho cercato la STM32 Standard Peripheral Library non contiene file assembler, tuttavia la libreria CMSIS contiene codice di avvio per varie parti STM32, ad esempio startup_stm32f2xx.s è il codice di avvio per tutti i dispositivi della serie STM32F2xx. Esistono diverse implementazioni per diverse catene di strumenti; è necessario creare e collegare il file associato alla parte specifica e alla catena di strumenti. Se stai usando un progetto di esempio che costruisce ed esegue o un IDE che crea progetti specifici per te, probabilmente questo sarà già stato fatto - se hai il codice che lo esegue certamente.
Il modo in cui si crea e si collega il codice dipenderà dalla catena di strumenti che si sta utilizzando. La maggior parte degli strumenti basati su IDE riconoscono automaticamente l'estensione e invocano l'assemblatore per generare un file oggetto che sarà collegato come qualsiasi altro. Il contenuto esatto differisce leggermente tra le versioni della catena di strumenti, ma principalmente crea l'ambiente di runtime C (stack e heap), inizializza il processore, definisce una tabella iniziale di interrupt/eccezione, inizializza i dati statici e salta a main().
Il nucleo del file per la versione RealView Keil/ARM per esempio si presenta così:
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
Reset_Handler
è l'indirizzo Program Counter (PC) il registro sarà impostato dopo un reset del processore.
SystemInit
è una funzione di codice C esterna che esegue la maggior parte dell'inizializzazione, potrebbe richiedere la personalizzazione dell'hardware. Cortex-M è insolito in quanto può avviare l'esecuzione del codice C immediatamente dopo il reset perché la tabella vettoriale include sia l'indirizzo di reset che l'indirizzo del puntatore dello stack iniziale, che viene automaticamente caricato nel registro SP al reset. Di conseguenza non hai bisogno di molte informazioni sull'assembler per averne una in esecuzione.
__main()
è il punto di ingresso fornito dal compilatore per il codice C.Non è la funzione main() che scrivi, ma esegue l'inizializzazione per la libreria standard, i dati statici, l'heap prima di chiamare la funzione `main() '.
La versione GCC è in qualche modo più coinvolta poiché svolge gran parte del lavoro svolto da __main()
nella versione RealView di Keil/ARM, ma essenzialmente svolge la stessa funzione.
Si noti che nel CMSIS SystemInit()
è definito in system_stm32f2xx.c e potrebbe essere necessario personalizzare la scheda (frequenza cristallina corretta, configurazione PLL, configurazione SRAM esterna ecc.). Dato che questo è il codice C, e ben commentato, probabilmente vi sentirete più a vostro agio.
Tranne che ho appena notato che hai specificato STM32F2xx. La risposta si applica ancora, tranne i nomi dei file rispettivi sono startup_stm32f2xx.s e system_stm32f2xx.c nel tuo caso. Ho modificato la risposta per renderla più specifica per STM32F2. – Clifford
Clifford - nella documentazione sul sito web di ARM menziona che l'altra routine in startup_xxx.s, __user_initial_stack_heap, non dovrebbe usare più di 88 byte di stack. Sai da dove viene questa limitazione? Vedi http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0099a/armlib_cihhdahf.htm – NickHalden
@NickHalden: Pensi forse che meriti di essere pubblicato come una domanda a parte? Questa domanda ha più di due anni e nemmeno la tua domanda. Questa non è la sezione per cui commenta: SO non è un forum di discussione. Inoltre; avrai un pubblico più grande in questo modo. – Clifford