- 论坛徽章:
- 0
|
回复 6# duanjigang
我把我的代码全部去掉,只留下调试的一部分。
我把代码全部贴出来,大家看看!
首先,在进入C代码之前初始化gp和sp:
boot.S- #include "mipsdef.h"
- #define CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE 8092
- ##-----------------------------------------------------------------------------
- ## Startup code
- .text
-
- FUNC_START(_start)
- # Load Global Pointer register.
- la gp,_gp
- # load initial stack pointer
- la a0,__interrupt_stack
- move sp,a0
- #clear bss
-
- # Call c_main
- .extern c_main
- j c_main
- lui ra,0
-
- FUNC_END(_start)
- .bss
- .balign 16
- .rept CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE
- .byte 0
- .endr
- __interrupt_stack:
- .long 0,0,0,0,0,0,0,0
复制代码 接下来进入C函数main.c:- /**************************************************
- *
- * Main C entry point
- *
- **************************************************/
- #include "ag7100.h"
- extern void fa(void);
- extern void fb(void);
- extern void fc(void);
- extern void fd(void);
-
- void c_main(void)
- {
- ar7100_reg_wr(AR7100_GPIO_OE, ar7100_reg_rd(AR7100_GPIO_OE)|(1<<1)|(1<<0) );
- fa();
- }
复制代码 fa()、fb()、fc()和fd()在下一级目录test中的test.c中:- void fd(void)
- {
- ;
- }
- void fc(void)
- {
- fd();
- }
- void fb(void)
- {
- fc();
- }
- void fa(void)
- {
- ar7100_reg_wr(AR7100_GPIO_OUT, ar7100_reg_rd(AR7100_GPIO_OUT)^(1<<1));
- fb();
- }
复制代码 这里的ag7100_reg_wr()是一个宏,用于写GPIO寄存器,点亮一个led
主Makefile如下:- #####################################################
- #
- #
- # JYH added to compile main.c
- #
- #
- #####################################################
- INSTALL_DIR = /home/extend/export/atheros/build/mipsisa32-elf
- COMMAND_PREFIX = mipsisa32-elf-
- HEADER_DIR = $(shell pwd)/include
- XCC = $(INSTALL_DIR)/bin/$(COMMAND_PREFIX)gcc
- XLD = $(INSTALL_DIR)/bin/$(COMMAND_PREFIX)ld
- CFLAGS = -I$(INSTALL_DIR)/include -I$(INSTALL_DIR)/3.2.1/include -I$(HEADER_DIR)
- LDFLAGS = -L$(INSTALL_DIR)/lib -static
- OBJECTS = boot.o main.o test.o
- export XCC
- export XLD
- export CFLAGS
- export LDFLAGS
- LDFLAGS += -T $(shell pwd)/target.ld
- # RULES
- .PHONY: all clean
- all:MTest
- MTest:$(OBJECTS)
- $(XLD) -o $@ $^ $(LDFLAGS)
- boot.o: boot.S
- $(XCC) $(CFLAGS) -o $@ -c $^ $(LDFLAGS)
- main.o:main.c
- $(XCC) $(CFLAGS) -o $@ -c $^ $(LDFLAGS)
- test.o:
- $(MAKE) -C test
- clean:
- -rm -f MTest *.o
复制代码 进入test目录之后的Makefile为:- #####################################################
- #
- #
- # JYH added to compile test.c
- #
- #
- #####################################################
- LDFLAGS += -G0
- .PHONY: test.o
- test.o:test.c
- $(XCC) $(CFLAGS) -o test.o $< $(LDFLAGS)
- mv test.o ../
复制代码 现在的现象是:
1. 如果将点亮led放在fa()中,小灯可以被成功的点亮,如果将点灯放入fb()中,fb()由fa()调用,小灯不能被点亮!
2. 如果将fa()、fb()、fc()和fd()都放在main.c中,则小灯均会被点亮,函数调用正常!
我开始怀疑是我的Makefile最后的链接写得有问题,请高手指导一下!
(我编译的时候提示 warning: cannot find entry symbol _start; defaulting to 0000000080060028
) |
|