【发布时间】:2012-12-02 20:39:43
【问题描述】:
我想用 C 语言为我的 Stellaris 启动板编写一段代码,以通过将库的使用保持在最低限度来打开板载 LED。令我惊讶的是,编译后的代码大小约为 800 字节。因此,为了检查编译器在编译后的代码中添加了什么,我使用反序列化器检查了汇编代码。它有很多我没有编写 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 调用是使用片上 ROM 库设置时钟设置。请检查此 pastebin 中的 dissambly 代码:(主要:位于 0x190。)
【问题讨论】:
-
C 中没有
void main这样的东西。 -
如果我输入 'int main()',这会以任何方式改变此代码中的结果输出吗?
-
编译器/链接器可能会看到 main() 这个词并添加额外的东西,使用其他名称(和您自己的引导程序)来避免这个问题。 github.com/dwelch67 有许多裸机臂/拇指微控制器示例,特别是如何从重置/启动到第一个 C 函数。
-
只是为了澄清这里的术语:hosted 实现是在操作系统上运行的常见类型。像这样在“裸机”上运行的一种是独立实现。
-
你是如何测量尺寸的?这是链接器报告的代码大小,还是您只是查看输出目标文件的大小?这可能是极端的误导。
标签: c embedded arm microcontroller disassembly