初级会员
- 积分
- 60
- 金钱
- 60
- 注册时间
- 2021-10-1
- 在线时间
- 16 小时
|
1金钱
本帖最后由 愈之 于 2024-2-10 17:13 编辑
刚学到裸机bsp那一节,编译下载点灯都没有问题,LED闪烁没有问题。但是点开.dis文件发现0x87800000地址中并不是_start入口函数而是87800000 <_start-0x8>:
87800000: 8780025c ; <UNDEFINED> instruction: 0x8780025c
87800004: 8780025c ; <UNDEFINED> instruction: 0x8780025c
87800008 <_start>:
如果我用arm-none-eabi编译器的话,则是
87800000 <_start-0x8>:
87800000: 87800320 strhi r0, [r0, r0, lsr #6]
87800004: 87800320 strhi r0, [r0, r0, lsr #6]
87800008 <_start>:
为什么0x87800000不是start函数?我参考stm32上电流程,觉得应该放sp的初始化值。但是应该只要4个字节就可以了,为什么有8个字节?
还有.ld文件中的ENTRY是指明入口函数,那他的作用究竟体现在哪里?
关键代码如下
startup_imx6ull.S
.word _sbss
.word _ebss
.global _start
_start:
MRS R0, CPSR
BIC R0, #0x1F
ORR R0, #0x13
MSR CPSR, R0
LDR R2, =_sbss
B LoopFillZerobss
FillZerobss:
MOVS R3, #0
STR R3, [R2], #4
LoopFillZerobss:
LDR R3, = _ebss
CMP R2, R3
BCC FillZerobss
LDR SP, =0x80200000
BL SystemInit
BL main
IMX6ULL_MCIMX6Y2_DDR3.ld
ENTRY(_start)
SECTIONS
{
. = 0x87800000;
.text :
{
. = ALIGN(4);
obj/startup_imx6ull.o;
*(.text)
*(.text*)
. = ALIGN(4);
}
.rodata :
{
. = ALIGN(4);
*(.rodata)
*(.rodata*)
. = ALIGN(4);
}
.data :
{
. = ALIGN(4);
*(.data)
*(.data*)
. = ALIGN(4);
}
.bss :
{
. = ALIGN(4);
_sbss = .;
__bss_start = _sbss;
*(.bss)
*(.bss*)
*(COMMON)
. = ALIGN(4);
_ebss = .;
__bss_end = _ebss;
}
}
Makefile
COMPILER ?= arm-none-eabi-
TARGET ?= led
GCC := $(COMPILER)gcc
LD := $(COMPILER)ld
OBJCOPY := $(COMPILER)objcopy
OBJDUMP := $(COMPILER)objdump
INCDIRS := imx6ull\
project\
bsp/clk\
bsp/delay\
bsp/led
SRCDIRS := project\
imx6ull\
bsp/clk\
bsp/delay\
bsp/led
INCLUDE := $(patsubst %, -I %, $(INCDIRS))
SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
SFILENDIR := $(notdir $(SFILES))
CFILENDIR := $(notdir $(CFILES))
SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
OBJS := $(SOBJS) $(COBJS)
VPATH := $(SRCDIRS)
$(TARGET).bin : $(OBJS)
$(LD) -TIMX6ULL_MCIMX6Y2_DDR3.ld -o $(TARGET).elf $^
$(OBJCOPY) -O binary -S $(TARGET).elf $@
$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis
$(SOBJS) : obj/%.o : %.S
$(GCC) -Wall -nostdlib -O0 $(INCLUDE) -c -o $@ $<
$(COBJS) : obj/%.o : %.c
$(GCC) -Wall -nostdlib -O0 $(INCLUDE) -c -o $@ $<
clean :
rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)
.PHONY : clean
|
|