利用ADS+VC/SourceInsight调试ARM 作者:owzq 邮箱:owzq@163.com 以前写过,当时写的匆忙,并没有写清楚.今天就把详细过程说一说,还有到目前发现的一些待解决的问题. 1.原理 在Linux中,代码编译是通过makefike文件组织的, linux中自带解释makefile文件的工具. 在window系统中,VC++也有makefile的身影, VC++自带的nmake.exe就是window 版的 解释makefile文件的工具. 所以我们可以编写自己的makefile文件,利用nmake工具,达到脱离ads1.2而进行编译连接的目的. 2. 工程目录 ADS1.2提供了armasm, armcc, armcpp, armlink, fromelf等编译器,连接器,你可以在安装目录下ADSv1_2Bin下找到. 这些是我们要用到的. 在cmd下,输入如armcc,可以看到基本的参数就说明. 安装VC++后,在安装目录Microsoft Visual StudioVC98Bin会有nmake.exe. 建立工程目录, 结构如下: ├─test │ ├─build │ │ └─test │ │ │ DOS_Project.cmd │ │ │ NMAKE.EXE │ │ │ │ │ ├─appl │ │ │ consfunc.c │ │ │ consfunc.h │ │ │ main.c │ │ │ main.h │ │ │ │ │ ├─debug │ │ ├─lib │ │ │ DIV.S │ │ │ FPU.S │ │ │ │ │ ├─principle │ │ │ debug.dat │ │ │ principle.mak │ │ │ principle.sources │ │ │ release.dat │ │ │ temp │ │ │ │ │ └─release │ │ │ └─hal └─kernel 3.makefile文件:principle.mak和principle.sources principle.mak内容如下: ############################################ #工程名称,编译器,连接器 ############################################ projectname = test #32 ARM CC = armcc #32 ARM CPP = armcpp AS = armasm link = armlink postlink = fromelf ############################################ #相对于工程所在位置,定位操作系统,硬件相关,应用相关的位置 #注意这里*incdir加上逗号 ############################################ kerneldir = ......kernelkernel haldir = ....halhal kernelincdir = ......kernelinclude,......kernelincludease,......kernelincludehal,......kernelincludekernel halincdir = ....halinclude ############################################ #注意路径 ############################################ include "Principle.sources" ############################################ #操作系统和硬件相关部分代码,不需要改动 #注意为了统一,所有扩展名全用小写 ############################################ kernelsources_asm = kernelsources_c = $(kerneldir)KERNEL.C kernelsources_cpp = halsources_asm = $(haldir)INIT.S halsources_c = $(haldir)TASKCORE.C $(haldir)CPU.C $(haldir)MEMINIT.C $(haldir)TIMER.C $(haldir)UART.C halsources_cpp = sources_asm = $(kernelsources_asm) $(halsources_asm) $(platsources_asm) sources_c = $(kernelsources_c) $(halsources_c) $(platsources_c) sources_cpp = $(kernelsources_cpp) $(halsources_cpp) $(platsources_cpp) objs_asm = $(sources_asm:.s=.o) objs_asm = $(objs_asm:.S=.o) objs_c = $(sources_c:.c=.o) objs_c = $(objs_c:.C=.o) objs_cpp = $(sources_cpp:.cpp=.o) objs_cpp = $(objs_cpp:.CPP=.o) objs = $(objs_asm) $(objs_c) $(objs_cpp) ############################################ #注意这里的逗号 ############################################ #头文件 incdir = $(kernelincdir),$(halincdir),$(platincdir) ############################################ #判断是Debug/Release #-asm -fs 得到汇编文件 ############################################ !IF "$(SCANLIB_FLAG)" == "YES" linkparam = -map -info totals !ELSE linkparam = -map -info totals -noscanlib !ENDIF !IF "$(CFG)" == "Debug" outdir = .debug linkopt = $(linkparam) -ro-base 0x00000000 -rw-base 0x00020000 -first INIT.O(Startup) AFLAGS = -keep -g -PD "_DEBUG SETA 1" CFLAGS = -ZO -asm -fs -c -O0 -D_DEBUG -g+ -I$(incdir) CPPFLAGS = -ZO -asm -fs -c -O0 -D_DEBUG -g+ -I$(incdir) !ELSE outdir = .
elease linkopt = $(linkparam) -ro-base 0x00000000 -rw-base 0x00020000 -first INIT.O(Startup) AFLAGS = -keep CFLAGS = -ZO -asm -fs -c -O2 -I$(incdir) CPPFLAGS = -ZO -asm -fs -c -O2 -I$(incdir) postlinkopt = -c -bin !ENDIF ############################################ #默认执行部分开始 #建立目录 编译 ############################################ all: $(outdir) $(outdir)$(projectname).axf ############################################ #编译 #F是修饰符,得到基名称和扩展名 ############################################ !IF "$(CPP_FLAG)" == "YES" $(outdir)$(projectname).axf:$(objs_asm) $(objs_c) $(objs_cpp) $(link) $(linkopt) $(objs_asm) $(objs_c) $(objs_cpp) -o $@ $(objs_asm): $(AS) $(AFLAGS) $*.S -o $(*).o $(objs_c): $(CC) $(CFLAGS) $*.c -o $(*).o @move /Y $*.txt $(outdir) @echo ***move asm code OK*** $(objs_cpp): $(CPP) $(CPPFLAGS) $*.cpp -o $(*).o @move /Y $*.txt $(outdir) @echo ***move asm code OK*** !ELSE $(outdir)$(projectname).axf:$(objs_asm) $(objs_c) $(link) $(linkopt) $(objs_asm) $(objs_c) -o $@ $(objs_asm): $(AS) $(AFLAGS) $*.S -o $(*).o $(objs_c): $(CC) $(CFLAGS) $*.c -o $(*).o @move /Y $*.txt $(outdir) @echo ***move asm code OK*** !ENDIF ############################################ #如果没有Debug/Release目录,立即创建 ############################################ $(outdir): if not exist $(outdir) mkdir $(outdir) ############################################ #生成二进制文件,复制到C盘 ############################################ !IF "$(CFG)" != "Debug" install: $(postlink) $(postlinkopt) $(outdir)$(projectname).axf -output $(outdir)$(projectname).bin @copy $(outdir)$(projectname).bin C:$(projectname).bin !ELSE install: @echo Debug...! No Install! !ENDIF ############################################ #清除.o文件,删除$(outdir)目录 #rmfir /S删除目录树 /Q不要求确认 ############################################ #.o结果会自动搜索目录树,删除全部指定文件 clean: if exist $(outdir) del $(outdir)*.* /S /Q del .*.axf .*.bin .*.o /S /Q del $(kerneldir)*.o $(haldir)*.o /S /Q ############################################ #信息打印 ############################################ info: @echo objs_asm[$(objs_asm)] @echo objs_c[$(objs_c)] @echo objs_cpp[$(objs_cpp)] Principle.sources内容如下: ############################################ #参考微软的中文MSDN的在线参考 nmake ,有详细的用法 #SCANLIB_FLAG = YES 表明应用ADS提供的库函数,例如数学函数 #CPP_FLAG = YES 表明编译CPP文件 ############################################ SCANLIB_FLAG = YES CPP_FLAG = NO ############################################ #platsources_asm ############################################ platsources_asm = .libDIV.S .libFPU.S ############################################ #platsources_c ############################################ platsources_c = .applconsfunc.c .applmain.c ############################################ #platsources_cpp ############################################ platsources_cpp = ############################################ #注意这里的逗号 #头文件路径 ############################################ platincdir = .appl,.lib 4.debug.dat和release.dat debug.dat和release.dat在启动AXD debugger调试时负责初始化,引导文件. (ARM7 AT91R40008) debug.dat内容如下: spp semihosting_enabled 0 let $top_of_memory 0x003F000 spp vector_catch 0x0 setmem 0xFFE00000 0x01002539 32 setmem 0xFFE00024 0x4 32 Com Remap Command setmem 0xFFE00020 0x1 32 Com Load file ld Debug est.axf 5.测试:DOS_Project.cmd DOS_Project.cmd:我用批处理实现的一个小菜单. 我上学时是从DOS学起的,好怀念啊! DOS_Project.cmd内容如下: :start cls @echo off echo **************************************************** echo *Copyright (C) Dec 26,2005 GKHY Technology Co., Ltd. echo *Project Code : DOS_Project echo *Create Date : Dec 26,2005 echo *Create By : OWZQ echo *Others : DOS工程脚本 echo **************************************************** date /T time /T echo 工程目录: chdir echo 菜单: echo * 1) all(Debug) echo * 2) all install(Release) echo * 3) clean echo * 4) AXD Debugger echo * 5) Exit echo **************************************************** echo. :choice set /p c=Make a choice: if "%C%"=="1" goto 1 if "%C%"=="2" goto 2 if "%C%"=="3" goto 3 if "%C%"=="4" goto 4 if "%C%"=="5" goto exit :1 cls echo [********************************************] echo all(Debug) echo [********************************************] nmake /a /f ".principleprinciple.mak" all CFG=Debug pause goto :start :2 cls echo [********************************************] echo all install(Release) echo [********************************************] nmake /a /f ".principleprinciple.mak" all install CFG=Release pause goto :start
:3 color 09 cls echo [********************************************] echo clean echo [********************************************] nmake /a /f ".principleprinciple.mak" clean CFG=Debug pause color 07 goto :start :4 cls axd -no** -script .principledebug.dat pause goto :start: :5 @echo off exit http://hiphotos.baidu.com/owzq/pic/item/d302d05419c9e55cd10906c9.jpg http://hiphotos.baidu.com/owzq/pic/item/d302d05419c9e55cd10906c9.jpg 你从菜单中选择1/2/3/4,就会看到哗哗的字符闪过,很酷! 6.和VC对接 另外注意Tools:Options:Directories的设置. 到此, 你可以直接F7编译了, F5调用AXD Debugger调试. http://hiphotos.baidu.com/owzq/pic/item/169e6181d78d6edcbc3e1ec9.jpg http://hiphotos.baidu.com/owzq/pic/item/169e6181d78d6edcbc3e1ec9.jpg 7.应用:SourceInsight SourceInsight是一款功能强大的编辑器. 我相信有许多人在用它. 现在我用自定义的菜单实现编译连接功能. 建立工程. 在SourceInsight的菜单<选项>下有键分配,菜单分配,自定义命令. 可以定制自己的菜单. 参数设置如下: http://hiphotos.baidu.com/owzq/pic/item/8c6f9f58808ec4da9c8204c9.jpg http://hiphotos.baidu.com/owzq/pic/item/8c6f9f58808ec4da9c8204c9.jpg 8.总结 这种方法其实就是换了一个壳,可以用VC和SourceInsight熟悉的工具. 本人最开始使用SourceInsight,一堆花花绿绿的代码,真方便呀. 对于初学者来说,独立搭建这个环境会略显麻烦一点,但是可以加深对ADS的理解. 不足的地方就是我没有做到让编译器分辨并只编译修改过的文件,因为开始的时候代码很少,唰的一下 就过去了.呵呵.我看手册上有参数选择,但是没有试验成功. 现在又开始用ADS1.2的编辑器了,我忍! |
|