好**

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

其实最好用的是SlickEdit

代码编辑功能超强,配置好了几任何C/C++编译器都可以支持。我在SlickEdit写ARM/51代码,配置好RVCT2.2/KeilC编译器,十分方便。<br />
tdwmcu 发表于 2007-4-25 09:01 | 显示全部楼层

楼主,看不到你关于sourceinsight的图片啊

有没有sourceinsight比较详细的配置说明啊,我现在一直在用sourceinsight,但只是当成一个编辑器来用
 楼主| owzq 发表于 2007-4-25 12:33 | 显示全部楼层

to:tdwmcu

sourceinsight的图片可以看到啊!<br />http://hiphotos.baidu.com/owzq/pic/item/8c6f9f58808ec4da9c8204c9.jpg<br />可以看的.
tdwmcu 发表于 2007-4-25 17:10 | 显示全部楼层

恩,看到了,那儿有sourceinsight的汉化啊

  
hiberhe 发表于 2007-4-25 23:30 | 显示全部楼层

呵呵,干嘛要折腾着去写makefile?

我历来是在VS中写代码,在原配中编译
mc9s08aw60 发表于 2007-4-26 10:32 | 显示全部楼层

我历来是在VS中写代码,在原配中编译???

VC编译ARM代码?<br />如何设置?<br />谢谢。<br />顶。
isbit 发表于 2007-4-26 12:09 | 显示全部楼层

我用的语言,source insight不支持如何配置clf文件?

&nbsp;&nbsp;不能像uedit一样编辑wordfile???,郁闷
dontium 发表于 2007-4-27 18:56 | 显示全部楼层

好**

我怎么看不到图片,显示:“该图片来源于百度空间”的图片。<br /><br />to&nbsp;mc9s08aw60:<br />用VC嵌入ARM编译,可以这样-----------------我看别人是这样做的<br />在tools下,选择customize...,再选tools选卡,<br />在“menu&nbsp;contents”中加入你要显示的命令,在“command”、“arguments”、“initial&nbsp;directory”中填入你需要的参数即可。
 楼主| owzq 发表于 2007-4-28 09:59 | 显示全部楼层

to:dontium

baidu的图片防盗链.直接输入图片地址可以看.郁闷!<br /><br />你说的方法我没有试过.如果可行,我更郁闷了.呵呵
mc9s08aw60 发表于 2007-4-28 10:29 | 显示全部楼层

TO :DONTIUM,谢谢。我那样试过一次,不能编译报错。

不知道哪儿设置不对。。<br />
xiaoxiaowshi 发表于 2012-10-16 22:38 | 显示全部楼层
我擦擦,找了半天没看到收藏的按钮,真囧……
lujun1013 发表于 2012-10-21 16:54 | 显示全部楼层
看来还是有很多的人在用ADS啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

2

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部