我目前正在尝试将一些代码上传到LPC810,这是一个Cortex-M0 +微控制器。我有一个简单的程序,我正在尝试使用它,它只是打开和关闭LED闪烁。
typedef unsigned int volatile * vp;
int main()
{
*(vp) 0x4000C1C0 = 0xFFFFFFBFUL;
*(vp) 0xA0002000 |= 1 << 2;
for(;;) {
*(vp) 0xA0002300 |= 1 << 2;
volatile long wait = 240000;
while (wait > 0) --wait;
}
return 0;
}
编辑:此文件名为main.c
。
我没有写这段代码,但我知道它有效。问题是,当我将其编译成二进制文件进行上传时,结果是大约75 kiB!这对我的微控制器来说太大了。
在elf文件上运行size
之后,似乎有很多额外的函数和数据被链接在内。我正在使用newlib。
下面是我的Makefile。我确定它可能与我的编译/链接标志有关,但我一直无法弄明白。
PROGRAM=hello
ARCH=arm-none-eabi
CC=$(ARCH)-gcc
CXX=$(ARCH)-g++
OBJCOPY=$(ARCH)-objcopy
OBJDUMP=$(ARCH)-objdump
NM=$(ARCH)-nm
SIZE=$(ARCH)-size
FLAGS=-pedantic-errors -Wall -Wextra -Werror -Wfatal-errors -O3 \
-fdiagnostics-color -mcpu=cortex-m0plus -mthumb
CFLAGS=-std=c11 $(FLAGS)
CXXFLAGS=-std=c++14 $(FLAGS)
LDFLAGS=
OBJECTS=./obj/main.o
all: ./$(PROGRAM).hex
run: ./$(PROGRAM).hex
sudo lpc21isp -wipe -verify -bin ./$(PROGRAM).hex /dev/ttyUSB0 115200 12000
make clean
./$(PROGRAM).hex: ./$(PROGRAM).elf
$(OBJCOPY) ./$(PROGRAM).elf -O binary ./$(PROGRAM).hex
$(OBJDUMP) -D $< > $(PROGRAM).disasm
$(NM) -n $(PROGRAM).elf > $(PROGRAM).sym
$(SIZE) $(PROGRAM).elf
./$(PROGRAM).elf: $(OBJECTS)
$(CC) $(FLAGS) $(LDFLAGS) $^ -o $@
./obj/%.o: ./src/%.s
$(CC) $(FLAGS) -c $^ -o $@
./obj/%.o: ./src/%.c
$(CC) $(CFLAGS) -c $^ -o $@
./obj/%.o: ./src/%.cpp
$(CXX) $(CXXFLAGS) -c $^ -o $@
clean:
rm $(OBJECTS) ./$(PROGRAM)*
我正在生成一个带有十六进制扩展名的二进制文件,所以很抱歉有任何混淆。
有关如何解决此问题的任何想法?谢谢你的帮助!
答案 0 :(得分:0)
使用-Os优化空间的二进制文件,而不是-O3,使用-s剥离符号,并删除要链接的stdc ++库(std = c ++ 14),这甚至不是C ++程序!
答案 1 :(得分:0)
我建议与链接器选项--gc-sections
建立链接。这应该删除所有未使用的库。
因此,将-Wl,--gc-sections
添加到您的LDFLAGS。
但是我很确定你的编译器的输出并不像你想象的那么大。我假设你的二进制文件包含很多零。实际上我假设你有少于265字节的有效载荷,其余为零。
这是因为您的输出链接不是地址零。使用arm-none-eabi -e hello.elf
检查您的ELF文件。 (您的应用程序代码位于.text
)
要解决此问题,我非常确定您必须了解链接描述文件的工作原理。请查看手册“GNU链接器”。