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