1

現在、Cortex-M0+ マイクロコントローラーである LPC810 にコードをアップロードしようとしています。私が使用しようとしている単純なプログラムがあります。これは、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)*

これで16進拡張子のバイナリファイルを生成しているので、混乱してすみません。

これを修正する方法について何か考えはありますか?助けてくれてありがとう!

4

2 に答える 2

1

linker オプションでリンクすることをお勧めします--gc-sections。これにより、未使用のライブラリがすべて削除されます。

したがって、-Wl,--gc-sectionsLDFLAGS に追加します。

ただし、コンパイラの出力は、あなたが思っているほど大きくないと確信しています。あなたのバイナリファイルにはたくさんのゼロが含まれていると思います。実際には、265 バイト未満のペイロードがあり、残りはゼロであると想定しています。これは、出力がアドレス 0 にリンクされていないためです。で ELF ファイルを確認しますarm-none-eabi -e hello.elf。(アプリケーションコードはセクションにあります.text)

これを修正するには、リンカー スクリプトがどのように機能するかを学ぶ必要があると確信しています。これについては、マニュアル「The GNU linker」を参照してください。

于 2015-05-08T14:52:35.007 に答える
0

-O3 ではなく -Os を使用してスペースのバイナリを最適化し、-s を使用してシンボルを削除し、リンクしている stdc++ ライブラリ (std=c++14) を削除します。これは C++ プログラムでさえありません!

于 2015-04-24T18:00:28.583 に答える