打印

好**

[复制链接]
5491|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
owzq|  楼主 | 2007-4-24 20:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
利用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的编辑器了,我忍!

相关帖子

沙发
wowow| | 2007-4-24 22:49 | 只看该作者

其实最好用的是SlickEdit

代码编辑功能超强,配置好了几任何C/C++编译器都可以支持。我在SlickEdit写ARM/51代码,配置好RVCT2.2/KeilC编译器,十分方便。

使用特权

评论回复
板凳
tdwmcu| | 2007-4-25 09:01 | 只看该作者

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

有没有sourceinsight比较详细的配置说明啊,我现在一直在用sourceinsight,但只是当成一个编辑器来用

使用特权

评论回复
地板
owzq|  楼主 | 2007-4-25 12:33 | 只看该作者

to:tdwmcu

sourceinsight的图片可以看到啊!
http://hiphotos.baidu.com/owzq/pic/item/8c6f9f58808ec4da9c8204c9.jpg
可以看的.

使用特权

评论回复
5
tdwmcu| | 2007-4-25 17:10 | 只看该作者

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

使用特权

评论回复
6
hiberhe| | 2007-4-25 23:30 | 只看该作者

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

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

使用特权

评论回复
7
mc9s08aw60| | 2007-4-26 10:32 | 只看该作者

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

VC编译ARM代码?
如何设置?
谢谢。
顶。

使用特权

评论回复
8
isbit| | 2007-4-26 12:09 | 只看该作者

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

  不能像uedit一样编辑wordfile???,郁闷

使用特权

评论回复
9
dontium| | 2007-4-27 18:56 | 只看该作者

好**

我怎么看不到图片,显示:“该图片来源于百度空间”的图片。

to mc9s08aw60:
用VC嵌入ARM编译,可以这样-----------------我看别人是这样做的
在tools下,选择customize...,再选tools选卡,
在“menu contents”中加入你要显示的命令,在“command”、“arguments”、“initial directory”中填入你需要的参数即可。

使用特权

评论回复
10
owzq|  楼主 | 2007-4-28 09:59 | 只看该作者

to:dontium

baidu的图片防盗链.直接输入图片地址可以看.郁闷!

你说的方法我没有试过.如果可行,我更郁闷了.呵呵

使用特权

评论回复
11
mc9s08aw60| | 2007-4-28 10:29 | 只看该作者

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

不知道哪儿设置不对。。

使用特权

评论回复
12
xiaoxiaowshi| | 2012-10-16 22:38 | 只看该作者
我擦擦,找了半天没看到收藏的按钮,真囧……

使用特权

评论回复
13
lujun1013| | 2012-10-21 16:54 | 只看该作者
看来还是有很多的人在用ADS啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝