Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the role of .s files in a C project?

Tags:

I am working with an ARM Cortex M3 chip (STM32F2) and ST provides a "standard peripheral library". It has some useful .c and .h files. It also has .s files.

What is the purpose of these .s files in the context of a C project? How do I get my compiler/linker/? to take them into account?

like image 322
Randomblue Avatar asked Mar 21 '12 09:03

Randomblue


People also ask

What does a .S file do?

An S file is a generic source code file that contains the source for a computer program. It may be written in a number of different programming languages, but is commonly used for storing Assembly code.

What is a .S file in C?

. S files are assembly language files. They are a form of machine code. It is at a low level of programming.

What is a .S file gcc?

Files with names ending in . s are not preprocessed first; they are just translated by the assembler into object code. You can include one or more source files in a single gcc command, and you are free to mix C and assembly-language source files.

What are .D files?

The D file extension is used for files that store code written in a special programming language called D. D is similar to the languages C++ and C#, Java and Eiffel. The file itself can be opened by any text editing program since the source code is saved in a plain text format.


2 Answers

The .s extension is the convention used by GNU and many other tool-chains for assembler files.

Last I looked the STM32 Standard Peripheral Library itself contains no assembler files, however the CMSIS library contains start-up code for various STM32 parts, for example startup_stm32f2xx.s is start-up code for all STM32F2xx series devices. There are different implementations for different tool-chains; you need to build and link the file associated with your specific part and tool-chain. If you are using an example project that builds and runs or an IDE that creates part-specific projects for you, this will probably already have been done - if you have code that runs it certainly has.

How you build and link the code will depend on what tool-chain you are using. Most IDE based tools will automatically recognise the extension and invoke the assembler to generate an object file that will be linked like any other. The exact content differs slightly between tool-chain versions, but primarily creates the C runtime environment (stack and heap), initialises the processor, defines an initial interrupt/exception vector table, initialises static data and jumps to main().

The core of the file for the Keil/ARM RealView version for example looks like this:

; 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 is the address Program Counter (PC) register will be set to after a processor reset.

SystemInit is an external C code function that does the bulk of the initialisation - this may need customisation for your hardware. Cortex-M is unusual in that it can start running C code immediately after reset because the vector table includes both the reset address and the initial stack pointer address, which is automatically loaded to the SP register on reset. As a result you do not need much assembler knowledge to get one running.

__main() is the compiler supplied entry point for your C code. It is not the main() function you write, but performs initialisation for the standard library, static data, the heap before calling your `main()' function.

The GCC version is somewhat more involved since it does much of the work done by __main() in the Keil/ARM RealView version, but essentially it performs the same function.

Note that in the CMSIS SystemInit() is defined in system_stm32f2xx.c, and may need customisation for your board (correct crystal frequency, PLL setup, external SRAM configuration etc.). Because this is C code, and well commented, you will probably be more comfortable with it.

like image 112
Clifford Avatar answered Jan 16 '23 19:01

Clifford


They usually contain assembly code. The assembler turns them into object files which are later linked by the linker with the main stuff. But I imagine it does depend on the compiler, toolchain etc.

like image 31
cnicutar Avatar answered Jan 16 '23 18:01

cnicutar