2012-03-21 11 views
18

Sto lavorando con un chip ARM Cortex M3 (STM32F2) e ST fornisce una "libreria periferica standard". Ha alcuni file .c e .h utili. Ha anche i file .s.Qual è il ruolo dei file .s in un progetto C?

Qual è lo scopo di questi file .s nel contesto di un progetto C? Come posso ottenere il mio compilatore/linker /? tenerne conto?

risposta

27

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.

+0

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

+0

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

+0

@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

7

Di solito contengono codice assembly. L'assemblatore li trasforma in file oggetto che vengono successivamente collegati dal linker con le cose principali. Ma immagino che dipenda dal compilatore, dalla toolchain ecc.

1

Probabilmente hai un ambiente di sviluppo basato su Keil per il tuo kit ST. A seconda della versione del compilatore, il file di progetto dovrebbe avere sezioni diverse per C, C++ e codice assembler. Nel tuo IDE, apri il tuo progetto e cerca "Proprietà del progetto" o qualcosa del genere.

È possibile importare ed esportare simboli da e verso il codice assembler in modo che sia esso e il codice C/C++ si colleghino. Con Keil tutto si integra abbastanza bene.

La direttiva EXPORT indica all'assemblatore di rendere pubblico il simbolo specificato in modo che il codice C/C++ possa collegarsi ad esso.

La direttiva IMPORT indica all'assemblatore che il simbolo specificato è definito altrove e verrà risolto al momento del collegamento.

Problemi correlati