.s文件在C项目中的作用是什么?

Ran*_*lue 22 c embedded stm32

我正在使用ARM Cortex M3芯片(STM32F2),ST提供"标准外设库".它有一些有用的.c和.h文件.它还有.s文件.

在C项目的上下文中这些.s文件的目的是什么?如何获取编译器/链接器/?把它们考虑进去?

Cli*_*ord 34

.s扩展名是GNU和汇编程序文件的许多其他工具链使用的约定.

最后我看了STM32标准外设库本身不包含汇编文件,但CMSIS库包含各种STM32部件的启动代码,例如startup_stm32f2xx.s是所有STM32F2xx系列器件的启动代码.不同的工具链有不同的实现方式; 您需要构建和链接与您的特定部分和工具链相关联的文件.如果您正在使用构建和运行的示例项目或者为您创建特定于部件的项目的IDE,那么这可能已经完成 - 如果您有运行它的代码肯定有.

如何构建和链接代码将取决于您使用的工具链.大多数基于IDE的工具将自动识别扩展并调用汇编程序以生成将像任何其他链接一样链接的目标文件.工具链版本之间的确切内容略有不同,但主要创建C运行时环境(堆栈和堆),初始化处理器,定义初始中断/异常向量表,初始化静态数据并跳转到main().

例如,Keil/ARM RealView版本文件的核心如下所示:

; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
        IMPORT  __main
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP
Run Code Online (Sandbox Code Playgroud)

Reset_Handler 地址程序计数器(PC)寄存器将在处理器复位后设置为.

SystemInit是一个外部C代码函数,它执行大部分初始化 - 这可能需要为您的硬件定制.Cortex-M的不寻常之处在于它可以在复位后立即开始运行C代码,因为向量表包含复位地址和初始堆栈指针地址,它在复位时自动加载到SP寄存器.因此,您不需要太多汇编程序知识即可运行.

__main()是编译器为C代码提供的入口点.它不是你编写的main()函数,而是在调用你的`main()'函数之前对标准库,静态数据,堆进行初始化.

GCC版本涉及更多,因为它完成__main()了Keil/ARM RealView版本中的大部分工作,但基本上它执行相同的功能.

请注意,CMSIS SystemInit()在system_stm32f2xx.c中定义,可能需要为您的电路板定制(正确的晶振频率,PLL设置,外部SRAM配置等).因为这是C代码,并且评论很好,你可能会更熟悉它.


cni*_*tar 8

它们通常包含汇编代码.汇编程序将它们转换为目标文件,这些文件稍后由链接器与主要内容链接.但我想它确实取决于编译器,工具链等.