ARM7TDMI ベースのマイクロコントローラである LPC2138 を使用して、新しいプロジェクトを開発しています。Keil IDE でこのマイクロコントローラのコードを開発済みです。ここでの私の意図は、Linux ホスト PC で GNU ツールチェーンを使用して ARM コード開発を試すことです。そのため、gcc-arm-none-eabi ツール チェーンを使用しています。
これまでのところ、ARM 用の実行可能ファイル (および .hex ファイル) の生成に成功しています。これは私が使用したメイクファイルです。
CC := arm-none-eabi-gcc
LD := arm-none-eabi-ld
AS := arm-none-eabi-as
AR := arm-none-eabi-ar -cr
OBJCOPY := arm-none-eabi-objcopy
TARGET := image.hex
OBJS := startup.o $(patsubst %.c,%.o,$(wildcard *.c))
CFLAGS := -mcpu=arm7tdmi-s -g3 -Wall -I.
AS_FLAGS := -mcpu=arm7tdmi-s -g3
LD_FLAGS := -Wl,-Map,$(TARGET:%.hex=%).map -nostartfiles
LD_SCRIPT := lpc2138.ld
$(TARGET) : $(TARGET:%.hex=%)
$(OBJCOPY) -O ihex $< $@
$(TARGET:%.hex=%) : $(OBJS)
$(CC) -o $@ -T $(LD_SCRIPT) $(OBJS) $(LD_FLAGS)
startup.o : startup.s
$(AS) $(AS_FLAGS) -o $@ $<
%.o : %.c
$(CC) -c $(CFLAGS) -o $@ $<
clean :
rm -rf $(TARGET) $(TARGET:%.hex=%) $(TARGET:%.hex=%).map *.o
私の問題は、Proteus(ISIS)で実行可能ファイルをデバッグ(段階的に実行)する必要があることです。ただし、Proteus は .coff および .elf 形式の実行可能ファイルのみをサポートします。
gcc はデフォルトで elf 形式の実行可能ファイルを生成することを知っています。実行可能イメージの名前を .elf 拡張子に変更して、Proteus にロードしようとしました。しかし、Proteus のシミュレーションは中止され、elf ファイルにエラーが表示されました。
.hex ファイルを正常にロードして、シミュレーションを実行できます。また、他のツールチェーンによって生成された実行可能ファイルを使用してデバッグを行いました。しかし、GNU ツール チェーンを使用したデバッグは、私の前にハードルとして立っています。
以下に示すように、リンカースクリプトを自分で作成しました。その中で私が見逃しているものはありますか?
/* Stack and heap are equal in size by default.
*
* A positive value for STACK_HEAP_BOUNDARY_OFFSET increase the size
* of the stack(Decrease size of heap).
*
* A negetive value for STACK_HEAP_BOUNDARY_OFFSET decrease the size
* of the stack(increase size of heap).
*/
STACK_HEAP_BOUNDARY_OFFSET = 0;
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 512K
SRAM (rw) : ORIGIN = 0x40000000, LENGTH = 32K
}
SECTIONS
{
.text :
{
startup.o (.text)
*(.text)
. = ALIGN(4);
} > FLASH
.rodata :
{
*(.rodata)
. = ALIGN(4);
} > FLASH
.data :
{
__data_load__ = LOADADDR (.data);
__data_start__ = .;
*(.data)
. = ALIGN(4);
__data_end__ = .;
} > SRAM AT > FLASH
.bss :
{
__bss_start__ = .;
*(.bss)
*(COMMON)
. = ALIGN(4);
__bss_end__ = .;
} > SRAM
.heap :
{
__heap_start__ = .;
. = . + ((LENGTH(SRAM) - (. - (ORIGIN(SRAM)))) / 2);
. += STACK_HEAP_BOUNDARY_OFFSET;
. = ALIGN(4);
__heap_end__ = .;
} > SRAM
.stack :
{
__stack_start__ = .;
. = . + (LENGTH(SRAM) - (. - (ORIGIN(SRAM))));
. = ALIGN(4);
__stack_end__ = .;
} > SRAM
}