[转帖,出处无法考证]AXD插件编写上手1
“ARM 模拟器”的意义是:加速基于ARM的嵌入式软件开发。在实际做产品的过程中,软件开发是整个项目开发中占时最长的,所以可以在板子做好之前使用模拟器开发软件。当然也有ARM硬件仿真调试工具,但是它是要和实际板子一起使用的,所以只能在板子做好之后使用,价格一般是上千元,上万元的也有。而且硬件下载是比较慢的,如果程序达到几M后,下载要等待10分钟以上。
总之,软件模拟器是非常有用的,microsoft 也有wince的模拟器,不过它模拟的是wince操作系统,器件驱动开发无法进行。
AXD Debugger 是 ARM Developer Suite 里的调试仿真工具,我这里用的是V1.2版本,AXD的功能我想大家都比较了解,使用方便,功能强大。可以进行断点,单步调试,仿真运行,32位全范围地址查看,支持C/C++调试.
AXD Debugger的仿真调试使用的是ARMulate。ARMulate模拟一个ARM芯片和一些外围器件,也就是说AXD将加载进来的image放入ARMulate运行调试。
ARMulate以DLL文件形式存在,在安装目录下bin/ARMulate.dll。AXD Debugger启动后将ARMulate.dll加载进来,运行它。
ARMulate.dll再根据配置文件加载器件DLL,比如说flatmem.dll,timer.dll, Millisec.dll, WatchDog.dll, Tube.dll, Intctrl.dll等等,它们都在bin目录下。 flatmem.dll是平坦存储系统,timer.dll是定时器,Millisec.dll是时钟源,WatchDog.dll是看门狗,Tube.dll是模拟二极管,Intctrl.dll是中断控制器,arm内核在ARMulate.dll里,包含arm公司所有的内核。
这些就是ARMulate原始提供的一个arm模拟器,显然离一个实际的开发板还有十万八千里。
于是我们就想打造一个自己的板子。打造之前先要了解如何为AXD Debugger编写仿真插件。
上面介绍了一大堆DLL文件,里面的ARMulate.dll是不提供源代码的,只能在它的基础上加入我们自己的外围器件,比如前面提到的timer.dll,这样就省事多了,我们只需调用ARMulate.dll规定好的接口便可以构造一个完整的板子了。
接着来看一个我们自己生成timer.dll的例子,timer.dll是有源码文件的,可以修改成我们需要的arm芯片的timer,先看看如何生成默认的timer。
首先需要安装visual c++ 6.0, 网上d版一大堆慢慢下吧,最好打上SP6补丁,微软网站上直接下载,安装visual c++ 6.0过程中会询问你是否要加它的路径添加到系统路径,一定要添加,AXD编写插件是需要在命令行用它makefile编译生成的。
这时可能有人会嚷,是不是要写makefile,我不会啊!不需要,安装ARM Developer Suite后,它提供了标准makefile,编写自己的插件只需要微小的改动即可使用。
开始了,运行命令行,进入安装路径,我安装在D:/ARM,下面都以此为例。
进入D:/ARM/ADSv1_2/ARMulate,dir命令一下。看到没所有,可以用的东西都在这里了,就是标准外围器件的源文件,如timer.dll的源文件就是D:/ARM/ADSv1_2/ARMulate/armulext下的timer.c。进入D:/ARM/ADSv1_2/ARMulate/armulext/timer.b/intelrel 路径输入nmake。
OK, 你会在这个目录下看到timer.dll生成。把这个timer.dll拷贝到D:/ARM/ADSv1_2/Bin目录下就可以使用了,就这么简单,呵呵。
如果自己编写插件,就可以D:/ARM/ADSv1_2/ARMulate/armulext下的这些model为模板,还是以timer为例。拷贝一份timer.c在同一个目录下,改名为MyModel.c ,再复制相应的timer.b文件夹,改名为MyModel.b,进入D:/ARM/ADSv1_2/ARMulate/armulext/MyModel.b/intelrel,修改文件makefile,将相应的timer改为MyModel :
# This file was created by Megamake-3
# Copyright (C) ARM Ltd 2001. All rights reserved
SRCDIR1=../..
EXTDIR1=../../../armulif
EXTDIR2=../../../rdi
EXTDIR3=../../../clx
DERDIR=derived
ARM_RELEASE= /DARM_RELEASE="/"ADS1.2/""
SPECIFIC_RELEASE=
BUILD_INFO=/DBUILD_NUMBER=805
CFL= # local C compile flags
CDOFL=/O2 /MD /G5 /DNDEBUG # C debug and optimization flags
PRFL= # C and link profile flags
LFLAGS= # Linker flags
CINCLS=/I$(SRCDIR1) /I$(EXTDIR1) /I$(EXTDIR2) /I$(EXTDIR3) # C include flags
CCFLAGS=/D_CONSOLE /D_MBCS /DNLS /nologo /Zp4 /W3 /GX /WX -DRDI_VERSION=151 -DARM10MODEL $(DLLPIC)
CFLAGS=$(CINCLS) $(CCFLAGS) $(CDOFL) $(PRFL) $(CFL) $(ARM_RELEASE) $(SPECIFIC_RELEASE) $(BUILD_INFO) /I$(DERDIR)
CFLALL=/Za # pc special local C compile flags
CFLAGS2=$(CFLALL) $(CCFLAGS2)
CCFLAGS2=/D_CONSOLE /D_MBCS /DNLS /nologo /MD /O2 /DNDEBUG /Zp4 # C flags for helper tools
CC=cl /c
CL=cl
AR=lib
ARFLAGS=
LINK=link /INCREMENTAL:no
DLL