如何使用gcc-arm-none-eabi工具链生成Proteus兼容的调试文件

时间:2016-02-15 08:45:17

标签: c gcc linker-scripts coff arm7

我正在使用基于ARM7TDMI的微控制器LPC2138开发一个新项目。我已经在Keil IDE中为这个微控制器开发了代码。我的目的是在Linux主机PC中使用GNU工具链来试验ARM代码开发。所以我使用的是gcc-arm-none-eabi工具链。

到目前为止,我已成功为ARM生成可执行文件(以及.hex文件)。这是我使用的makefile。

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
}

0 个答案:

没有答案