在为微控制器编译C程序时,编译器放置的那些额外汇编代码是什么?

时间:2012-12-02 20:39:43

标签: c embedded arm microcontroller disassembly

我想在C中为我的Stellaris启动板编写一段代码,以便通过将库使用保持在最低限度来打开板载LED。令我惊讶的是,编译后的代码大小约为800字节。因此,为了检查编译器放入编译代码的内容,我使用了dissambler检查了汇编代码。它有很多代码,我没有编写C代码。我想知道这些代码的用途以及它是如何进入编译器设置的。我试图了解编译器的行为以及编译器正在做的幕后事务。请帮帮我。

这是我的C程序:

#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"

#define GPIOFBASE   0x40025000
#define GPIOCLK     *((volatile unsigned long *)(0x400FE000 + 0x608))
#define FDIR        *((volatile unsigned long *)(GPIOFBASE + 0x400))
#define FDEN        *((volatile unsigned long *)(GPIOFBASE + 0x51C))
#define FDATA       *((volatile unsigned long *)(GPIOFBASE + 0x3FF))

void main(void) {

    ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);

    GPIOCLK |= (1<<5);
    FDIR    |=  0xE;
    FDEN    |=  0xE;
    FDATA   |=  0xE;

while (1);

}

我使用的唯一API调用是使用Onchip ROM库设置时钟设置。请检查此pastebin上的dissambly代码:(主要:位于0x190。)

http://pastebin.com/wNNsBdtT

1 个答案:

答案 0 :(得分:7)

附加代码将是CPU初始化和C运行时初始化。此启动的源代码可能是随编译器提供的。例如,在GCC中,它通常称为crt0.s

根据您的CPU和内存,可能需要进行一些初始化以设置正确的时钟频率,内存时序等。最重要的是,C运行时需要静态数据初始化和堆栈初始化。如果支持C ++,则需要额外的代码来调用任何静态对象的构造函数。

像Stellaris这样的Cortex-M设备被设计为以最小的开销运行C代码,并且实际上可以从重置启动C代码,但是默认的启动状态通常不是您想要运行的应用程序,因为例如,这可能是以较低且不太精确的时钟频率运行的。


已添加06Dec2012

您的启动代码几乎肯定是由CMSIS提供的。 CMSIS文件夹将包含包含启动代码的CoreSupport和DeviceSupport文件夹。您可以将此代码(或其相关部分)复制到项目中,根据需要进行修改并将其链接以代替提供的代码。 CMSIS经常更新,因此无论如何都有争论。

您的构建日志和/或映射文件可用于确定链接的CMSIS组件。