RealView™ ARMulator® ISS
ۈ
1.3
ઓᒎฉ
Copyright © 2002, 2003 ARM Limited
ARM DUI 0207ASC-00
版权所有
RealView ARMulator ISS
ઓᒎฉ
Copyright © 2002, 2003 ARM Limited
版权所有
ۈ۾ቧᇦ
本书进行了以下更改
ৎখഺ
྇໐ ቲ ৎখ
2002 年 8
月
A
1.3
版
Ⴥᎌཚᄰস
®或 ™
标有
的词语和徽标是 ARM Limited 拥有的注册商标或商标 此处提及的其它品牌和名称可能
是其相关所有者的商标
除非事先得到版权所有人的书面许可 否则不得以任何形式改编或复制本文档包含或产品描述的全
部或部分信息
本文档描述的产品将进行持续的开发和改进 ARM 将如实提供所有产品特性以及本文档包含的使
用方法
但是 所有暗示或明示的担保 包括但不限于对特定用途适销性或适用性的暗示担保 均
不包括在内
本文档的目的仅在于帮助读者使用产品 对由于使用本文档中的任何信息 这些信息中的任何错误
或遗漏或任何不正确的使用产品而导致的任何损失或损害
ARM Limited 概不负责
ii Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
目录
RealView ARMulator ISS
༄ዔ
关于本书 ......................................................................................................... vi
反馈 ................................................................................................................ ix
ᐺ଼
1
1.1 RealView ARMulator ISS 概述 .................................................................... 1-2
2
ᐺ
ARMulator
2.1 关于 ARMulator ........................................................................................... 2-2
2.2 ARMulator 组件 ........................................................................................... 2-3
2.3 跟踪器 ......................................................................................................... 2-5
2.4 Profiler ....................................................................................................... 2-12
2.5 ARMulator 周期类型 .................................................................................. 2-14
2.6 页表模块 .................................................................................................... 2-19
2.7 缺省存储器模型 ......................................................................................... 2-27
2.8 使用映射文件进行存储器建模 ................................................................... 2-28
2.9 Semihosting .............................................................................................. 2-31
2.10 外围设备模型 ............................................................................................ 2-32
ᒀဤ
ઓᒎฉ
ᐺܠ ቖ
3
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
ARMulator
3.1 ARMulator 扩展套件 .................................................................................... 3-2
3.2 写新外围设备模型 ....................................................................................... 3-6
ෝቯ
版权所有
iii
3.3 构建新模型 .................................................................................................. 3-8
3.4 配置 ARMulator 以使用新模型 .................................................................. 3-10
3.5 配置 ARMulator 以禁用模型 ..................................................................... 3-12
4
ᐺ
ARMulator
4.1 ARMulator 模型 .......................................................................................... 4-2
4.2 与内核进行通信 .......................................................................................... 4-3
4.3 基本模型接口 ............................................................................................ 4-12
4.4 协处理器模型接口 ..................................................................................... 4-15
4.5 异常 .......................................................................................................... 4-26
4.6 事件 .......................................................................................................... 4-29
4.7 处理程序 ................................................................................................... 4-33
4.8 存储器访问函数 ........................................................................................ 4-38
4.9 事件调度函数 ............................................................................................ 4-40
4.10 通用函数 ................................................................................................... 4-41
4.11 访问调试器 ................................................................................................ 4-54
4.12 跟踪器 ....................................................................................................... 4-58
4.13 映射文件 ................................................................................................... 4-60
4.14 ARMulator 配置文件 ................................................................................. 4-64
4.15 ToolConf ................................................................................................... 4-69
4.16 外围设备参考 ............................................................................................ 4-74
ݬఠ
ࠤܭ
iv Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
༄ዔ
此前言对 RealView
行了介绍
• 第 vi 页
• 第 ix 页
它包含以下内容
关于本书
反馈
™
ARMulator® 指令集模拟器 (RealView ARMulator ISS) 目标进
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
v
前言
᎖۾ၗ
း࣪ሷ
本书提供了有关 RealView ARMulator ISS 即 ARM 处理器模拟器 的参考信息
ဧ۾ၗ
本书专为使用远程调试接口 1.5.1 兼容调试器的所有开发人员而写
您是一位有经验的软件开发人员
并且您熟悉 ADS v1.2 Getting Started Guide 或
前提是假定
RealView Compilation Tools v1.2 Getting Started Guide 中描述的 ARM 开发工具
本书由以下章节组成
简介
简介
1 ᐺ
简介 简介
阅读本章以简单了解本书内容以及 RealView ARMulator ISS 的概要
描述
第第第第 2 章章章章 ARMulator
基础知识
基础知识
基础知识 基础知识
阅读本章以简单了解 RealView ARMulator ISS
即 ARM 指令集模
拟器
第第第第 3 章章章章
编写
编写
ARMulator
编写 编写
模型
模型
模型 模型
阅读本章以帮助您记录您对 RealView ARMulator ISS 的扩展和修改
第第第第 4 章章章章 ARMulator
参考
参考
参考 参考
本章提供帮助您使用 RealView ARMulator ISS 的更多详细内容
vi Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
፝ၮಿ
本书使用了以下印刷惯例
前言
斜体
突出显示重要注释
࠰ᄏ 突出显示界面要素
的重点以及 ARM 处理器信号名称
等宽
表示可以从键盘输入的文本
表示允许的命令或选项缩写
等宽
输入命令或选项的全名
等宽斜体
表示此处的命令和函数变量可用特定值代替
ࢀ࠰ᄏ
表示使用示例代码以外的语言关键字
介绍特殊术语 表示内部交叉链接和引用
如菜单名称 必要时也用于强调说明列表中
如命令 文件和程序名以及源代码
可只输入下划线标记的文本 无需
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
vii
前言
ࣗᇕ
本部分列出了 ARM Limited 和第三方发布的
发代码附加信息的相关读物
ARM 将定期对其文档进行更新和更正
问题
ARM
请访问
ၗఓ
http://www.arm.com
有关最新勘误表 附录以及 ARM 常见
本书包含特定 RealView ARMulator ISS 的信息
与调试器配合使用的信息
请参阅调试器说明文档
可提供有关 ARM 系列处理器开
有关将 RealView ARMulator ISS
viii Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
ౣ
ARM Limited 乐于收到有关 RealView ARMulator ISS 及其文档的任何反馈
前言
᎖
RealView ARMulator ISS
᎖۾ၗࡼౣ
ࡼౣ
如果您对 RealView ARMulator ISS 有任何疑问
商提供快捷
有用的答复 请提供
• 您的姓名和公司
• 产品序列号
• 您所用的版本的详情
• 您运行的平台的详情
如硬件平台 操作系统类型和版本
• 再现问题发生的独立样本代码
• 您期望发生和实际发生的情况的详细说明
• 您使用的命令
包括所有命令行选项
• 解释问题的示例输出
• 工具的版本字符串
如果您对本书有任何问题
包括版本号和日期
请发送电子邮件到
• 文档标题
• 文档编号
• 您有意见的页码
• 您的意见的简单说明
请与供应商联系 为便于供应
errata@arm.com
并提供
我们还欢迎您对新增和改进之处提出一般建议
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
ix
前言
x Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
第 1 章
଼
本章介绍了 RealView ARMulator
提供的调试支持工具 本章包含以下内容
• 第 1-2 页 RealView ARMulator ISS
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
指令集模拟器
概述
版权所有
(RealView ARMulator ISS) 1.3 版
1-1
简介
1.1 RealView ARMulator ISS
您可以使用远程调试接口 (RDI) 1.5.1 兼容调试器调试您的原型软件 调试器在
主计算机上运行
您的目标系统可以是以下任何一个
• 软件模拟器 RealView ARMulator ISS
• ARM 评估或开发板
• 基于 ARM 的第三方开发板
• 您自己设计的基于 ARM 的硬件
本文档只介绍 RealView ARMulator ISS 有关其它目标系统的详情 请参阅该目
标的说明文档
1.1.1
ဠඐဵ
RealView ARMulator ISS
RealView ARMulator ISS
独立产品
通信的工具
ARMulator 是一个
模拟指令集和 ARM 处理器的结构
自定义存储器系统
ARMulator 在与调试器相同的主计算机上运行
গၤ
并连接至运行原型软件的目标系统
模拟 ARM 硬件
后文称为 ARMulator 随 ARM 调试器提供 是一个
指令集模拟器
请参阅第 3 章
(ISS)
它与存储器系统和外围设备一起 可以
您还可以将其扩展至模拟其它外围设备和
编写
ARMulator
并且包括与调试器
模型
您可以将 ARMulator 用于软件开发 也可以将其作为以 ARM 为目标的软件的
基准程序
请参阅第 2-2 页
它可以模拟指令集和计数周期 作为基准程序的精度会受到限制
精度
1.1.2 Semihosting
您可以使用主计算机上的 I/O 设备
semihosting
有关详情 请参阅 RealView Compilation Tools v1.2 Compilers and
而非目标系统提供的设备 这就是所谓的
Libraries Guide
缺省情况下
ARM C 和 C++ 代码使用 semihosting 设备
要从汇编代码访问 semihosting 设备 请使用 semihosting
ARMulator 中止 semihosting SWI 并从主计算机请求服务
1-2 Copyright © 2002, 2003 ARM Limited
版权所有
软件中断
(SWI)
ARM DUI 0207ASC-00
第 2 章
ARMulator
ᒀဤ
本章描述 ARMulator 即提供 ARM 处理器软件模拟的程序集成 它包含以下
内容
关于
• 第 2-2 页
• 第 2-3 页 ARMulator
• 第 2-5 页
• 第 2-12 页 Profiler
• 第 2-14 页 ARMulator
• 第 2-19 页
• 第 2-27 页
• 第 2-28 页
• 第 2-31 页 Semihosting
• 第 2-32 页
ARMulator
组件
跟踪器
周期类型
页表模块
缺省存储器模型
使用映射文件进行存储器建模
外围设备模型
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
2-1
ARMulator
基础知识
2.1
2.1.1
᎖
ARMulator
றࣞ
ARMulator 是一种指令集模拟器
它可以模拟指令集和各种 ARM 处理器结构
要在 ARMulator 上运行软件 请通过 RDI 1.5.1 兼容调试器进行访问
ARMulator 适用于软件开发
以模拟指令集和计数周期
程序的精度和周期计数精度会受到一定限制
并可作为以 ARM 为目标的软件的基准程序 它可
请参阅第 2-14 页 ARMulator
请参阅
周期类型
精度
作为基准
ARMulator 可提供使全部 C 或 C++ 程序在模拟系统上运行所需的全部工具
有关 ARMulator 支持的 C 库 semihosting SWI 的信息 另请参阅 RealView
Compilation Tools v1.2 Compilers and Libraries Guide
ARMulator 不能达到 100% 的精度
言
不是很复杂 非高速缓存的 ARM 处理器内核模型精度较高 而带高速缓
因为它并不是基于真实处理器的 一般而
存的那些内核模型可能与实际硬件的精度不完全相同
ARMulator 适合用作系统设计的软件开发工具
但如果需要 100% 的精度 则必
须使用硬件模型
在以下情况下 您可以使用 ARMulator 作为基准程序
• 您正在建模的内核没有高速缓存
• 您只需要近似比较
ARMulator 不会在高速缓存内核上建立 Asynchronous Mode 模型
CP15 中设置了控制位以便指定 Asynchronous Mode
Set to Asynch mode, WARNING this is not supported
您可以继续调试 但 ARMulator 将完全按照 Synchronous Mode 的方式运行
2-2 Copyright © 2002, 2003 ARM Limited
版权所有
如果您在
ARMulator 将会发出警告
ARM DUI 0207ASC-00
ARMulator
基础知识
2.2 ARMulator
ᔝୈ
可作为
ARMulator 由一系列模块组成
共享对象
Linux 或 Solaris 的
.so
主模块是
• ARM 处理器内核模型
• 处理器所用存储器的模型
这些部件中的每一个均有备选的预定义模块
储器模型组合
其中一个预定义的存储器模型
mapfile
允许您指定窄内存和等待状态
储器建模
另外 还有其它您可以使用的预定义模块
• 建立附加硬件模型
• 建立预安装的软件模型
• 抽取调试或基准信息
例如协处理器或外围设备
例如 C 库
请参阅第 2-5 页
您可以使用不同的预定义模块组合和不同的存储器映射 请参阅第 2-4 页
ARMulator
如果提供的模块不符合您的要求 您也可以写自己的模块或者编辑预定义模块
的副本
• 建立不同外围设备
例如
协处理器或操作系统的模型
• 建立不同存储器系统的模型
• 提供其它调试或基准信息
动态链接库
文件或所有平台上的
您可以选择要使用的处理器和存
mapfile
允许您详细指定模拟的存储器系统
请参阅第 2-28 页
semihosting SWI 处理程序或操作系统
跟踪器
Windows 的
文件
.sdi
.dll
来执行
文件
使用映射文件进行存
和第 2-12 页 Profiler
配置
或
一些模块的源代码已提供 您可以这些模块为示例 来写自己的模块 请参阅
第 3 章
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
编写
ARMulator
模型
版权所有
2-3
ARMulator
基础知识
2.2.1
ᒙ
ARMulator
您可以从 RDI 1.5.1 兼容调试器配置一些 ARMulator 的详细资料
要进行其它配置调整 您必须编辑
.ami
文件副本
随 ARMulator 提供以下
文件
•
bustypes.ami
•
default.ami
•
example1.ami
•
peripherals.ami
•
processors.ami
•
vfp.ami
这些文件位于
install_directory/RVARMulator/ARMulator/1.3/release/ platform
在此路径中
• platform 指
— Windows
— Linux
— Solaris
• 对于 Windows
win_32-pentium
linux-pentium
solaris-sparc
请用 \ 替换 /
如果要写自己的任何 ARMulator 模型 请先生成其它的
您的模型
有关如何操作的详情 请参阅第 4-64 页 ARMulator
文件
.ami
以允许配置
配置文件
.ami
调试器启动 ARMulator 后
径上的
install_directory /RVARMulator/ARMulator/1.3/release/platform
.ami
文件
初始设置为 ARMulator 目录
ARMulator 会读取环境变量
以下小节依次描述每个预定义模块以及如何配置这些模块
ᓖ
如果
文件中的配置设置与您在调试器中的设置发生冲突
.ami
试器设置
2-4 Copyright © 2002, 2003 ARM Limited
版权所有
中定义的所有路
ARMCONF
则将优先采用调
ARM DUI 0207ASC-00
ARMulator
基础知识
2.3
2.3.1
ৌᔍ
您可以使用跟踪器跟踪指令 存储器访问和事件 由配置文件
来控制跟踪内容
本节包括以下小节
•
• 第 2-6 页
• 第 2-10 页
ࢯ၂ৌᔍᑽߒ
如果您的调试器不直接支持跟踪功能
第 4 位来启用或禁用跟踪功能
•
• RealView 调试器中的
• 调试器当量
有关通过 ARMulator 使用跟踪功能的详情 请参阅调试器文档
跟踪器由调试器开启或关闭
请参阅第 4-64 页 ARMulator
调试器跟踪支持
解释跟踪文件输出
配置跟踪器
$rdi_log
ᓖ
配置文件
跟踪器将使用 RDI 记录级别变量的
记录级别变量为以下其中之一
@mdebug_rdi_log
但由
.ami
文件控制
peripherals.ami
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
2-5
ARMulator
基础知识
2.3.2
ஊျৌᔍᆪୈၒ߲
本节描述如何解释从跟踪器输出的信息
ৌᔍᆪୈာಿ
以下示例显示了部分跟踪文件
Date: Thu Aug 9 16:41:36 2001
Source: Armul
Options: Trace Instructions (Disassemble) Trace Memory Cycles
BNR4O___ A0000000 00000C1E
BNR8O___ 00008000 E28F8090 E898000F
BSR8O___ 00008008 E0800008 E0811008
BSR8O___ 00008010 E0822008 E0833008
BSR8O___ 00008018 E240B001 E242C001
MNR4O___ 00008000 E28F8090
IT 00008000 e28f8090 ADD r8,pc,#0x90 ; #0x8098
MNR4O___ 00008004 E898000F
IT 00008004 e898000f LDMIA r8,{r0-r3}
BNR4O___ A0000000 00000C1E
BNR8O___ 00008098 00007804 00007828
BSR8O___ 00008080 10844009 E3C44003
BSR8O___ 00008088 E2555004 24847004
BSR8O___ 00008090 8AFFFFFC EAFFFFF2
MNR8____ 00008098 00007804 00007828
BNR8O___ 000080A0 00007828 00007840
BSR8O___ 000080A8 E3A00840 E1A0F00E
BSR8O___ 000080B0 E92D400C E28F0014
BSR8O___ 000080B8 E5901000 E5900004
MNR8____ 000080A0 00007828 00007840
MNR4O___ 00008008 E0800008
IT 00008008 e0800008 ADD r0,r0,r8
MNR4O___ 0000800C E0811008
IT 0000800C e0811008 ADD r1,r1,r8
MNR4O___ 00008010 E0822008
以下类型的行可以出现在跟踪文件中
• 第 2-7 页
• 第 2-8 页
• 第 2-8 页
• 第 2-9 页
• 第 2-9 页
2-6 Copyright © 2002, 2003 ARM Limited
跟踪存储器
跟踪指令I 行
跟踪事件
跟踪寄存器
跟踪总线
E
B
M
行
R
行
行
行
版权所有
ARM DUI 0207ASC-00
ARMulator
基础知识
ৌᔍࡀ
M
ቲ
M 行表示
• 存储器访问
• 片内存储器访问
用于不带片上存储器的内核
用于带片内存储器的内核
它们具有以下通用存储器访问格式
M<type><rw><size>[O][L][S] <address> <data>
其中
<type>
<rw>
<size>
O
L
表示周期类型
S
N
连续
不连续
表示读或写操作
R
W
读
写
表示存储器访问的大小
字
半字
字节
32 位
16 位
8 位
4
2
1
表示操作码获取 指令获取
表示锁定的访问
SWP
指令
S
D
<address>
<data>
表示推测性的指令获取
表示 ARM9TDMI
™
数据接口的 DMORE 信号是 HIGH
按十六进制格式给出的地址 例如
可显示为以下一种模式
value
(wait)
(abort)
给定读/写值 例如
表示 nWAIT 为 LOW 相对于插入等待状态而言
表示 ABORT 为 HIGH 相对于中止访问而言
跟踪存储器行也可以有以下格式
用于空闲周期
MI
用于协处理器周期
MC
用于 Harvard 体系结构处理器
MIO
闲周期
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
00008008
EB00000C
如 ARM9TDMI ™指令总线上的空
版权所有
2-7
ARMulator
基础知识
ৌᔍᒎഎ
ቲ
I
跟踪指令 (I) 行的格式如下
[ IT | IS ] <instr_addr> <opcode> [<disassembly>]
例如
IT 00008044 e04ec00f SUB r12,r14,pc
其中
IT
IS
<instr_addr>
<opcode>
<disassembly>
Thumb 代码中带链接的分支显示为两个条目
1st instr of BL pair.
ৌᔍူୈ
E
表示指令被执行
表示指令被跳过 几乎所有 ARM 指令都能有条件执行
按十六进制格式显示指令地址 例如
按十六进制格式给出操作码 例如
表示反汇编 如果指令已被执行则大写 例如
r12,r14,pc
Disassemble=True
此为可选项 可通过在
启用
第一个标记为
ቲ
00008044
e04ec00f
peripherals.ami
SUB
中设置
事件 (E) 行的格式如下
E <word1> <word2> <event_number>
例如
E 00000048 00000000 10005
其中
<word1>
<word2>
<event_number>
2-8 Copyright © 2002, 2003 ARM Limited
给出一对字的第一个 例如 pc 值
给出一对字的第二个 例如中断地址
给出事件编号 例如
事件在第 4-29 页
事件
0x10005
中有描述
版权所有
这是 MMU
Event_ITLBWalk
ARM DUI 0207ASC-00
ARMulator
基础知识
ৌᔍࡀ
R
ቲ
事件 (R) 行的格式如下
R <register>=<newvalue>[,<anotherregister>=<newvalue>[...]]
例如
R r14=20000060, cpsr=200000d3
其中
<register>
<newvalue>
ৌᔍᔐሣ
B
总线 (B) 行的格式与 M 行的格式相同
当前指令的结果寄存器 , 保存指令执行结果
是
<register>
中的新内容
ቲ
B 行表示片外存储器访问
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
2-9
ARMulator
基础知识
2.3.3
ᒙৌᔍ
ARMulator 外围设备配置文件 (
{ Default_Tracer=Tracer
;; Output options - can be plaintext to file, binary to file or to RDI log
;; window. (Checked in the order RDILog, File, BinFile.)
;VERBOSE=True
;RDILog=True
RDILog=False
File=armul.trc
BinFile=armul.trc
;; Tracer options - what to trace
TraceInstructions=True
TraceRegisters=False
OpcodeFetch=True
;;Normally True is useful, but sometimes it's too expensive.
TraceMemory=True
;TraceMemory=False
TraceIdle=True
TraceNonAccounted=False
TraceEvents=False
;;If there is a non-core bus, do we trace it (as well).
TraceBus=True
;; Flags - disassemble instructions; start up with tracing enabled;
Disassemble=True
TraceEIS=False
StartOn=False
}
peripherals.ami
) 中有关于跟踪器的部分
其中
RDILog
File
指示跟踪器输出至调试器的 RDI 日志窗口
定义写跟踪信息的文件 另外 您还可以使用
进制格式存储数据
其它选项控制跟踪内容
TraceInstructions
TraceRegisters
OpcodeFetch
TraceMemory
TraceIdle
TraceNonAccounted
2-10 Copyright © 2002, 2003 ARM Limited
跟踪空闲周期
跟踪指令
跟踪寄存器
跟踪指令获取存储器访问
跟踪存储器访问
跟踪未统计的 RDI 存储器
版权所有
BinFile
按二
即那些由调试器产生的访问
ARM DUI 0207ASC-00
ARMulator
基础知识
TraceEvents
TraceBus
Disassemble
TraceEIS
跟踪事件 有关更多信息 请参阅下面的
可能是
TRUE
FALSE
总线 已跟踪片外访问
内核 未跟踪片外访问
反汇编指令
如果设为
TRUE
具对跟踪进行比较
StartOn
指示 ARMulator 在执行一开始即进行跟踪
ৌᔍ఼ᒜ
您还可以通过以下指令控制跟踪
Range=low address ,high address
只在指定的地址范围内执行跟踪
Sample=n
只将每
个跟踪条目发送至跟踪文件
n
ৌᔍူୈ
跟踪事件时
EventMask=mask ,value
您可以选择要跟踪的事件 方法如下
跟踪事件
如果您启用反汇编 则模拟速度会较慢
则将输出格式与其它模拟器兼容 这可使工
只跟踪那些编号被
Event=number
只跟踪
number
例如 以下指令只跟踪 MMU/ 高速缓存事件
EventMask=0xFFFF0000,0x00010000
有关更多信息 请参阅第 4-29 页
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
事件
屏蔽后 位与 与
mask
这相当于
EventMask=0xFFFFFFFF,number
版权所有
value
相等的事件
2-11
ARMulator
基础知识
2.4 Profiler
Profiler 由调试器控制
除配置程序执行时间外
误
进行配置
有关详情 请参阅调试器文档
Profiler 还允许您使用配置机制对事件
如高速缓存错
从调试器打开配置功能时 您应指定一个数字 n 以便控制配置频率 有关详
请参阅第 2-13 页
情
Profiler 可以配置 C 和汇编语言函数
FUNCTION
和
ENDFUNC
配置
Profiler
指令进行标记
要配置汇编语言函数 您必须将函数用
有关详情 请参阅 RealView Compilation Tools
v1.2 Assembler Guide
2-12 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
ARMulator
基础知识
2.4.1
ᒙ
Profiler
ARMulator 外围设备配置文件
{ Default_Profiler=Profiler
;VERBOSE=False
;; For example - to profile the PC value when cache misses happen, set:
;Type=Event
;Event=0x00010001
;EventWord=pc
Type=MICROSECOND
;;Alternatives for Type are
;; Event, Cycle, Microsecond.
;;If type is Event then alternatives for EventWord are
;; Word1,Word2,PC.
}
peripherals.ami
中有关于 Profiler 的部分
本部分中的每一行均为一个注释 因此 ARMulator 将执行其缺省配置 缺省设
置是每隔 100 微秒进行一次配置取样
有关更多信息 请参阅调试器文档
如果本部分未加注释 则会配置数据高速缓存出错 有关更多信息 请参阅
第 4-29 页
Type
Type=Microsecond
Type=Cycle
事件
条目控制配置间隔
指示 Profiler 每隔
指示 Profiler 每隔
微秒进行一次取样
n
个指令进行一次取样
n
此为缺省值
并记录自上次取
样后的内存周期数量
Type=Event
也允许
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
指示 Profiler 每隔一定的相关事件即进行配置
第 4-29 页
EventMask=mask,value
事件
请参阅第 2-5 页
n 被忽略
版权所有
请参阅
跟踪器
2-13
ARMulator
基础知识
2.5 ARMulator
ᒲ໐ಢቯ
除模拟 ARM 内核上的指令执行之外
从调试器您可以以
期
本节描述所计算的各种周期类型的含义 它包含以下部分
• RealView Debugger
• 第 2-15 页
• 第 2-16 页
• 第 2-16 页
• 第 2-17 页
• 第 2-17 页
• 第 2-18 页
2.5.1 RealView Debugger
ARMulator 可以按 RDI 中周期计数器调用所报告的那样增加周期计数器
详情
则符号
X
带下划线字符
然而
@cycle_count
供
并提供合理的时间定义
$statistics
中的周期计数器
未高速缓存的
未带缓存的
带
MMU 或 PU 和 AMBA ASB
带
MMU 或 PU 和 AMBA AHB
von Neumann
Harvard
带高速缓存内核的内部周期类型
内核相关的详细统计数据
ᒦࡼᒲ໐ଐၫ
请参阅第 4-35 页
@rdi_X
未知的
RDI
信息处理程序
即为周期计数器名称
这些计数器出现在寄存器选项卡中
RealView Debugger 跟踪不使用
这由监测内核和高速缓存或存储器之间总线的存储器回调服务提
ARMulator 还可以计算总线和处理器周
或调试器当量 访问这些计数
内核
架构内核
接口的高速缓存内核
接口的高速缓存内核
如果 RDI 周期计数器名称是
其中
可将所有非字母数字字符转换为
X
$statistics
RealView Debugger 使用
有关
ᓖ
尽管
@cycle_count
可能与周期计数器
内核内部和外部之间的总线比率意味着
2-14 Copyright © 2002, 2003 ARM Limited
如
Total
@cycle_count
版权所有
不同 但这种差别并不重要
是其它时钟值的数倍
ARM DUI 0207ASC-00
ARMulator
基础知识
2.5.2
ᆚႥદࡀࡼ
von Neumann
表 2-1 显示了未高速缓存的 von Neumann 内核的周期类型的含义
ARM7TDMI
ᒲ໐ಢቯ
S_Cycles 1 1
N_Cycles 0 1
I_Cycles 1 0
C_Cycles 0 0
To ta l - -
IS - -
SEQቧnMREQ
ೌኚᒲ໐
CPU 可从以下地址请求转移或转移到以下地址
• 与前述周期访问地址相同的地址
ቧ
ด
®
即是一个未带高速缓存的 von Neumann 型内核
ܭ
ᆚࡒદࡀࡼ
2-1
ፃ
连续周期 有关详情 请参阅
非连续周期
转移到该地址
内部周期
协处理器周期
S_Cycles
合并的 I-S 周期
CPU 从与前述周期所用地址无关的地址请求转移或者
CPU 不需要请求转移 因为它正在执行内部函数
N_Cycles I_Cycles C_Cycles 和 Wai t s 的总和
有关详情 请参阅
von Neumann
连续周期
合并的
例如
ଦ৩ดࡼᒲ໐ಢቯ
I-S
周期
• 在前述周期访问地址一字之后的地址
• 在前述周期访问地址一个半字之后的地址
݀ࡼ
I-S
ᒲ໐
内存控制器可以在 I-Cycle 期间推测性地开始解码地址
个 S_Cycle
则内存控制器可以比其它方式更早启动 此周期的计时功能取决于
内存控制器的实施
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
仅限于 Thumb 指令获取
如果 I_Cycle 后跟随一
2-15
ARMulator
基础知识
2.5.3
ᆚࡒદࡀࡼ
Harvard
ଦ৩ด
表 2-2 显示了未带高速缓存的 Harvard 型内核的周期类型的含义
ARM9TDMI 即是一个没有高速缓存的 Harvard 内核
ᒲ໐ಢቯ ᒎഎᔐሣ ၫᔐሣ ፃ
内核周期
ID_Cycles
I_Cycles
空闲周期 空闲 空闲
D_Cycles
Total - -
2.5.4
--
活动 活动
活动 空闲
空闲 活动
ࡒ
MMU PU AMBA ASB
ాࡼႥદࡀด
表 2-3 显示了带 AMBA ASB 接口的高速缓存内核的总线周期类型的含义
这些内核的其它周期类型
例如
ܭ
ᆚࡒႥદࡀࡼ
2-2
内核时钟运行的总数
导致的管道中断
-
-
-
-
内核周期 ID_Cycles I_Cycles Idle_Cycles D_Cycles 和
Wa it s 的总和
Harvard
这包括由于互锁和指令需要多个周期而
ଦ৩ดࡼᒲ໐ಢቯፃ
有关
请参阅第 2-17 页
带高速缓存内核的内部周期类型
例如
ARM920T 即是带 MMU 和高速缓存的内核 ARM940T 是带 PU 和高速
缓存的内核示例
ܭ
2-3 ࡒ AMBA ASB
ᒲ໐ಢቯ ፃ
A_Cycles
S_Cycles
地址预测 无数据转移 在 $statistics 中作为 I_Cycles
从当前地址连续传输数据
这些内核没有 N_Cycles 非连续访问使用 A_Cycle 后面跟随 S_Cycle 这与合
并的 I-S 周期相同
2-16 Copyright © 2002, 2003 ARM Limited
ాࡼႥદࡀดࡼᒲ໐ಢቯࡼፃ
或调试器当量
版权所有
列出
ARM DUI 0207ASC-00
ARMulator
基础知识
2.5.5
2.5.6
ࡒ
MMU PU AMBA AHB
ᒲ໐ಢቯ ፃ
IDLE
BUSY
NON-SEQ
SEQ
ࡒႥદࡀดࡼดݝᒲ໐ಢቯ
ాࡼႥદࡀด
表 2-4 说明了在
先进高速总线
是带 AHB 接口的高速缓存内核
(AHB) 上使用的传输类型
有关这些内核的其它周期类型 请参阅
缓存内核的内部周期类型
ܭ
2-4 AMBA AHB
总线主控器不想使用总线
总线主控器位于分段传输中间
上的零等待状态 OKAY 进行响应
分段传输或单个访问的开始
继续进行分段传输
从属器必须以 HRESP 上的零等待状态 OKAY 进行响应
但不能进行下一个连续访问 从属器必须以 HRESP
地址与上次访问的地址没有关联
地址等于前一个地址加上数据长度
表 2-5 显示了高速缓存内核的内部周期类型的含义
ܭ
例如
Ⴅદࡀดࡼดݝᒲ໐ಢቯ
2-5
ARM946E-S 即
ాࡼᒲ໐ಢቯ
带高速
ᒲ໐ಢቯ ፃ
F_Cycles
Core Cycles
True Idle Cycles
快速时钟 (FLCK ) 周期 这些是访问高速缓存的内部内核周期 对于非高速缓存的
访问 由于内核时钟转换为总线时钟 因此 F_Cycles 不会增加
内核周期是指内核时钟的跳转
运行在 FCLK 高速缓存访问 还是总线时钟
空闲周期并不是 I-S 合并周期的一部分
每次时钟跳转 Core Cycles 均会增加 无论内核是
ᓖ
如果您希望计算执行时间
MMU
或
PU 和 AMBA ASB
接口的高速缓存内核
速缓存的访问
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
F_Cycles 不会增加
请使用外部总线周期计数 请参阅第 2-16 页带
接口的高速缓存内核或带
您不能使用 F_Cycles 计算执行时间 因为对于未经高
版权所有
BCLK
非高速缓存访问 下
MMU 或 PU 和 AMBA AHB
2-17
ARMulator
基础知识
2.5.7 StrongARM1
表 2-6 显示了 StrongARM1 周期类型的含义
ᒲ໐ಢቯ ፃ
Core_Idle
Core_IOnly
Core_DOnly
Core_ID
2.5.8
ดሤࡼሮᇼᄻଐၫ
未从指令高速缓存获取指令 未从数据高速缓存获取数据
从指令高速缓存获取指令
未从指令高速缓存获取指令
从指令高速缓存获取指令
在
default.ami
Counters=False
文件中有以下一行
未从数据高速缓存获取数据
从数据高速缓存获取数据
从数据高速缓存获取数据
您可以将其更改为
Counters=True
这样
数
ARMulator 会计算其它统计数据
并显示在
$statistics
或调试器当量 中 这些统计数据是特定内核相
如高速缓存命中数和高速缓存未命中
关的
ܭ
2-6 StrongARM
ᄂࢾᒲ໐ಢቯ
2-18 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
ARMulator
基础知识
2.6
2.6.1
ܭෝ్
ܭෝ్গၤ
本节包括以下小节
页表模块概述
•
控制
• 第 2-20 页
• 第 2-21 页
• 第 2-22 页
• 第 2-24 页
• 第 2-25 页
控制寄存器
存储区域
页表模块和存储器管理单元
页表模块和保护单元
页表模块可使您在带
行代码
而无需为 MMU 或 PU 写初始化代码
MMU 或 PU
存储器管理单元
2 和 3
和高速缓存
(MMU) 或
保护单元
(PU) 的系统模型上运
ᓖ
此模块允许您调试代码或执行近似的基准
码才能设置 MMU 或 PU
您可以通过禁用页表模块在 ARMulator 上调试初始化
对于真实系统 您必须写初始化代
代码
在带 MMU 的 ARM v4 和 v5 处理器架构模型上 页表模块可以设置页表并初始
化 MMU
模型
行修改
在带 PU 的处理器上 页表模块可以设置 PU 要控制是否包括页表
请在 ARMulator 配置文件
另请参阅本文件中的
default.ami
Pagetables=$PAGETAB
中查找
PAGETAB
变量
并根据需要进
{PAGETAB=Default_Pagetables
}
或
{PAGETAB=No_Pagetables
}
peripherals.ami
的配置
{Default_Pagetables=PageTables
要找到
的
Pagetables
Pagetables
部分可控制页表内容以及高速缓存和 MMU 或 PU
部分
请查找以下行
有关本节所述的标记 控制寄存器和页表的完整详情 请参阅 ARM Architecture
Reference Manual 或您模拟的处理器的技术参考手册
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
2-19
ARMulator
基础知识
2.6.2
఼ᒜ
MMU PU
Ⴅદࡀ
第一个标记集可以启用或禁用高速缓存和 MMU 或 PU 的功能
MMU=Yes
AlignFaults=No
Cache=Yes
WriteBuffer=Yes
Prog32=Yes
Data32=Yes
LateAbort=Yes
BigEnd=No
BranchPredict=Yes
ICache=Yes
HighExceptionVectors=No
FastBus=No
每个标记对应系统控制寄存器中的一个位 即 CP15 中的 c1
一些标记只适用于特定处理器 例如
•
BranchPredict
•
ICache
只适用于 ARM810
适用于 StrongARM®-110 和 ARM940T™ 处理器
™
ARM720 处理器
这些标记会被其它处理器模型忽略
ᓖ
有关支持的处理器详情
请参阅调试器文档
但不适用于
FastBus
技术参考手册
基准
器时钟比内核时钟慢
标记被一些诸如 ARM940T 之类的内核使用
如果您的系统使用 FastBus Mode 请设置
如果设置
FastBus=No
则由于
MCCFG
ARMulator 不会建立非同步模式的模型
MMU 标记用于在带 PU 的处理器中启用 PU
2-20 Copyright © 2002, 2003 ARM Limited
请参阅适用于您的内核的
FastBus=Yes
以便作为
因素的影响 ARMulator 会假定存储
版权所有
ARM DUI 0207ASC-00
ARMulator
基础知识
2.6.3
఼ᒜࡀ
2 3
以下选项只适用于带 MMU 的处理器
PageTableBase=0xA0000000
DAC=0x00000001
它们控制
• 转换表基址寄存器
• 域访问控制寄存器
系统控制寄存器 2
系统控制寄存器 3
转换表基址寄存器中的地址必须与 16KB 界限相匹配
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
2-21
ARMulator
基础知识
2.6.4
ࡀཌᎮ
其它页表配置部分定义了一组存储区域
缺省情况下
{ Region[0]
VirtualBase=0
PhysicalBase=0
Size=4GB
Cacheable=No
Bufferable=No
Updateable=Yes
Domain=0
AccessPermissions=3
Translate=Yes
}
{ Region[1]
VirtualBase=0
PhysicalBase=0
Size=128Mb
Cacheable=Yes
Bufferable=Yes
Updateable=Yes
Domain=0
AccessPermissions=3
Translate=Yes
}
peripherals.ami
包含两个区域的说明
每个区域均有自己的属性
您可以按相同的通用格式添加更多区域
Region[n]
VirtualBase
PhysicalBase
为区域命名
只适用于带 MMU 的处理器
中的区域基址
映射至
给出了区域的物理基址
以
Region[0]
此地址必须与 1MB 边界对齐 它由 MMU
PhysicalBase
须与 1MB 边界对齐
对于带 PU 的处理器 它所匹配的边界必须是区域大小的若
干倍
指定此区域的大小
Size
个以兆字节为单位的整数
是 4KB 或 4KB 的二次方倍
Cacheable
指定是否将区域标记为可高速缓存
取的内容会被高速缓存
2-22 Copyright © 2002, 2003 ARM Limited
开始n 是一个整数
它给出了处理器虚拟地址空间
对于带 MMU 的处理器 此地址必
对于带 MMU 的处理器
Size
对于带 PU 的处理器
如果是 则从该区域读
版权所有
ARM DUI 0207ASC-00
必须是一
必须
Size
ARMulator
基础知识
Bufferable
指定是否将区域标记为可缓冲 如果是 则写入区域的内容
将使用写缓冲器
Updateable
Domain
AccessPermissions
只适用于 ARM610
只适用于带 MMU 的处理器
指定对区域的访问控制
™
处理器
它控制转换表条目中的
它指定表条目的域字段
有关更多信息 请参阅处理器技术
参考手册
Translate
控制对此区域的访问是否引起转换错误
Translate=No
内容
都会导致中止
则无论何时处理器从该区域读取内容或写入
如果将区域设为
您必须确保定义的区域比目标硬件所能支持的少 必须至少定义一个区域
U
位
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
2-23
ARMulator
基础知识
2.6.5
ܭෝ్ࡀಯᏄ
诸如 ARM720T
MMU 使用存储在存储器中的一组页表来定义存储区域
就会将顶级页表写出至转换表基址寄存器中指定的地址
peripherals.ami
例如 第 2-22 页
• 整个地址空间 4GB
冲
虚拟地址被直接映射至整个地址空间上相同的物理地址
• 第一个 128MB 地址空间被定义为与第一个区域重叠的另一个区域
域可以高速缓存或缓冲
它们也可以按如下方式设置控制寄存器
• 转换表基址寄存器
0xA0000000
• 域访问控制寄存器
该区域的访问设为 client
• 控制寄存器
存和写缓冲器
用指令高速缓存
™
和 ARM920T™ 之类的处理器均有 MMU
的
Pagetables
存储区域
部分中所定义的区域相对应
中给出的缺省配置详情定义了以下页表
被定义为一个单一区域 此区域不可高速缓存或缓
虚拟地址被直接映射至物理地址
即寄存器 2 初始化后指向存储器中的页表
即寄存器 3 初始化后的值为
即寄存器 1 的 M
C 和 W 位被配置为启用 MMU
如果处理器有单独的指令和数据高速缓存
一旦重置 页表模块
该表与您在
此区
0x00000001
这可将对
高速缓
I 位会配置启
2-24 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
ARMulator
基础知识
2.6.6
ܭෝ్ۣઐᏄ
诸如 ARM740T
PU 使用一组保护区域
一旦重置 页表模块便会初始化 PU
例如 上面给出的缺省配置详情会定义一个单一区域 即区域 0 此区域被标
记为读/写
ARM740T PU
对于 ARM740T
• P C 和 W 位通过配置寄存器
• 可高速缓存寄存器
• 写缓冲器控制寄存器
• 保护寄存器
• 区域 0 的保护区域基址和大小寄存器被初始化为
• 区域 1 的保护区域基址和大小寄存器被初始化后
™
和 ARM940T™ 之类的处理器都有一个 PU
每个保护区域的基址和大小均存储在 PU 的寄存器中
可高速缓存和可缓冲 它占据整个地址范围 从 0 至 4GB
PU 会按如下方式初始化
即寄存器 1 设置 可以启用保护单元
高速缓存和写缓冲器
即寄存器 2 被初始化为 1 标记区域 0 为可高速缓
存区域
即寄存器 3 被初始化为 1 标记区域 0 为可缓冲
区域
即寄存器 5 被初始化为 3 标记区域 0 为可读/ 写访问区
域
该配置通过
AccessPermissions
为 4GB 并标记区域为已启用
存器 6 的一部分
寄存器 6 实际上由八个寄存器组成 每一个都是一个区
域的保护区域基址和大小寄存器
行进行
0x3F
区域 0 的保护区域基址和大小寄存器是寄
有关详情 请参阅处理器的技术参考
手册
为 128MB 和已启用
标记区域 0 的大小
可以将区域 0 的大小设
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
2-25
ARMulator
基础知识
ARM940T PU
对于 ARM940T
• P D W 和 I 位通过配置寄存器
缓冲器
• 两个可高速缓存寄存器
的区域 0 为可高速缓存区域
— 低字节
— 高字节
• 写缓冲器控制寄存器
区域
• 两个保护寄存器
据高速缓存的区域 0 为完全访问
— 低半字
— 高半字
PU 会按如下方式初始化
即寄存器 1 设置 可以启用 PU 写
数据高速缓存和指令高速缓存
即寄存器 2 被初始化为 1 标记 I 和 D 高速缓存
这在调试器中显示为
0x0101
位 0..7 代表数据高速缓存的可高速缓存寄存器
位 8..15 代表指令高速缓存的可高速缓存寄存器
即寄存器 3 被初始化为 1 标记区域 0 为可缓冲
这只适用于数据高速缓存 指令高速缓存为只读
即寄存器 5 被初始化为 3 按如下方式标记指令和数
这在调试器中显示为
位 0..15 代表数据高速缓存保护寄存器
位 16..31 代表指令高速缓存保护寄存器
显示的第一个寄存器值用于区域 0 第二个值用于区域 1 依次类推
• 区域 0 和 1 的保护区域基址和大小寄存器初始化后
将其标记为已启用
的一部分
寄存器 6 实际上由十六个寄存器组成 每一个都是一个区域的
保护区域基址和大小寄存器
• 寄存器 7 是一个控制寄存器
器启动时显示零值
• 编程锁定寄存器
寄存器值用于数据锁定控制
• 测试和调试寄存器
ARMulator 中起作用
所有区域的保护区域基址和大小寄存器均是寄存器 6
有关详情 请参阅处理器的技术参考手册
无法预先知道是否可以从中读取数据 调试
它并不由页表模块进行写操作
即寄存器 9 均被初始化为零 调试器中显示的第一个
第二个值用于指令锁定控制
即寄存器 15 被初始化为零 只有 2 和 3 位在
这些位控制高速缓存替换算法是随机还是循环
可以标记区域大小并
其中
0x00030003
其中
2-26 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
ARMulator
基础知识
2.7
ལဏࡀෝቯ
缺省存储器模型 即 flatmem 是一个零等待状态存储器系统模型 模拟的存储
器大小并不固定
64KB 大小的块中
间均可用
如果您没有在调试器中指定映射文件 则会使用缺省存储器模型
缺省的存储器模型会把映射成存储器地址的外围设备适当地进行访问路径控
制
缺省的存储器模型不会产生访问出错
路径依赖于在
每次访问一个新的存储区域时 主机存储器均会被分配至
存储器大小受主计算机限制 但在理论上所有 4GB 地址空
peripherals.ami
或其它
文件中的配置信息
.ami
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
2-27
ARMulator
基础知识
2.8
2.8.1
ဧ፯ᆪୈቲࡀෝ
本节包括以下小节
使用映射文件进行存储器建模概述
•
时钟频率
•
• 第 2-29 页
• 第 2-29 页
• 第 2-29 页
ဧ፯ᆪୈቲࡀෝগၤ
mapfile
是一个可以自行配置的存储器模型
系统中指定单个存储器块的大小
第 4-60 页
ARMulator 可模拟所发生的每个存储器访问
等待状态
调试器内部变量
个周期类型访问
情
有关检索调试器内部变量详情的信息 请参阅调试器文档
RealView Debugger 不支持
选择映射文件存储器模型
映射文件存储器模型如何计算等待状态
配置映射存储器模型
映射文件
$memstats
访问的存储区域以及访问每个区域所花费时间等各方面的详
ᓖ
和
$statistics
$memstats
您可以在存储器映射文件的存储器
访问宽度 访问类型和访问速度 请参阅
它可以根据存储器访问类型计算
或这些调试器变量当量 可以给出每
2.8.2
ဟᒩຫൈ
您可以从调试器配置
所用的时钟频率
mapfile
时钟频率用于确定要添加至每次存储器访问的等待状态数 以及计算一定数量
的周期所需的时间
如果您没有指定时钟速率 则使用 20MHz 如果您指定了速率 但没有指定单
位
则假定单位为 Hz 您可以指定 Hz
2-28 Copyright © 2002, 2003 ARM Limited
有关详情 请参阅调试器文档
kHz 或 MHz
版权所有
ARM DUI 0207ASC-00
ARMulator
基础知识
2.8.3
2.8.4
ኡᐋ፯ᆪୈࡀෝቯ
如果您在调试器中指定了存储器映射文件
动使用文件中定义的映射存储器模型
调试器文档
፯ᆪୈࡀෝቯྙଐႯࢀࡗᓨზ
对于不同存储区域的非连续/连续读/ 写操作
定访问时间
通过插入等待状态 映射存储器模型可确保 ARM 处理器的每次
访问都至少占用如此长时间
插入的等待状态数是使总访问时间大于存储器映射文件中指定的纳秒数所需的
最小数
设计系统时应考虑这一点
例如 在时钟速率为 33MHz
费时 70ns 的一次访问会产生两个要插入的等待状态
90ns
如果访问时间是 60ns 只快 14% 则模型只会插入一个等待状态 快 33%
处理器时钟速率和存储器映射文件之间的不匹配有时可导致更快的处理器速率
反而得到较差性能
例如
态才能访问 60ns 存储器
必须插入六个等待状态才能访问
器系统反而比 110MHz 处理器的要快
况
此时 110MHz 处理器速度将会较快
则在启用存储器映射时 系统会自
有关如何指定映射文件的详情 请参阅
存储器映射文件会以纳秒为单位指
30ns 为一个周期
时 在存储器映射文件中指定
100MHz 处理器 10ns 周期
总访问时间为 60ns
110MHz 时
总访问时间为 63ns 因此 100MHz 的处理
这不适用于带高速缓存处理器下的情
从而使整个访问延长至
需要插入五个等待状
映射存储器模型
ᓖ
为了精确模拟真实硬件
存储器映射文件中指定的访问时间必须包括传输延迟
和内存控制器解码时间以及存储器设备的访问时间
果存在 10ns 的传输延迟
2.8.5
ᒙ፯ࡀෝቯ
您可以配置映射存储器模型
通过编辑
{ Default_Mapfile=Mapfile
AMBABusCounts=False
;SpotISCyles=True|False
SpotISCyles=True
;ISTiming=Late|Early|Speculative
ISTiming=Late
}
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
peripherals.ami
则将映射文件配置为 80ns
以便建立几种不同类型的内存控制器模型 这可
文件中的条目实现
版权所有
例如 对于 70ns RAM 如
2-29
ARMulator
基础知识
™
ଐႯ
AMBA
ஊ൩ᒲ໐
您可以配置模型
以便为处理器的每次非连续访问插入一个额外的解码周期
这会建立解码周期模型 可在一些 AMBA 总线系统上看到 可以通过在
peripherals.ami
݀ࡼ
I-S
中设置
ᒲ໐
所有 ARM 处理器
来执行非连续访问
作为非连续访问处理
AMBABusCounts=True
特别是高速缓存处理器 均可以作为一对空闲和连续周期
这便是
合并的
方法是在 S 周期内插入等待状态 为非连续访问延长
I-S
周期
来启用此设置
缺省情况下 模型会将这些周期
时间
您可以通过在
peripherals.ami
中设置
SpotISCycles=False
来禁用此设置
但是
这可能导致夸大的性能指标 特别是在建立带高速缓存的 ARM 处理器模型时
模型可以使用以下三种方法中的任何一种来模拟合并的 I-S 周期
Speculative 这种方法建立一个存储控制器可以在空闲周期里预测解码的系统
模型
控制器可以使用 I 和 S 周期执行访问 这可以导致少一个等
待状态
Early 在 ARM 声明下一个周期将是 S 周期
码
这有时可能导致少一个等待状态 是否存在更少的等待状态
即 I 周期的一半 时开始解
取决于该存储区域的周期时间和非连续访问时间
这是缺省设置 您可以通过在
或
ISTiming=Late
来更改此设置
peripherals.ami
中设置
ISTiming=Spec
Late 直至 S 周期才开始解码
为 N 周期
有关合并的 I-S 周期的详情 请参阅第 2-14 页 ARMulator
2-30 Copyright © 2002, 2003 ARM Limited
实际上
版权所有
I 周期之后的所有 S 周期均被视
周期类型
ARM DUI 0207ASC-00
2.9 Semihosting
Semihosting 是指代码在 ARM 的目标设备上运行 , 可以利用运行着调试器的主
机的一种机制
有关详情 请参阅 RealView Compilation Tools v1.2 Compilers and Libraries
Guide
ARMulator
基础知识
可以利用的主机资源包括键盘输入 屏幕输出和磁盘 I/O 等
2.9.1 Semihosting
ᒙ
semihosting SWI 处理程序配置由
peripherals.ami
项目
ᓖ
如果您的调试器设置了
peripherals.ami
{Default_Semihost=Semihost
; Demon is only needed for validation.
DEMON=False
ANGEL=TRUE
AngelSWIARM=0x123456
AngelSWIThumb=0xab
; And the default memory map
HeapBase=0x00000000
HeapLimit=0x07000000
StackBase=0x08000000
StackLimit=0x07000000
}
中的设置
AngelSWIARM
和
AngelSWIThumb
中的一部分控制
SWI
则它们会覆盖
它包含以下
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
2-31
ARMulator
基础知识
2.10
2.10.1
ᅪᆍ۸ෝቯ
ARMulator 包括几个外围设备模型
本节包括以下小节
•
• 第 2-33 页
• 第 2-34 页
• 第 2-35 页
• 第 2-36 页
• 第 2-36 页 Tube
ᒙ
ARMulator
可以通过更改
型
{ WatchDog=No_watchdog
}
可以更改为
{ Watchdog=Default_WatchDog
}
其它外围设备模型也可用相同方法进行控制 即在外围设备名称前添加
Default_
配置
ARMulator
中断控制器
计时器
看门狗
堆栈跟踪器
ဧᅪᆍ۸ෝቯ
default.ami
例如
前缀
本部分介绍关于这些模型的基本用户信息
使用外围设备模型
文件副本中的相关条目来启用或禁用每个外围设备模
No_
和
2.10.2
2-32 Copyright © 2002, 2003 ARM Limited
ᒙᅪᆍ۸ሮᇼᓾ೯
可在
peripherals.ami
文件的信息
中找到配置外围设备模型的详细资料
请参阅第 2-4 页
配置
ARMulator
版权所有
有关如何修改
ARM DUI 0207ASC-00
.ami
ARMulator
基础知识
2.10.3
ᒦ఼ࣥᒜ
中断控制器是参考中断控制器的一个实施工具
中断控制器模型的配置由
{ Default_Intctrl=Intctrl
WAITS=0
Range:Base=0x0a000000
}
Range:Base
详情
WAITS
指定中断控制器寄存器映射的存储器区域
请参阅第 4-74 页
指定访问中断控制器时影响到处理器的等待状态数
peripherals.ami
中断控制器
中的一部分控制
请参阅第 4-74 页
中断控制器
它包含以下项目
有关中断控制器寄存器的
最大值是 30
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
2-33
ARMulator
基础知识
2.10.4
ଐဟ
计时器是参考计时器的一个实施工具
情
请参阅第 4-76 页
计时器模型配置由
{Default_Timer=Timer
WAITS=0
Range:Base=0x0a800000
;Frequency of clock to controller.
CLK=20000000
;; Interrupt controller source bits - 4 and 5 as standard
IntOne=4
IntTwo=5
}
Range:Base
情
用于指定外围设备的时钟频率
CLK
IntOne
指定计时器寄存器映射的存储器区域
请参阅第 4-76 页
为计时器 1 中断指定到中断控制器的中断线连接
计时器
peripherals.ami
计时器
它提供两个计数器 - 计时器 有关详
中的一部分控制
它包含以下项目
有关中断控制器寄存器的详
这通常与处理器时钟频率相同
指定到中断控制器的中断线连接
指定访问计时器时影响到处理器的等待状态数
WAITS
最大值是 30
为计时器 2 中断
IntTwo
2-34 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
ARMulator
基础知识
2.10.5
ఘඡ১
使用看门狗可以防止因程序出错而锁定系统
狗失败
看门狗会暂停 ARMulator 并回控调试器
ᓖ
这是看门狗计时器的一般模型
它可以帮助用户建立系统环境的模型 它并不
建立 ARM 提供的任何实际硬件的模型
看门狗配置由
{Default_WatchDog=WatchDog
WAITS=0
Range:Base=0xb0000000
KeyValue=0x12345678
WatchPeriod=0x80000
IRQPeriod=3000
IntNumber=16
StartOnReset=True
RunAfterBark=True
}
Range:Base
peripherals.ami
指看门狗寄存器映射的存储器区域
中的一部分控制
这是双计时器看门狗
如果
StartOnReset
StartOnReset
设为
寄存器时才启动
设为
False
这可从
则第一个计时器会在重置时启动 如果
True
则第一个计时器只在程序将配置的密钥值写入
Range:Base
行 (
0xB0000000
如果程序在预定时间前访问看门
它包含以下项目
KeyValue
) 中给定的地址中找到
第一个计时器可在
WatchPeriod
果程序尚未将配置的密钥值写入
IRQPeriod
内存周期后出现超时
内存周期后生成 IRQ
KeyValue
将
IRQPeriod
IRQ 作出反应
如果
RunAfterBark
ARMulator
如果
RunAfterBark
IntNumber
WAITS
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
指定看门狗所连接的中断行号
指定访问看门狗时影响到处理器的等待状态数
设为
您可以继续执行或调试
设为
则看门狗会在第二个计时器超时时暂停
True
False
则看门狗会暂停 ARMulator 并回控调试器
寄存器
则第二个计时器会在
配置为合适的值
版权所有
并启动第二个计时器 如
以便允许程序对
最大值是 30
2-35
ARMulator
基础知识
2.10.6
ࣧᐳৌᔍ
堆栈跟踪器会检查每个指令后的堆栈指针 (r13) 的内容
计算出堆栈的最大大小
StackUse
堆栈数量
模型会连续监控堆栈指针并报告 $statistics
它必须通过堆栈位置进行配置
启用堆栈跟踪后
ARMulator 的运行速度会更慢
缺省情况下 禁用堆栈跟踪器 要启用堆栈跟踪器 请编辑
它会记录最低值并据此
或调试器当量 中所用的
default.ami
副本
1. 请查找行
{ StackUse=No_StackUse
2. 将其更改为
{ StackUse=Default_StackUse
初始化之前 堆栈指针可以包含堆栈限制以外的值 您必须配置堆栈限制 以
便堆栈跟踪器可以忽略这些预初始化值
{ Default_StackUse=StackUse
StackBase=0x80000000
StackLimit=0x70000000
}
StackBase
堆栈在存储器中的位置
是堆栈顶部的地址
要改变堆栈位置 您必须重新配置调试监控器模型
StackLimit
此配置位于
是堆栈的下限
peripherals.ami
中
更改这些值不会改变
2.10.7 Tube
tube 是存储器映射的寄存器
在控制台上
它允许您检查写入操作是否发生在存储器中的指定位置
如果您将可印刷字符写在 tube 上 则字符会出现
您可以更改 Tube 被映射的地址 这由
{Default_Tube=Tube
Range:Base=0x0d800020
}
这是缺省地址
2-36 Copyright © 2002, 2003 ARM Limited
peripherals.ami
版权所有
中的一个条目控制
ARM DUI 0207ASC-00
第 3 章
ܠቖ
ARMulator
本章意在帮助您编写模型以添加至 ARMulator 它包含以下部分
• 第 3-2 页 ARMulator
• 第 3-6 页
• 第 3-8 页
• 第 3-10 页
• 第 3-12 页
ෝቯ
扩展套件
写新外围设备模型
构建新模型
配置
ARMulator
配置
ARMulator
以使用新模型
以禁用模型
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
3-1
ARMulator 模型
编写
3.1 ARMulator
3.1.1
ᆪୈᆡᒙ
౫ᐱᄁୈ
您也可以在不更改现有模型的情况下将其它模型添加至 ARMulator 每个模型
均是独立和完备的
在第 4 章 ARMulator
本文档其余部分中指定的路径
install_directory/RVARMulator/ExtensionKit
对于 Windows 请用 \ 替换 /
ARMulator 扩展套件包括某些模型的源代码
Ꮞᆪୈᆡᒙ
供您进行复制的模型源代码位于
ExtensionKit_path/1.3/Final/ platform/armulext
在该路径中
• platform 是
— Windows 的
— Linux 的
— Solaris 的
• 对于 Windows
通过定义的接口与 ARMulator 进行通信 这些接口的定义
参考
中提供
ExtensionKit_path
是指
您可以复制这些模型并修改其副本
win_32-pentium
linux-pentium
solaris-sparc
请用 \ 替换 /
ܪᄿᆪୈࡼᆡᒙ
标头文件位于
ExtensionKit_path/1.3/release/ platform/armulif
在该路径中
• platform 是
— Windows 的
— Linux 的
— Solaris 的
• 对于 Windows
3-2 Copyright © 2002, 2003 ARM Limited
win_32-pentium
linux-pentium
solaris-sparc
请用 \ 替换 /
版权所有
ARM DUI 0207ASC-00
编写
ARMulator 模型
makefile
ࡼᆡᒙ
makefile 位于
ExtensionKit_path/1.3/Final/linux-pentium/armulext/ model.b/ target
在该路径中
•
是模型名称
model
millisec
型
的目录
例如
millisec.b
是执行简单毫秒计时器功能的外设模
• target 是
— Windows 的
— Linux 的
— Solaris 的
• 对于 Windows
intelrel
linux86
gccsolaris
请用 \ 替换 /
使用这些文件作为编写用户自己模型的例子 为了帮助您选择合适的模型进行
检查
本章包含这些模型的列表并附有各自功能的简单介绍 请参阅第 3-4 页
附带的模型
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
3-3
编写
ARMulator 模型
3.1.2
এࡒࡼෝቯ
ARMulator 附带用于以下模型组的源代码
基本模型
•
• 第 3-5 页
外围设备模型
۾ෝቯ
tracer.c
跟踪器模块可以跟踪指令执行和来自 ARMulator 内部的事件
参阅第 4-58 页
跟踪器
您可以将自己的跟踪代码链接至跟踪器
模块
profiler.c
profiler 模块可以提供配置功能
包括基本指令抽样和更多高级使用
这可以通过提供处理来自 RDI 1.5.1 可兼容调试器的配置请求的
UnkRDIInfoHandler
来实现
程序
pagetab.c
重置时
此模块将设置 ARMulator 内的高速缓存
相关页表 请参阅第 2-19 页
stackuse.c
如果启用
储器统计数据表中报告
此模型即会跟踪堆栈大小 堆栈用法在 ARMulator 存
您可以在
的上限和下限 请参阅第 2-36 页
请参阅第 2-12 页 Profiler 这
例如配置高速缓存故障
参见第 4-35 页
未知的
RDI
页表模块
peripherals.ami
文件中设置堆栈
堆栈跟踪器
请
信息处理
PU 或 MMU 及
nothing.c
semihost.c
此模型不起作用
请参阅第 3-12 页
型
此模型提供 RealView Compilation Tools v1.2 Compilers and Libraries
您可以在
配置
Guide 中说明的 semihosting SWI
这是 Debug Communications Channel (DCC) 的模型
dcc.c
mapfile.c
flatmem.c flatmem
3-4 Copyright © 2002, 2003 ARM Limited
此模型允许您指定存储器系统的特征
页
映射文件
可模拟零等待状态的存储器系统
第 2-27 页
缺省存储器模型
peripherals.ami
ARMulator
版权所有
以禁用模型
文件中使用它来禁用模
有关详情 请参阅第 4-60
有关详情 请参阅
ARM DUI 0207ASC-00
ᅪᆍ۸ෝቯ
编写
ARMulator 模型
请参阅第 2-33 页
intc.c
Specification (RPS) 中说明的中断控制器外围设备的模型
timer.c
millisec.c
watchdog.c
请参阅第 2-34 页
提供两个计时器
型
不必使用
intc
简单的毫秒计时器
看门狗
模型
请参阅第 2-35 页
它并不模拟特定的看门狗硬件 只提供一般的看门
狗功能
Tube 请参阅第 2-36 页 Tube
tube.c
备 它允许您检查写操作是否发生在存储器中的指定位置
中断控制器
计时器
timer
timer
看门狗
是 Reference Peripherals
intc
是 RPS 计时器外围设备的模
必须用于连接中断控制器
watchdog
是个简单的调试辅助设
tube
是普通看门狗
但
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
3-5
编写
ARMulator 模型
3.2
3.2.1
ቖቤᅪᆍ۸ෝቯ
本节包括以下小节
使用样本模型作为模板
•
返回值
•
• 第 3-7 页
• 第 3-7 页
ဧዹ۾ෝቯᔫᆐෝۇ
要写新模型
行此操作
1. 选择一个最接近您需要的模型
2. 复制源文件
3. 复制 make 子目录
mymodel.b
4. 检查模型的
将
现在您可以编辑
初始化 最终化和状态宏
注册模型
最好的步骤是先复制一个现成的模型 然后再编辑其副本 要执
例如可能是计时器
Makefile
此处指
timer.c
此处指
Makefile
请参阅第 3-2 页
载入文本编辑器并将所有的
MyModel
了
并使用新名称 例如
timer.b
并使用相应的新名称 此处为
文件位置
实例更改为
timer
mymodel.c
mymodel
3.2.2
ૄᒋ
模型必须返回以下存储器访问状态中的其中一个
PERIP_OK
PERIP_BUSY
如果模型可以响应请求
如果存储器访问需要等待状态 模型不能将此状态返回至调
试器
PERIP_DABORT
PERIP_NODECODE
3-6 Copyright © 2002, 2003 ARM Limited
如果外围设备在总线上置起 DABORT 信号
如果模型连同属于它的地址一起被调用 但这对它没有意
义
存储器模型将调用视为存储器访问处理
版权所有
ARM DUI 0207ASC-00
编写
ARMulator 模型
3.2.3
߱ဪછ
ᔢᒫછᓨზ
为了帮助您编写新的 ARMulator 模型
•
BEGIN_INIT()
•
END_INIT()
•
BEGIN_EXIT()
•
END_EXIT()
•
BEGIN_STATE_DECL()
•
END_STATE_DECL()
使用以下内容为模型定义初始化函数
BEGIN_INIT(your_model)
{
/*
*
*/
}
END_INIT(your_model)
此处输入您的初始化代码
使用以下内容为模型定义最终化函数
BEGIN_EXIT(your_model)
{
/*
*
*/
}
END_EXIT(your_model)
此处输入您的最终化代码
minperip.h
中提供了以下宏
以便存放模型使用的所有私有数据
使用以下内容声明数据结构
3.2.4
ᓖݿෝቯ
BEGIN_INIT()
END_EXIT()
BEGIN_STATE_DECL(your_model)
/*
*
*/
END_STATE_DECL(your_model)
您的模型必须通过调用
宏可定义一种结构
宏可以释放这些数据
此处输入您的私有数据
registerPeripFunc()
您的模型并访问属于模型的存储器位置
ARMul_BusRegisterPeripFunc
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
来自行注册
请参阅第 4-45 页
版权所有
这可使 ARMulator 调用
3-7
ARMulator 模型
编写
3.3
৩ቤෝቯ
ARMulator 预期在可执行路径中查找模型
install_directory/RVARMulator/ARMualtor/1.3/release/ platform
当您构建新模型时 构建的文件放入以下构建路径
ExtensionKit_path/1.3/release/ platform/armulext/ mymodel.b/ target
在这些路径中
• platform 是
— Windows 的
— Linux 的
— Solaris 的
linux-pentium
solaris-sparc
win_32-pentium
• mymodel 是您为新模型设定的名称
• target 是
— Windows 的
— Linux 的
— Solaris 的
• 对于 Windows
intelrel
linux86
gccsolaris
请用 \ 替换 /
3-8 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
ARMulator 模型
编写
3.3.1
ྙ৩ቤෝቯ
要构建新模型
1. 将系统的当前目录更改为
2. 使用安装在系统中的 make 实用程序构建模型
为了说明清楚
3. 将已构建文件从
build_path
• Windows 的
• Linux 或 Solaris 的
文件放入
build_path
nmake
make
ᓖ
在本节中 可执行和构建路径称为
有关完整路径名 请参阅第 3-8 页
build_path
• 在 Windows 中为
• 在 Linux 或 Solaris 中为
移至
exec_path
mymodel.dll
mymodel.so
构建新模型
视您的系统而定 文件名可以是
它可以是以下各项之一
exec_path
和
build_path
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
3-9
编写
ARMulator 模型
3.4
3.4.1
ᒙ
ARMulator
ᄗଝ
.dsc
ጲဧቤෝቯ
ARMulator 可以通过读取
第 4-64 页 ARMulator
配置文件
在 ARMulator 使用新模型之前 您必须为模型添加
必须添加至配置文件
default.ami
以下小节说明了执行步骤
添加
.dsc
•
• 第 3-11 页
文件
编辑
default.ami 和 peripherals.ami
ᆪୈ
创建名为
install_directory/RVARMulator/ARMualtor/1.3/release/ platform
MyModel.dsc
的文件并将其放入
在该路径中
• platform 是
— Windows 的
— Linux 的
— Solaris 的
• 对于 Windows
linux-pentium
solaris-sparc
请用 \ 替换 /
和
.ami
.dsc
和
win_32-pentium
配置文件决定要使用的模型
.dsc
peripherals.ami
文件
请参阅
同时其参考信息
MyModel .dsc
;; ARMulator configuration file type 3
{ Peripherals
{MyModel
MODEL_DLLfilename =MyModel
}
{
No_MyModel =Nothing
}
}
必须包含以下内容
模型的名称视系统而定 请参阅第 3-9 页
•
MyModel.dll
•
MyModel.so
3-10 Copyright © 2002, 2003 ARM Limited
.
如何构建新模型
版权所有
ARM DUI 0207ASC-00
编写
ARMulator 模型
3.4.2
Nothing
使用
置
是一个不起作用的预定义模型
No_MyModel
ARMulator
如有必要 您可以将其它配置详细信息包含在
据以下路径参阅附带的
install_directory/RVARMulator/ARMualtor/1.3/release/ platform
ܠ
default.ami peripherals.ami
本说明假定您的模型基于计时器
1. 将
default.ami
{Timer=Default_Timer
}
2. 将参考信息添加至您的模型
{Timer=Default_Timer
}
{MyModel=Default_MyModel
}
3. 保存您编辑过的
No_MyModel =Nothing
行允许在
这使用户可配置 ARMulator 以排除模型 请参阅第 3-12 页
以禁用模型
例如 请根
文件
.dsc
文件载入文本编辑器
default.ami
文件
MyModel.dsc
并找到以下行
文件中
.ami
文件中
配
4. 将
peripherals.ami
{ Default_Timer=Timer
.
.
.
}
5. 以此作为实例
程度
您可能可以很容易地编辑计时器部分的副本
6. 保存您编辑过的
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
文件载入文本编辑器
为您的模型添加配置部分 根据您的模型与计时器的差别
peripherals.ami
文件
版权所有
然后查找 计时器 部分
3-11
编写
ARMulator 模型
3.5
ᒙ
ARMulator
ጲணෝቯ
您可以通过更改
模型
1. 在
2. 将其更改为
表示使用
如
peripherals.ami
{Default_Tube=Tube
Range:Base=0x0d800020
}
{Default_Tube=No_Tube
Range:Base=0x0d800020
}
nothing.c
Range:Base
peripherals.ami
中找到以下行
模型覆盖
tube.c
中模型的条目来禁用此模型
模型
nothing
将忽略所有配置详细信息
例如 要禁用 Tube
例
3-12 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
第 4 章
ARMulator
ݬఠ
本章介绍有关 ARMulator 的参考信息 包含以下几个部分
• 第 4-2 页 ARMulator
• 第 4-3 页
• 第 4-12 页
• 第 4-15 页
• 第 4-26 页
• 第 4-29 页
• 第 4-38 页
• 第 4-40 页
• 第 4-41 页
• 第 4-54 页
• 第 4-58 页
• 第 4-60 页
• 第 4-64 页 ARMulator
• 第 4-69 页 ToolConf
• 第 4-74 页
与内核进行通信
基本模型接口
协处理器模型接口
异常
事件
存储器访问函数
事件调度函数
通用函数
访问调试器
跟踪器
映射文件
外围设备参考
模型
配置文件
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
4-1
ARMulator 参考
4.1 ARMulator
4.1.1
ᄰ
ToolConf
ෝቯ
ARMulator 由一系列模拟基于 ARM 的硬件的模型组成
件工作完成之前开始评估
开发和调试软件的工作
ᒙෝቯ
您可以通过
据库
中读取 请参阅第 4-69 页 ToolConf
件
ToolConf
这些标签和数值由 ARMulator 在初始化期间从配置文件
配置 ARMulator 模型
ToolConf
系统提供了用于从此数据库查找数值的一系列函数 全套函数在以下位置定义
install_directory/RVARMulator/ARMulator/1.3 /release/clx/toolconf.h
对于 Windows 请用 \ 替换 /
所有函数均采用一个称为
toolconf
的不透明句柄
这些模型可以使您在硬
是一个包含标签和数值的数
和
.dsc
.ami
文
4-2 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
ARMulator 参考
4.2
Ꭷดቲᄰቧ
在初始化期间 所有模型均会收到一个
它们会将此结构作为字段 称之为
一个参数传送至大多数 ARMulif
些函数
以下函数提供对 ARM 寄存器的读写访问
• 第 4-5 页 ARMulif_GetReg
• 第 4-5 页 ARMulif_SetReg
• 第 4-6 页 ARMulif_GetPC
• 第 4-6 页 ARMulif_SetPC
• 第 4-7 页 ARMulif_GetCPSR
• 第 4-7 页 ARMulif_SetCPSR
• 第 4-8 页 ARMulif_GetSPSR
• 第 4-8 页 ARMulif_SetSPSR
在调用内核的 ARMulif 中调用函数时 模型必须将指针传送至其 coredesc 结构
以下函数可提供对 CPSR 中特定位或字段的便利的访问
• 第 4-9 页 ARMulif_ThumbBit
• 第 4-9 页 ARMulif_GetMode
以下函数可调用协处理器的读写方法
• 第 4-10 页 ARMulif_CPRead
• 第 4-11 页 ARMulif_CPWrite
*
RDI_ModuleDesc
coredesc
复制到其自身的状态 这作为第
ARMulator 接口
函数
型的
以便启用模型来通过此句柄访问 ARMulator 状态
和
ARMulif_GetR15
和
ARMulif_SetR15
结构的指针
mdesc
ARMulator 将导出这
ᓖ
从模型的某些组成部分访问状态的一些组成部分会不恰当
储器访问函数设置 ARM 寄存器的内容
间被调用
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
相反 有时需要通过 SWI 处理程序函数设置 ARM 寄存器的内容
例如 您不能通过存
因为存储器访问函数可以在模拟指令期
版权所有
4-3
ARMulator 参考
4.2.1
ෝါܠ
以下一些函数采用
定义
•
•
•
•
•
•
•
列示如下
USER32MODE
FIQ32MODE
IRQ32MODE
SVC32MODE
ABORT32MODE
UNDEF32MODE
SYSTEM32MODE
此外还定义了特殊值
unsigned
CURRENTMODE
如返回当前模式的寄存器
模式参数指定处理器模式 模式编号在
这使
ARMulif_GetReg()
可以完成一些操作
armdefs.h
中
例
4-4 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
4.2.2 ARMulif_GetReg
此函数可读取指定处理器模式下的寄存器
Ꭻ
ARMword ARMulif_GetReg(RDI_ModuleDesc *mdesc , ARMword mode , unsigned reg )
其中
ARMulator 参考
mdesc
mode
reg
ૄ
此函数可返回特定模式的指定寄存器的值
4.2.3 ARMulif_SetReg
此函数可写入指定处理器模式的寄存器
Ꭻ
void ARMulif_SetReg(RDI_ModuleDesc *mdesc , ARMword mode ,
unsigned reg , ARMword value )
其中
mdesc
mode
是内核的句柄
是处理器模式 模式的值在
armdefs.h
式编号
是要读取的寄存器 寄存器 r0 至 r14
14
是内核的句柄
是处理器模式 模式编号在
armdefs.h
式编号
中定义
请参阅第 4-4 页
模
PC 或 CPSR 的有效值是 0 至
中定义
请参阅第 4-4 页
模
reg
是要写入的寄存器 寄存器 r0 至 r14
14
value
是要写入特定处理器模式下的寄存器
您可使用此函数写入任何通用寄存器 r0 至 r14
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
PC 或 CPSR 的有效值是 0 至
的值
reg
PC 或 CPSR
4-5
ARMulator 参考
4.2.4 ARMulif_GetPC ARMulif_GetR15
此函数可读取 pc
ARMulif_GetPC
Ꭻ
ARMword ARMulif_GetPC(RDI_ModuleDesc *mdesc )
ARMword ARMulif_GetR15(RDI_ModuleDesc *mdesc )
其中
mdesc
是内核的句柄
ૄ
此函数可返回 pc 的值
4.2.5 ARMulif_SetPC ARMulif_SetR15
此函数可将值写入 pc
Ꭻ
void ARMulif_SetPC(RDI_ModuleDesc * mdesc, ARMword value)
void ARMulif_SetR15(RDI_ModuleDesc * mdesc, ARMword value)
其中
和
ARMulif_SetPC
ARMulif_GetR15
和
ARMulif_SetR15
是同义词
是同义词
mdesc
value
4-6 Copyright © 2002, 2003 ARM Limited
是内核的句柄
是要写入 pc 的值
版权所有
ARM DUI 0207ASC-00
4.2.6 ARMulif_GetCPSR
此函数可读取 CPSR
Ꭻ
ARMword ARMulif_GetCPSR(RDI_ModuleDesc *mdesc )
其中
ARMulator 参考
mdesc
ૄ
此函数可返回 CPSR 的值
4.2.7 ARMulif_SetCPSR
此函数可将值写入 CPSR
Ꭻ
void ARMulif_SetCPSR(RDI_ModuleDesc *mdesc , ARMword value )
其中
mdesc
value
是内核的句柄
是内核的句柄
是要写入 CPSR 的值
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
4-7
ARMulator 参考
4.2.8 ARMulif_GetSPSR
此函数可返回指定处理器模式下的 SPSR 当前内容
Ꭻ
ARMword ARMulif_GetSPSR(RDI_ModuleDesc *mdesc , ARMword mode )
其中
mdesc
mode
ઓෝါ
如果
4.2.9 ARMulif_SetSPSR
此函数可将值写入指定处理器模式下的 SPSR
Ꭻ
void ARMulif_SetSPSR(RDI_ModuleDesc * mdesc, ARMword mode, ARMword value)
其中
mdesc
mode
value
ઓෝါ
如果
是内核的句柄
是要读取的 SPSR 处理器模式
mode 是 USER32MODE
是内核的句柄
是要写入的 SPSR 的处理器模式
是要写入指定模式的 SPSR 的值
为
mode
USER32MODE则 ARMulif_SetSPSR
则
ARMulif_GetSPSR
可返回 CPSR 的当前内容
不起作用
4-8 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
4.2.10 ARMulif_ThumbBit
ARMulator 参考
如果内核处于 Thumb 状态
函数返回 0
Ꭻ
unsigned ARMulif_ThumbBit(RDI_ModuleDesc *mdesc )
其中
mdesc
4.2.11 ARMulif_GetMode
此函数可读取当前处理器模式
Ꭻ
unsigned ARMulif_GetMode(RDI_ModuleDesc *mdesc )
其中
mdesc
则此函数返回 1 如果内核处于 ARM 状态 则此
是内核的句柄
是内核的句柄
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
4-9
ARMulator 参考
4.2.12 ARMulif_CPRead
此函数可调用协处理器的
read
方法
Ꭻ
int ARMulif_CPRead(RDI_ModuleDesc *mdesc , unsigned cpnum,
unsigned reg , ARMword *data )
其中
mdesc
cpnum
reg
是内核的句柄
是协处理器的编号
是从中进行读取的协处理器寄存器编号 由
编入索引
data
是从协处理器寄存器读取的数据的指针 被传输的字数及顺序与
协处理器有关
ૄ
函数必须返回
•
•
ARMul_DONE
ARMul_CANT
如果可以读取寄存器的话
如果无法读取寄存器的话
LDC
或
指令中的
STC
CRn
4-10 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
4.2.13 ARMulif_CPWrite
ARMulator 参考
此函数可调用协处理器的
write
方法
它还可以截取调用以写入 FPE 模拟的寄
存器
Ꭻ
int ARMulif_CPWrite(RDI_ModuleDesc *mdesc , unsigned cpnum,
unsigned reg , ARMword *data)
其中
mdesc
cpnum
reg
是内核的句柄
是协处理器的编号
是从中进行读取的协处理器寄存器编号 由
编入索引
data
是从协处理器寄存器读取的数据的指针 传输的字数及顺序与协
处理器有关
ૄ
函数必须返回
•
•
ARMul_DONE
ARMul_CANT
如果可以写寄存器的话
如果无法写寄存器的话
LDC
或
指令中的
STC
CRn
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
4-11
ARMulator 参考
4.3
۾ෝቯా
本部分包括以下小节
• 第 4-13 页
• 第 4-14 页
• 第 4-14 页
对于每个模型 您均必须写入一个初始化函数 对于其它功能 您必须记录
回调
对于以下选取内容
• 第 4-13 页
• 第 4-14 页
• 第 4-14 页
另请参阅第 3-7 页
私有状态数据结构的声明
模型初始化
模型最终化
minperip.h
中提供了宏
私有状态数据结构的声明
模型初始化
模型最终化
初始化 最终化和状态宏
4-12 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
ARMulator 参考
4.3.1
ႉᎌᓨზၫஉ৩ࡼဉී
每个模型均必须将其状态保存在私有数据结构中
提供
这些宏需要使用此数据结构中的某些字段
要声明状态数据结构 请按照以下说明使用
/*
* Create a YourModelState data structure
*/
BEGIN_STATE_DECL(YourModel)
/*
* Your private data here
*/
END_STATE_DECL(YourModel)
这可声明以下结构
typedef struct YourModelState
此结构包含
• 预定义的数据字段
—
—
—
—
• 您输入的私有数据位于宏之间
初始化和最终化宏可由
BEGIN_STATE_DECL
toolconf config
const struct RDI_HostosInterface *hostif
RDI_ModuleDesc coredesc;
RDI_ModuleDesc agentdesc
和
END_STATE_DECL
ARMulif
宏
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
4-13
ARMulator 参考
4.3.2
4.3.3
ෝቯ߱ဪછ
ෝቯᔢᒫછ
BEGIN_INIT()
和
END_INIT()
宏形成模型的初始化函数的启动和完成
在以下时间被调用
• ARMulator 初始化期间
• 无论何时从调试器下载新映像时
初始化函数中包含以下局部变量
• bool coldboot
在 ARMulator 进行初始化时为
• YourModelState *state
在从调试器下载新映像时为
TRUE
私有状态数据结构的指针 初始化宏将为其分配和清除存储器 并且预定
义数据字段会被初始化
在初始化函数中 您的模型必须
• 初始化任何私有数据
• 安装任何回调
BEGIN_EXIT()
和
END_EXIT()
宏可形成模型的最终化函数的启动和完成
ARMulator 时将会调用最终化函数
最终化函数中包含以下局部变量
初始化函数
FALSE
关闭
YourModelState *state
您的模型必须卸载最终化函数中的所有回调
END_EXIT()
4-14 Copyright © 2002, 2003 ARM Limited
宏将会释放分配给状态的存储器
版权所有
ARM DUI 0207ASC-00
ARMulator 参考
4.4
ࠀಯෝቯా
协处理器模型接口在
• 第 4-16 页 ARMulif_InstallCoprocessorV5
• 第 4-17 页 LDC
• 第 4-18 页 STC
• 第 4-19 页 MRC
• 第 4-20 页 MCR
• 第 4-19 页 MRC
• 第 4-20 页 MCR
• 第 4-21 页 MCRR
• 第 4-22 页 MRRC
• 第 4-23 页 CDP
某些协处理器具有只写寄存器
正确的值写入模型中的此类寄存器
出现的情况
此外 系统还提供两个函数 使 RDI 1.5.1 可兼容调试器可以通过
(RDI) 读写协处理器寄存器
• 第 4-24 页 read
• 第 4-25 页 write
ᓖፀ
armul_copro.h
中定义
写入这些寄存器的值必须是特定值 如果有不
这两个函数是
基本协处理器函数有
则结果不可预知 并且可能不遵循硬件中
远程调试接口
如果协处理器无法处理一个或更多此类函数 则必须保持
构中的条目不变
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
ARMul_CPInterface
结
4-15
ARMulator 参考
4.4.1 ARMulif_InstallCoprocessorV5
使用此函数记录一个协处理器处理程序
此函数在
armul_copro.h
中有原型
Ꭻ
unsigned ARMulif_InstallCoprocessorV5(RDI_ModuleDesc *mdesc , unsigned number,
struct ARMul_CoprocessorV5 *cpv5 , void *handle )
其中
mdesc
number
cpv5
handle
是内核的句柄
是协处理器编号
是协处理器接口结构的指针
是传送到每个协处理器函数的专有数据的指针
ૄ
此函数可返回以下其中一个值
•
ARMulErr_NoError
• 一个
ARMul_Error
有关错误代码的完整列表 请参阅
Hostif_RaiseError()
如果没有错误的话
值
armerrs.h
传送以进行格式化
和
errors.h
错误必须通过
请参阅第 4-53 页 Hostif_RaiseError
4-16 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
4.4.2 LDC
ARMulator 参考
识别协处理器的
指令时将调用此函数
LDC
Ꭻ
unsigned LDC(void *handle , int type, ARMword instr, ARMword *data)
其中
handle
type
instr
data
是
ARMulif_InstallCoprocessorV5
是协处理器访问的类型 它可以是以下各项之一
ARMul_CP_FIRST
ARMul_CP_BUSY
ARMul_CP_INTERRUPT
表示首次调用该指令的协处理器模型
表示这是第一个调用忙等待之后的随后的调用
警告协处理器 ARM 即将处理中断
理器必须放弃当前指令
试指令
ARMul_CP_TRANSFER
ARMul_CP_DATA
表示 ARM 即将执行加载
表示有效数据包含在
当前操作码
是从存储器加载至协处理器的数据的指针
的句柄
此时
将被重设为
type
data
系统通常会在稍后重
ARMul_CP_FIRST
中
ૄ
此函数必须返回以下其中一个值
•
ARMul_CP_INC
ARMul_CP_BUSY
•
ARMul_CP_DONE
•
ARMul_CP_BUSY
ARMul_CP_BUSY
•
ARMul_CP_CANT
应
•
ARMUL_CP_LAST
ARMul_CP_FIRST
以从内核请求更多数据 仅响应
或
ARMul_CP_DATA
以表示协处理器操作已完成 仅响应
以表示协处理器正忙 仅响应
ARMul_CP_FIRST
ARMul_CP_DATA
ARMul_CP_FIRST
以表示指令不受支持 或者无法访问指定的寄存器 仅响
或
ARMul_CP_BUSY
以表示下一次加载是顺序中的最后一次 这仅需用于
ARM9
因此协处
或
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
4-17
ARMulator 参考
4.4.3 STC
识别协处理器的
指令时会调用此函数
STC
Ꭻ
unsigned STC(void *handle , int type, ARMword instr, ARMword *data)
其中
handle
type
instr
data
是
ARMulif_InstallCoprocessorV5
是协处理器访问的类型 它可以是以下各项之一
ARMul_CP_FIRST
ARMul_CP_BUSY
ARMul_CP_INTERRUPT
表示首次调用该指令的协处理器模型
表示这是第一个调用忙等待之后的随后的调用
警告协处理器 ARM 即将中断
必须放弃当前指令
令
ARMul_CP_DATA
表示协处理器必须返回
是当前操作码
是保存至存储器的数据位置的指针
此时
的句柄
将被重设为
type
系统通常会稍后重试此指
ARMul_CP_FIRST
中的有效数据
*data
ૄ
此函数必须返回以下其中一个值
•
ARMul_CP_INC
ARMul_CP_BUSY
•
ARMul_CP_DONE
•
ARMul_CP_BUSY
ARMul_CP_BUSY
•
ARMul_CP_CANT
应
•
ARMUL_CP_LAST
ARMul_CP_FIRST
以表示有更多数据传送至内核 仅响应
或
ARMul_CP_DATA
以表示协处理器操作已完成 仅响应
以表示协处理器正忙 仅响应
ARMul_CP_FIRST
ARMul_CP_FIRST
ARMul_CP_DATA
以表示指令不受支持 或者无法访问指定的寄存器 仅响
或
ARMul_CP_BUSY
以表示下一次保存是顺序中的最后一次 这仅需用于
ARM9
因此协处理器
或
4-18 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
4.4.4 MRC
ARMulator 参考
识别协处理器的
或无法写入其中
指令时会调用此函数
MRC
则函数必须返回
ARMul_CP_CANT
如果请求的协处理器寄存器不存在
Ꭻ
unsigned MRC(void *handle , int type, ARMword instr, ARMword *data)
其中
handle
type
instr
data
是
ARMulif_InstallCoprocessorV5
是协处理器访问的类型 它可以是以下各项之一
ARMul_CP_FIRST
ARMul_CP_BUSY
ARMul_CP_INTERRUPT
表示首次调用该指令的协处理器模型
表示这是第一个调用忙等待之后的随后的调用
警告协处理器 ARM 即将处理中断
理器必须放弃当前指令
试指令
ARMul_CP_DATA
表示有效数据包含在
是当前操作码
是从协处理器转移至内核的数据位置的指针
的句柄
此时
将被重设为
type
* data
系统通常会在稍后重
ARMul_CP_FIRST
中
ૄ
此函数必须返回以下其中一个值
•
ARMul_CP_DONE
•
ARMul_CP_BUSY
ARMul_CP_CANT
•
表示协处理器操作已完成 并且有效数据已返回
表示协处理器正忙
表示指令不受支持或无法访问指定的寄存器
因此协处
*data
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
4-19
ARMulator 参考
4.4.5 MCR
识别协处理器的
或无法写入
则函数必须返回
指令时将调用此函数
MCR
ARMul_CP_CANT
如果请求的协处理器寄存器不存在
Ꭻ
unsigned MCR(void *handle , int type, ARMword instr, ARMword *data)
其中
handle
type
instr
data
是
ARMulif_InstallCoprocessorV5
是协处理器访问的类型 它可以是以下各项之一
ARMul_CP_FIRST
ARMul_CP_BUSY
ARMul_CP_INTERRUPT
表示首次调用该指令的协处理器模型
表示这是第一个调用忙等待之后的随后的调用
警告协处理器 ARM 即将处理中断
理器必须放弃当前指令
试指令
ARMul_CP_DATA
表示有效数据包含在
是当前操作码
是转移至协处理器的数据的指针
的句柄
此时
将被重设为
type
data
系统通常会在稍后重
ARMul_CP_FIRST
中
ૄ
此函数必须返回以下其中一个值
•
ARMul_CP_DONE
ARMul_CP_BUSY
•
ARMul_CP_CANT
•
表示协处理器操作已完成
表示协处理器正忙
表示指令不受支持或无法访问指定的寄存器
因此协处
4-20 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
4.4.6 MCRR
ARMulator 参考
识别协处理器的
如果出现以下情况 函数必须返回
指令时将调用此函数
MCRR
ARMul_CP_CANT
• 请求的协处理器寄存器不存在
• 请求的协处理器寄存器无法写入
• 协处理器的 ARM 架构是 v4T 或更早设计
Ꭻ
unsigned MCRR(void *handle , int type, ARMword instr, ARMword *data)
其中
handle
type
instr
data
是
ARMulif_InstallCoprocessorV5
是协处理器访问的类型 它可以是以下各项之一
ARMul_CP_FIRST
ARMul_CP_BUSY
ARMul_CP_INTERRUPT
表示首次调用该指令的协处理器模型
表示这是第一个调用忙等待之后的随后的调用
警告协处理器 ARM 即将处理中断
理器必须放弃当前指令
试指令
ARMul_CP_DATA
表示有效数据包含在
是当前操作码
是转移至协处理器的数据的指针
的句柄
此时
将被重设为
type
data
系统通常会在稍后重
ARMul_CP_FIRST
中
因此协处
ૄ
此函数必须返回以下其中一个值
•
ARMul_CP_DONE
ARMul_CP_BUSY
•
ARMul_CP_CANT
•
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
表示协处理器操作已完成
表示协处理器正忙
表示指令不受支持或无法访问指定的寄存器
版权所有
4-21
ARMulator 参考
4.4.7 MRRC
识别协处理器的
如果出现以下情况 函数必须返回
指令时将调用此函数
MRRC
ARMul_CP_CANT
• 请求的协处理器寄存器不存在
• 请求的协处理器无法读取
• 协处理器的 ARM 架构是 v4T 或更早设计
Ꭻ
unsigned MRRC(void *handle , int type, ARMword instr, ARMword *data)
其中
handle
type
instr
data
是
ARMulif_InstallCoprocessorV5
是协处理器访问的类型 它可以是以下各项之一
ARMul_CP_FIRST
ARMul_CP_BUSY
ARMul_CP_INTERRUPT
表示首次调用该指令的协处理器模型
表示这是第一个调用忙等待之后的随后的调用
警告协处理器 ARM 即将处理中断
理器必须放弃当前指令
试指令
ARMul_CP_DATA
表示有效数据包含在
是当前操作码
是从协处理器转移的数据的指针
的句柄
此时
将被重设为
type
data
系统通常会在稍后重
ARMul_CP_FIRST
中
因此协处
ૄ
此函数必须返回以下其中一个值
•
ARMul_CP_DONE
ARMul_CP_BUSY
•
ARMul_CP_CANT
•
4-22 Copyright © 2002, 2003 ARM Limited
表示协处理器操作已完成
表示协处理器正忙
表示指令不受支持或无法访问指定的寄存器
版权所有
ARM DUI 0207ASC-00
4.4.8 CDP
ARMulator 参考
识别协处理器的
则函数必须返回
指令时将调用此函数
CDP
ARMul_CP_CANT
如果请求的协处理器操作不受支持
Ꭻ
unsigned CDP(void *handle , int type, ARMword instr, ARMword *data)
其中
handle
type
instr
data
是
ARMulif_InstallCoprocessorV5
是协处理器访问的类型 它可以是以下各项之一
ARMul_CP_FIRST
ARMul_CP_BUSY
ARMul_CP_INTERRUPT
表示首次调用该指令的协处理器模型
表示这是第一个调用忙等待之后的随后的调用
警告协处理器 ARM 即将处理中断
理器必须放弃当前指令
试指令
是当前操作码
未使用
的句柄
此时
将被重设为
type
系统通常会在稍后重
ARMul_CP_FIRST
ૄ
此函数必须返回以下其中一个值
•
ARMul_CP_DONE
ARMul_CP_BUSY
•
ARMul_CP_CANT
•
表示协处理器操作已完成
表示协处理器正忙
表示指令不受支持
因此协处
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
4-23
ARMulator 参考
4.4.9 read
此函数使 RDI 1.5.1 可兼容调试器可以通过 RDI 读协处理器寄存器
编号为
的协处理器寄存器
reg
并将其值转移至由
寻址的位置
value
此函数可读
如果请求的协处理器寄存器不存在或无法读取寄存器 则函数必须返回
ARMul_CP_CANT
Ꭻ
unsigned read(void *handle , int reg, ARMword instr, ARMword *value)
其中
handle
reg
instr
value
是
ARMulif_InstallCoprocessorV5
是要被读取的协处理器寄存器的记录编号
未使用
是要从协处理器读取的数据位置的指针
的句柄
ૄ
此函数必须返回以下其中一个值
•
ARMul_CP_DONE
ARMul_CP_CANT
•
表示协处理器操作已完成
表示寄存器不受支持
此函数由调试器通过 RDI 调用
4-24 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
4.4.10 write
ARMulator 参考
此函数使 RDI 1.5.1 可兼容调试器可以通过 RDI 写入协处理器寄存器
函数可将
如果请求的协处理器不存在或无法写入寄存器 则函数必须返回
寻址的位置的值写入编号为
value
的协处理器寄存器
reg
ARMul_CP_CANT
Ꭻ
unsigned write(void *handle , int reg, ARMword instr, ARMword *value)
其中
handle
reg
instr
value
是
ARMulif_InstallCoprocessorV5
是要被写入的协处理器寄存器的记录编号
未使用
是要写入协处理器的数据位置的指针
的句柄
ૄ
此函数必须返回以下其中一个值
•
ARMul_CP_DONE
ARMul_CP_CANT
•
表示协处理器操作已完成
表示寄存器不受支持
此函数由调试器通过 RDI 调用
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
4-25
ARMulator 参考
4.5
ፊޟ
以下函数可启用模型以便设置或清除信号
• ARMulif_SetSignal
• 第 4-27 页 ARMulif_GetProperty
4.5.1 ARMulif_SetSignal
ARMulif_SetSignal
Ꭻ
void ARMulif_SetSignal(RDI_ModuleDesc *mdesc, ARMSignalType sigType ,
SignalState sigState )
其中
mdesc
sigtype
函数用于设置信号状态或属性
是内核的句柄
是要设置的信号
RDIPropID_ARMSignal_IRQ
sigtype
可以是以下其中之一
表明中断
RDIPropID_ARMSignal_FIQ
表明快速中断
RDIPropID_ARMSignal_RESET
表明重设的信号 内核将会重设 并在取消表明重设信
号之前不会重新启动
RDIPropID_ARMSignal_BigEnd
设置此信号以进行大端操作 或清除此信号以进行小端
操作
RDIPropID_ARMSignal_HighException
设置异常向量的基址
RDIPropID_ARMSignal_BranchPredictEnable
仅适用于 ARM10
RDIPropID_ARMSignal_LDRSetTBITDisable
仅适用于 ARM10
RDIPropID_ARMSignal_WaitForInterrupt
仅适用于 ARM10 和 XScale
RDIPropID_ARMSignal_DebugState
进入或退出调试状态
4-26 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
RDIPropID_ARMulProp_CycleDelta
等待内核指定数量的周期
RDIPropID_ARMulProp_Accuracy
选择建模精度 以百分比表示的范围为 0% 至 100% 目
前仅影响 ARM10 模型
模
互锁建模关闭时
周期计数的精确度会降低
ARMulator 参考
小于 50% 的设置将关闭互锁建
ARMulator 的运行速度更快
但
sigstate
有关使用中断控制器时的信号中断说明
4.5.2 ARMulif_GetProperty
ARMulif_GetProperty
Ꭻ
void ARMulif_GetProperty(RDI_ModuleDesc *mdesc , ARMSignalType id ,
ARMword *value )
其中
mdesc
id
对于信号 您必须为
FALSE
TRUE
信号关闭
信号打开
对于属性 您必须为
sigstate
sigstate
ᓖ
函数用于读取属性和信号的值
是内核的句柄
是要读取的信号或属性
RDIPropID_ARMSignal_IRQ
如果表明中断信号的话
TRUE
RDIPropID_ARMSignal_FIQ
如果表明快速中断信号的话
TRUE
RDIPropID_ARMSignal_RESET
如果表明重设信号的话
TRUE
RDIPropID_ARMSignal_BigEnd
如果表明大端信号的话
TRUE
RDIPropID_ARMSignal_HighException
如果向量表处于
TRUE
指定以下其中一个值
指定一个整数值
请参阅第 4-74 页
可以是以下任何一个
id
0xFFFF0000
中断控制器
的话
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
4-27
ARMulator 参考
RDIPropID_ARMSignal_BranchPredictEnable
仅适用于 ARM10
RDIPropID_ARMSignal_LDRSetTBITDisable
仅适用于 ARM10
RDIPropID_ARMSignal_WaitForInterrupt
仅适用于 ARM10 和 XScale
RDIPropID_ARMulProp_CycleCount
计算初始化后所执行的周期数量
RDIPropID_ARMulProp_RDILog
RDI 记录层的当前设置
通常在禁用记录时为零 在启
用记录时非零
RDIPropID_ARMSignal_ProcessorProperties
与所模拟的处理器相关的属性字 这是属性的位域 在
armdefs.h
中定义
value
是写入属性的块的指针 允许属性超过 32 位 但是 所有列出的
属性实际上最多只有 32 位宽
4-28 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
ARMulator 参考
4.6
ူୈ
ARMulator 具有传播和处理事件的机制
对
核心 ARMulator 可生成一些事件实例 在
下几组
• 来自 ARM 处理器内核的事件
• 来自 MMU 和高速缓存
• 来自预取单元的事件
• 配置更改事件
如果启用跟踪并打开跟踪事件 则这些事件可以记录在跟踪文件中 其它模块
可以提供按同样方式处理的新事件类型
UserEvent_Base (0x100000
您可以通过安装事件处理程序来捕获事件 请参阅第 4-37 页
您可以通过调用
ARMulif_RaiseEvent
ူୈ ᔊ
这些事件包括一个事件编号和一个字
编号用于标识事件 详细信息视事件而定
armdefs.h
在第 4-30 页表 4-2 中列示
不是在 StrongARM-110 上 的事件 在表 4-1 中
列示
只适用于基于 ARM8 的处理器 在第 4-30 页
表 4-3 中列示
在第 4-31 页表 4-5 中列示
用户定义的事件必须具有介于
) 和
UserEvent_Top (0x1FFFFF
ARMulif_RaiseEvent()
ܭ
4-1 ᔈ MMU
1
来生成事件
Ⴅદࡀ ݙᏴ
ᔊ
2
中定义
这些事件可分为以
) 之间的值
事件处理程序
请参阅第 4-32 页
StrongARM-110
ࡼူୈ
ူୈܠ
MMUEvent_DLineFetch
MMUEvent_ILineFetch
MMUEvent_WBStall
MMUEvent_DTLBWalk
MMUEvent_ITLBWalk
MMUEvent_LineWB
MMUEvent_DCacheStall
MMUEvent_ICacheStall
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
丢失地址 受影响的地址
丢失地址 受影响的地址
写物理地址 写缓冲内的字数
丢失地址 受影响的地址
丢失地址 受影响的地址
丢失地址 受影响的地址
导致停止的地址 获取的地址
导致停止的地址 获取的地址
版权所有
0x10001
0x10002
0x10003
0x10004
0x10005
0x10006
0x10007
0x10008
4-29
ARMulator 参考
ူୈ ᔊ
CoreEvent_Reset
CoreEvent_UndefinedInstr
CoreEvent_SWI
CoreEvent_PrefetchAbort
CoreEvent_DataAbort
CoreEvent_AddrExceptn
CoreEvent_IRQ
CoreEvent_FIQ
CoreEvent_Breakpoint
CoreEvent_Watchpoint
CoreEvent_IRQSpotted
CoreEvent_FIQSpotted
CoreEvent_ModeChange
CoreEvent_Dependency
--
pc 值指 令
pc 值 SWI 编号
pc 值
pc 值 中止的地址
pc 值 中止的地址
pc 值
pc 值
pc 值
pc 值 观察地址
pc 值
pc 值
pc 值 新模式
pc 值 互锁寄存器位掩码
ܭ
4-2 ᔈ ARM
1
ᔊ
2
-
-
-
RDI_PointHandle
-
-
ࠀಯดࡼူୈ
ူୈܠ
0x1
0x2
0x3
0x4
0x5
0x6
0x7
0x8
0x9
0xA
0x17
0x18
0x19
0x20
ܭ
4-3
ူୈ ᔊ
PUEvent_Full
PUEvent_Mispredict
PUEvent_Empty
4-30 Copyright © 2002, 2003 ARM Limited
1
下一个 pc 值
分支的地址
下一个 pc 值
ᔈᎾནᏄࡼူୈ ᒑး᎖
版权所有
ᔊ
-
-
-
2
ူୈܠ
0x20001
0x20002
0x20003
ARM DUI 0207ASC-00
ARM810
ARMulator 参考
ܭ
ࢯ၂ူୈ
4-4
ူୈ ᔊ
DebugEvent_InToDebug
DebugEvent_OutOfDebug
DebugEvent_DebuggerChangedPC
--
--
pc -
ူୈ ᔊ
ConfigEvent_AllLoaded
ConfigEvent_Reset
ConfigEvent_VectorsLoaded
ConfigEvent_EndiannessChanged
--
--
--
1 大端
或
2 小端
1
1
ᔊ
ᔊ
2
2
-
ူୈܠ
0x40001
0x40002
0x40003
ܭ
4-5
ူୈܠ
0x50001
0x50002
0x50003
0x50005
ᒙူୈ
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
4-31
ARMulator 参考
4.6.1 ARMulif_RaiseEvent
此函数可调用事件
事件被传送至用户提供的事件处理程序
Ꭻ
void ARMulif_RaiseEvent(RDI_ModuleDesc *mdesc, ARMword event ,
ARMword data1 , ARMword data2 )
其中
mdesc
event
是内核的句柄
是在第 4-29 页表 4-1 第 4-30 页表 4-2 第 4-30 页表 4-3 或
第 4-31 页表 4-4 中定义的其中一个事件编号
data1
data2
是事件的第一个字
是事件的第二个字
4-32 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
ARMulator 参考
4.7
ࠀಯ߈ኔ
ARMulator 可用于在某些状态值更改时回调模型
您可以通过安装相关的 event
handler 来进行此操作
如果您要将其用于自己的模型中 则必须提供事件处理程序的执行说明 有关
信息
请参阅 ARM 作为实例提供的模型中的执行说明
您可以将事件处理程序用于避免在每次访问时检查状态值 例如 外围设备模
型预期将显示 ARM 内核
的数据
参见第 4-37 页
外围设备模型可以连接至
事件处理程序
以及 ARM 处理器ࡍ࣡ 信号值的以正确字节顺序排列
EventHandler()
以便在信号更改时得到通知
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
4-33
ARMulator 参考
4.7.1
ፊޟࠀಯ߈ኔ
只要 ARM 处理器出现异常
系统均会调用此事件处理程序
Ꭻ
typedef unsigned GenericCallbackFunc( void *handle , void *data )
其中
handle
data
是传送至
必须造型为 (
((ARMul_Event *)data)->event
ARMulif_InstallExceptionHandler
ARMul_Event *
) 并包含
的句柄
是导致异常的核心事件 请参阅第 4-30 页表 4-2
((ARMul_Event *)data)->data1
是异常的硬件向量地址
((ARMul_Event *)data)->data2
是导致异常的指令
作为实例
非零值
可由操作系统模型用于截取和模拟 SWI 如果安装的处理程序返回
则 ARM 不会产生异常 异常被忽略
ᓖ
如果处理器处于 Thumb 状态
则会提供效果等同的 ARM 指令
要安装异常处理程序 可使用
int ARMulif_InstallExceptionHandler(RDI_ModuleDesc *mdesc ,
GenericCallbackFunc *func , void *handle )
要删除异常处理程序 可使用
int ARMulif_RemoveExceptionHandler(RDI_ModuleDesc *mdesc ,
GenericCallbackFunc *func , void *handle )
4-34 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
ARMulator 参考
4.7.2
ᆚᒀࡼ
ቧᇦࠀಯ߈ኔ
RDI
如果 ARMulator 自己无法处理
它将返回
模型使用
RDIError
例如配置器模块 在
此函数可由扩展 ARMulator 和调试器之间的 RDI 接口的
值
RDI_InfoProc
profiler.c
请求
则会调用未知的 RDI 信息函数
可提供
中
Ꭻ
typedef int RDI_InfoProc(void *handle , unsigned type,
ARMword *arg1 , ARMword *arg2 )
其中
handle
type
是传送至
是
RDI_InfoProc
ARMulif_InstallUnkRDIInfoHandler
子代码
它们在
rdi_info.h
参阅下面的内容
arg1/arg2
是从 ARMulator 传送至处理程序的变量
如果返回一个值而不是
RDI_InfoProc()
函数
以下代码是可以指定为
RDIInfo_Target
RDIError_UnimplementedMessage
type
的
RDI_InfoProc
子代码实例
RDIProfile
信息调用
的句柄
中定义
有关实例 请
ARMulator 可停止调用
可使模型声明如何扩展目标功能 例如
以设置
RDIInfo_SetLog
RDITarget_CanProfile
可环绕传送 以便模型在打开和关闭记录信息之间切换 例如
tracer.c
Debugger 中的
可使用此调用从 RDI 记录层值
@mdebug_rdi_log
关闭跟踪功能
RDIRequestCyclesDesc
可使模型扩展由
提供的计数器列表
4-41 页
RDICycles
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
通用函数
RDI 信息调用
$statistics
模型调用
以依次声明每个计数器 同时模型也可以诱捕
profiler.c
可截取此调用
标记
$rdi_log
或 RealView
或调试器的相当值 的位 4 打开和
中的调试器或调试器中的相当值
ARMul_AddCounterDesc()
这一点很重要
版权所有
请参阅第
4-35
ARMulator 参考
RDICycles
通过捕获
须对
RDIRequestCyclesDesc
RDICycles
作出响应
每个计数器依次调用
ARMul_AddCounterValue()
来声明统计计数器的模型同时还必
其方式是按其被声明时的相同顺序 为
请参阅第 4-41 页
通
用函数
以上 RDI 信息调用已由 ARMulator 处理 并仅传送用于信息或以便模型可以将
信息添加至回复
消息
以便消息即使在模型已作出响应的情况下也可以被传递
模型必须始终响应这些具有
RDIError_UnimplementedMessage
的
要安装处理程序 可使用
int ARMulif_InstallUnkRDIInfoHandler(RDI_ModuleDesc *mdesc ,
RDI_InfoProc *func , void *handle )
要删除处理程序 可使用
int ARMulif_RemoveUnkRDIInfoHandler(RDI_ModuleDesc *mdesc ,
RDI_InfoProc *func , void *handle )
ဣಿ
随 ARMulator 提供的
RDIErrorP
RDISet_Cmdline
RDIVector_Catch
可将在 ARMulator 下运行的程序所生成的错误返回至调试器
查找调试器为程序设置的命令行
截取硬件向量
semihost.c
模型使用
UnkRDIInfoUpcall()
与调试器进行交互
4-36 Copyright © 2002, 2003 ARM Limited
版权所有
ARM DUI 0207ASC-00
ARMulator 参考
4.7.3
ူୈࠀಯ߈ኔ
此处理程序可捕获 ARMulator 事件
请参阅第 4-29 页
事件
Ꭻ
typedef unsigned GenericCallbackFunc( void *handle , void *data )
其中
handle
data
是传送至
必须传递为 (
((ARMul_Event *)data)->event
ARMulif_InstallEventHandler
ARMul_Event *
) 并包含
的句柄
是在第 4-29 页表 4-1 第 4-30 页表 4-2 和第 4-30 页表 4-3
中定义的其中一个事件编号
((ARMul_Event *)data)->addr1
是事件的第一个字
((ARMul_Event *)data)->addr2
是事件的第二个字
要安装处理程序
可使用
void *ARMulif_InstallEventHandler(RDI_ModuleDesc *mdesc , uint32 events ,
GenericCallbackFunc *func , void *handle )
为
•
•
•
•
•
•
指定以下一个或更多个函数
events
CoreEventSel
MMUEventSel
PUEventSel
DebugEventSel
TraceEventSel
ConfigEventSel
要删除处理程序 可使用
int ARMulif_RemoveEventHandler(RDI_ModuleDesc *mdesc , void *node )
ࠀಯ߈ኔڔᓤဣಿ
ARMulif_InstallEventHandler(mdesc , CoreEventSel | ConfigEventSel, func , handle )
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
4-37
ARMulator 参考
4.8
4.8.1
ࡀᆰၫ
存储器系统可由外围设备模型使用一系列读写存储器的函数进行探测 这些函
数均可在总线上不加插额外周期的情况下访问存储器
加插周期
器模型之间
无法判断这些调用是否会导致数据出错
࠭ᒎࢾࡼᒍࣗན
以下函数可在特定的地址返回字
额外周期的情况下访问存储器
Ꭻ
ARMword ARMulif_ReadWord(RDIModuleDesc *mdesc , ARMword address )
ARMword ARMulif_ReadHalfword(RDIModuleDesc *mdesc , ARMword address )
ARMword ARMulif_ReadByte(RDIModuleDesc *mdesc , ARMword address )
其中
mdesc
如果您的模型在总线上
则必须将其自身作为存储器模型安装 可能安装在内核和实际存储
ᓖ
半字或字节 每个函数均可在总线上不加插
是内核的句柄
address
是从其中读取字 半字或字节的模拟存储器中的地址
ૄ
此函数可返回适当的字
4-38 Copyright © 2002, 2003 ARM Limited
半字或字节
版权所有
ARM DUI 0207ASC-00
ARMulator 参考
4.8.2
ቖྜྷᒎࢾࡼᒍ
以下函数可在指定的地址写入特定的字
不加插额外周期的情况下访问存储器
Ꭻ
void ARMulif_WriteWord(RDIModuleDesc *mdesc , ARMword address , ARMword data )
void ARMulif_WriteHalfword(RDIModuleDesc *mdesc , ARMword address , ARMword data )
void ARMulif_WriteByte(RDIModuleDesc *mdesc , ARMword address , ARMword data )
其中
mdesc
address
data
半字或字节 每个函数均可在总线上
是内核的句柄
是要写入其中的模拟存储器中地址
是要写的字或字节
ARM DUI 0207ASC-00 Copyright © 2002, 2003 ARM Limited
版权所有
4-39
ARMulator 参考
4.9
ူୈࢯࣞၫ
以下函数可使您调度或删除事件
• ARMulif_ScheduleTimedFunction
• ARMulif_DescheduleTimedFunction
4.9.1 ARMulif_ScheduleTimedFunction
此函数可使用存储器系统周期调度事件
Ꭻ
void *ARMulif_ScheduleTimedFunction(RDI_ModuleDesc *mdesc,
ARMul_TimedCallback *tcb )
其中
mdesc
tcb
是内核的句柄
是供您从基于指定存储器周期的事件发生时删除函数使用的句柄
ᓖ
只能在指定周期之后的第一个指令边界上调用此函数
4.9.2 ARMulif_DescheduleTimedFunction
它可以在将来指定的周期号上调用函数
ARMul_DescheduleTimedFunction()
可删除基于预定的存储器周期的事件
Ꭻ
unsigned ARMulif_DescheduleTimedFunction(RDI_ModuleDesc *mdesc , void *tcb );
其中
mdesc
tcb
4-40 Copyright © 2002, 2003 ARM Limited
是内核的句柄
是
ARMulif_ScheduleTimedFunction
在首次安装事件时提供的句柄
版权所有
ARM DUI 0207ASC-00