arm中swiarm 异常向量表和irq的区别

|正在执行的指令的地址|0x120 &如果此时发生中断了
& & PC-4 & & & &--------------->|真正的中断返回点地址|0x124
& & PC & & & & &---------------->|取指令的地址 & & & |0x128 & & &
通过上述分析可以得出:真正的中断返回点地址是0X124,真正应该存入LR的地址是0X124.但是实际情况是:0X128 ?????
分析:ARM 总是执行完当前的指令才会处理其他事情,问题就出在这里,当ARM执行完当前的指令的时候PC已经更新了,如下
&PC = PC+4;PC = 0X128+4 = 0X12C,存放到LR=PC-4; LR = 0X12C-4=0X128;这个0X128不是真正的中断函数的返回点。真正的函数返回点是0X124.怎么办????&
在给PC恢复数值是进行这样的处理下:LR = LR-4,PC=LR. & ==>SUBS PC,LR,#4. &并且自动恢复CPSR=SPSR_irq
SWI问题分析
& & 软中断和一般的中断处理流程有不同的地方:CPU在执行指令时候,遇见一般的中断,先要执行完当前的指令,更新PC,然后把LR=PC-4.SPSR_irq=CPSR.CPSR=XXX.进入IRQ中断处理过程。真正的断点返回地址是:LR-4。在返回时需要进行地址的调整。 ==>SUBS PC,LR,#4.并且自动恢复CPSR=SPSR_irq。
& &swi软中断还是很特别的玩意,软中断发生的时候,CPU切换到SVC工作模式,PC的数值不进行更新,即:不是等到把当前的指令执行完毕之后在执行其他的处理。而是立刻处理。CPU立即把软中断的返回地址写入LR中。LR=PC-4,这是真正的返回地址,PC的数据不更新。!!!!。SWI中断返回地址不需要调整就是正确的地址。
& &然后就是软中断编号的计算,方法:发生软中断时那条指令地址里面数据的低24位放的就是软中断标号,从中取出来放到R0里面,R0是函数的第一个参数,也是存放函数返回结果的地方。
& &HandlerSWI
& & STMFD SP!,{R0-R3,R12,LR},LR存放的是swi真正的软中断要返回的中断地址点。
& & LDR & R0,[LR,#-4];找到到底在哪一条指令时发生了软中断,很明显:就是LR真正断点返回地址的上面一条地址。LR-4或者PC-8。找个这个指令的地址,取出其中的内容。软中断的编号就是存放在发生软中断那条指令地址的低24位数据里面。
& & BIC &R0,R0,#0xFF00'0000,低24位是软中断号
& & BL &my_swi_
& & LDMFD SP! ,{R0-R3,R12,PC}^,其中^表示CPSR=SPSR_svc.只能手动恢复。
&extern void my_swi_handler(unsigned int num);
& & & __swi(0x1)_one(void);
& & &__swi(0x2)led_two(void);
& &led_one();
&delay(100ms);
led_two();
void my_swi_handler(unsigned int num)
& & & case 0x1:{ do_some_thing}
& & & case 0x2:{do_another_thing}
& & & default: & &
关键字:&&&&&&&&
编辑:什么鱼 引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
微信扫一扫加关注 论坛活动 E手掌握
微信扫一扫加关注
芯片资讯 锐利解读
大学堂最新课程
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源
热门资源推荐
频道白皮书
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。捷配欢迎您!
微信扫一扫关注我们
当前位置:&>>&&>>&&>>&ARM内核之中断技术篇
  1 ARM7TDMI
&&& 谈及ARM7TDMI就有必要先了解一下有关于它的其它知识:
&&& ARM( RISC Machines)是行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点。适用于多种领域,比如嵌入控制、消费/教育类多媒体、和移动式应用等。
&&& ARM公司是苹果、Acorn、、等公司的合资企业。ARM将其技术授权给世界上许多著名的半导体、软件和OEM厂商,每个厂商得到的ARM公司(6张)都是一套独一无二的ARM相关技术及服务。利用这种合伙关系,ARM很快成为许多全球性RISC标准的缔造者。
&&& 目前,采用 ARM技术知识产权( IP )核的微处理器,即我们通常所说的 ARM 微处理器,已遍及工业控制、消费类产品、通信系统、网络系统、无线系统等各类产品市场,基于 ARM 技术的微处理器应用约占据了 32 位 RISC 微处理器 75 %以上的市场份额, ARM 技术正在逐步渗入到我们生活的各个方面。
&&& ARM7系列处理器是英国ARM公司设计的主流嵌入式处理器,内核是0.9MIPS/MHz的三级流水线和冯?诺伊曼结构;ARM7TDMI是一款经典的通用32位微处理器,采用精简指令系统(RISC)和流水线结构。典型应用如GPS、PDA、双向寻呼机、移动电话、板卡间高速通信等。
  ARM7TDMI定义有7种工作模式,本文涉及到的有:用户模式,程序正常运行时的模式;快中断模式,处理器响应快中断而进入的模式;中断模式,处理响应常规中断而进入的模式;监督模式,操作系统的保护模式。处理器响应软件中断时即进入监督模式。下面重点介绍ARM7TDMI的中断特性。主要特性如表1所列。
  表1 中断特性表
常规则中断
  ARM7TDMI具有常规中断(IRQ)、快中断(FIQ)和软件中断( Interrupt)三种中方式。常规中断和快中断都是硬件中断。
&&& 快中断
  快中断是为支持数据传输或快速数据通道而设计的,为快速处理快中断。
&&& ①快中断被设为最高中断优先级;
&&& ②在快中断模式增设了7个私有工作寄存器,从而避免了由于主工作寄存器数据的保存和恢复而带来了额外开销;
&&& ③快中断处理程序处于异常向量表的最后位置,因此可紧接异常向量表书写快中断处理程序,而不必进行程序跳转操作,避免了刷新指令流水线和高速缓存。
&&& 软件中断 
&  编程异常通常叫做软中断,软中断是通讯进程之间用来模拟硬中断的 一种信号通讯方式,中断源发中断请求或软中断信号后,CPU或接收进程在适当的时机自动进行中断处理或完成软中断信号对应的功能,软中断是软件实现的中断,也就是程序运行时其他程序对它的中断;而硬中断是硬件实现的中断,是程序运行时设备对它的中断。
  ①软中断发生的时间是由程序控制的,而硬中断发生的时间是随机的
  ②软中断是由程序调用发生的,而硬中断是由外设引发的
  ③硬件中断处理程序要确保它能快速地完成它的任务,这样程序执行时才不会等待较长时间
  2 响应中断和中断返回
  (1)当中断产生时,ARM7TDMI将执行的操作
  ①把当前程序状态寄存器(CPSR)的内容拷贝到相应的备份程序状态寄存器(SPSR)。当前工作模式、中断屏蔽位和状态标志被保存下来。
  ②转入相应的模式,并关闭常规中断。如响应快中断,则同时关闭快中断。
  ③把程序(pc)的值减4后,存入相应的连接寄存器(1r)。
  ④将程序指向相应的中断向量。
  (2)由中断返回时,ARM7TDMI将完成的操作
  ①将备份程序状态寄存器的内容拷贝到当前程序状态寄存器,恢复中断前的状态。
  ②清除相应禁止中断位(如果已设置的话)。
  ③把连接寄存器的值拷贝到程序计数器,继续运行原程序。
  (3)返回地址的计算
  ARM7TDMI采用流水线结构:当一条指令被执行时,下一条指令正被译码,而第三条指令被从中取出。当程序计数器未更新的,pc指向从中取出的指令,(pc-4)指向当前指令的一条指令。处理器响应软件中断时,由于软件中断由指令自身产生,程序计数器还没有更新,(pc-4)正好指向当前指令的下一条指令。因此,只要在中断处理程序最后加入MOVS pc,lr把连接寄存器的值赋给程序计数器即可。ARM7TDMI总是在一条指令执行完毕后,才去检查是否有硬件中断信号和中断屏蔽状态。此时,程序计数器已经更新,(pc-4)指向当前指令的下两条指令。因此要先把连接寄存器的内容减去4(指向pc-8)后,再赋给程序计数器。要添加的代码是SUBS pc,lr #4
  3 中断处理程序的编写
  (1)软件中断处理程序的编写
  软件中断指令的格式如图1所示。低24位立即数为软件中断号。在中断处理程序中,必须首先得到软件中断号,然后根据中断号执行不同代码。以下的中断处理程序,在软件中断号为1时,将端口A的0号引脚置“1”。
  STMFD sp!,{r0-r12,lr} //保存各工作寄存器
  LDR r0,{lr,#-4} //得到该软件中断指令
  BIC r0,r0,#0xff000000 //从中取出中断号
  ADR r2,SWIJumpTable //r2指向代码入口表
  LDR pc,[r2,r0,LSL #2] //把r0中的值乘4后加到r2。将//程序计数器指向中断号对应的代码入口地址
  SWIJumpTable //代码入口表
  DCD SWInum0
  DCD SWInum1
  SWInum0 //中断号为0时的处理代码(略)
  SWInum1 //中断号为1时的处理代码
  MOV r0,#0x //r0指向端口A
  STRB r0,#0x01 //A口0脚置“1”
  B EndofSWI //跳转
  EndofSWI
  LDMFD sp! {r0-r12,pc} //恢复各寄存器,返回原程序
  (2)常规中断处理程序的编写
  为快速执行,常规中断处理程序一般用汇编指令编写。在编写可重入常规中断处理程序(运行时仍可响应常规中断)时,必须先把链接寄存器和程序用到的工作寄存器入栈,然后才能开放中断;各寄存器出栈前,必须先关闭中断。这样可防止因寄存器崩溃而无法返回的情况发生。下文介绍了一个与中控制器相配置的可重入的常规中断处理程序。当若干中断源同时有效时,中断控制器(基址为IntBase)把16个中断源中优先级最高的一个存入中断寄存器(偏移地址为IntLevel)中,并发出硬件中断信号。
  SUB lr,lr,#4 //得至并保存返回地址
  STMFD sp!,{lr}
  MRS r14,SPSR //把SPSR和sl2入栈
  STMFD sp!,{r12,r14}
  MOV r12,#IntBase
  LDR r12,[r12,#IntLevel] //将最高优先级号存入r12
  MRS r14,CPSR. //开中断
  BIC r14,r14,#0x80
  MSR CPSR_c,r14
  LDR PC,[PC,r12,LSL #2] //将pc指向该优先级号对应的处理代码入口
  NOP //补位
  DCD Priority0Handler //代码入口表
  DCD Priority 1 Handler
  DCD Priority 2 Handler
  Priority0Handler //0优先级中断处理代码
  STMFD sp!,{r0-r11} //保存工作寄存器
  ……(略) //具体代码
  LDMFD sp!,{r0-r11} //恢复工作寄存器
  MRS r12,CPSR //关中断
  ORR r12,r12,#0x80
  MSR CPSR_c,r12
  LDMFD sp!,{r12,r14} //恢复r12
  MSR SPSR_csxf,r14 //恢复备用程序状态寄存器(SPSR)
  LDMFD sp!,{pc}^ //返回原程序
  Priority 1 Handler //优先级中断处理代码(略)
  (3)快中断处理程序的编写
  为保证高速处理,快中断处理程序必须要用汇编语言编写,而且必须是非重入的。一般快中断处理程序主要是些数据存取指令,就不具体介绍了。
  结束语
  中断技术是处理器和系统芯片开发的重要技术。快速、高效的中断处理程序是实时多任务系统设计成功的关键。&&来源:
技术资料出处:互联网
该文章仅供学习参考使用,版权归作者所有。
因本网站内容较多,未能及时联系上的作者,请按本网站显示的方式与我们联系。
【】【】【】【】
上一篇:下一篇:
本文已有(0)篇评论
发表技术资料评论,请使用文明用语
字符数不能超过255
暂且没有评论!
12345678910
暂且没有信息...
12345678910
模拟地/数字地以及模拟电源/数字电源只不过是相对的概念。提出这些概念的主要原因是数字电路对模拟电路的干扰已经到了不能容忍的地步。目前的标准处理办法如下:  1.地线从整流滤波后就分为2根,其中一根作为模拟地,所有模拟部分的电路地全部接到这个模拟地上面;另一根为数字地,所有数字...[][][][][][][][][][]
IC热门型号
IC现货型号
推荐电子百科keil&for&arm的中断服务子程序和SWI(软件中断)
ARM结构执行有各种操作模式:
用户模式:在执行startup.sCPU起始文件后的普通程序执行状态
系统模式:使用于一些操作系统的内核。
IRQ(中断)模式:用于产生普通中断句柄
FIQ(快速中断)模式:用于指定中断源的快速中断处理
监控模式:保护执行:在重起后通过SWI指令激活或进入
异常模式:&当数据或指令预取异常时进入该模式
未定义模式:&当一个未定义的指令被执行的时候进入该模式
操作模式是由软件或中断控制。IRQ、FIQ、监视、异常和未定义模式是由中断或特殊情况进入。当进入中断或操作模式时,startup.s
CPU配置文件执行由CPU调用的向量。
用C语法写的中断函数依靠开发工具的设置,有3种开发工具keil、GNU和ADS。
keil的开发工具提供了几个实现中断函数示例程序。
<img src="/blog7style/images/common/sg_trans.gif" real_src ="ms-its:E:/keil/ARM/HLP/gsa.chm::/note.gif" ALT="keil&for&arm的中断服务子程序和SWI(软件中断)"
TITLE="keil&for&arm的中断服务子程序和SWI(软件中断)" />&注意
某些器件包括一个矢量中断控制器(VIC)。当使用VIC时,中断向量子程序的代码有微笑的不同。
矢量中断控制器
一些功能强大的ARM微处理器拥有矢量中断控制器,它在处理多中断源的时候,可以充分地减少软件开销。
示例代码和中断控制器的种类如下:
ARM矢量控制器VIC
ATMEL高级中断控制器AIC
矢量中断函数
2种中断控制器(VIC
或AIC)的使用实际上是相同的。中断服务子程序的起始地址写在矢量中断控制器的外围寄存器中。器件的startup.s
CPU配置文件,通过使用矢量中断控制器,来对所处理中断函数执行正确的指令。
ARM 矢量中断控制器(VIC)
大多数器件(比如philips的LPC2000系列)使用标准的ARM中断控制器VIC,具有以下特点:
3组优先级,最多32个通道
可处理一个向量型FIQ+16个向量型IRQ+非向量式IRQ
可中断屏蔽
软件中断发生机制
ARM矢量中断控制器的示例代码(VIC)
用philips的LPC2129和keil CA ARM C编译器的定时器中断函数
/* Timer Counter 0 Interrupt executes each 10ms @ 60 MHz CPU Clock */
__irq void tc0 (void) {
timeval++;
// Clear interrupt flag
VICVectAddr = 0;
// Acknowledge Interrupt
/* Setup the Timer Counter 0 Interrupt */
void init_timer_interrupt (void) {
T0MR0 = 149999;
// 10mSec = 150.000-1 counts
T0MCR = 3;
// Interrupt and Reset on MR0
T0TCR = 1;
// Timer0 Enable
VICVectAddr0 = (unsigned long) tc0;
// set interrupt vector in 0
VICVectCntl0 = 0x20 | 4;
// use it for Timer 0 Interrupt
VICIntEnable = 0x;
// Enable Timer0 Interrupt
IRQ vector in Startup.s file.
PC, [PC, #-0x0FF0] Vector from VicVectAddr
<img src="/blog7style/images/common/sg_trans.gif" real_src ="ms-its:E:/keil/ARM/HLP/gsa.chm::/note.gif" ALT="keil&for&arm的中断服务子程序和SWI(软件中断)"
TITLE="keil&for&arm的中断服务子程序和SWI(软件中断)" /> Note
ADS开发工具是使用,在中断函数定义的语法上有一些不同
Keil 开发工具的中断功能
编译器允许用户为各种中断和操作模式写句柄子程序。C实时库包括预定义句柄子程序(在startup.s中调用),该子程序可以用以下的名字重写:
IRQ_Handler:&
对于标准的中断服务子程序
FIQ_Handler:&
对于快速中断服务子程序
void IRQ_Handler (void) __irq
// Clear interrupt flag
void FIQ_Handler (void) __fiq
EXTINT = 0x;
// Clear interrupt flag
<img src="/blog7style/images/common/sg_trans.gif" real_src ="ms-its:E:/keil/ARM/HLP/gsa.chm::/note.gif" ALT="keil&for&arm的中断服务子程序和SWI(软件中断)"
TITLE="keil&for&arm的中断服务子程序和SWI(软件中断)" /> Note
编译器执行关键字__irq&和 __fiq.
如果ARM CPU执行独立的寄存器,在FIQ模式中用__fiq
关键字,编译器不保存CPU的寄存器R8-12,
中断服务子程序
for an overview of the various interrupt
concepts.各种ARM的MCU提供不同的中断属性和中断系统,参考
开始&&中断来对中断的概念进行概览。
实时编译器提供关键字__irq
来让拥护定义标准(irq)和快速(fiq) 中断程序
__irq void IRQ_Handler (void)
/* 中断代码*/
对于没有中断向量的MCU来说(或对于FIQ中断功能的MCU),需要改变CPU起始代码
以下的C代码执行了一个空的FIQ_Handler:
__irq void FIQ_Handler (void) {
在起始代码中,以下用于调用该FIQ_Handler:
PC, Reset_Addr
PC, FIQ_A Instruction at FIQ Vector location
PRESERVE8 tell linker: stack alignment is 8-byte
FIQ_H use external FIQ_Handler
FIQ_H FIQ Entry point
软件中断句柄
软件中断SWI功能用于产生原子代码序列,该序列容易被IRQ中断的执行破坏。参考知识库文章
用RealView编译器工具你可以轻易的创建SWI功能。文件夹..\ARM\RV\Examples\SWI下有一个例子
一个由C定义的SWI程序如下:
int __swi(0) add (int i1, int i2);
// function prototype for calling from C
int __SWI_0
(int i1, int i2) {
// function implementation
return (i1 + i2);
文件SWI.S 定义了一个软件中断句柄.在本文件后面的表格包含了你的应用的SWI函数入口
__SWI_0 SWI 0 Function Entry
__SWI_1 SWI 1 Function Entry
__SWI_2 SWI 2 Function Entry
__SWI_3 SWI 3 Function Entry
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。arm IRQ中断之向量中断非向量中断_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
arm IRQ中断之向量中断非向量中断
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢当前位置: >>
Keil+uVision4+中文教程(文档)
ARM Development ToolsPage 1 of 2ARM 开发工具集Keil公司开发的ARM开发工具MDK(Microcontroller Development Kit),是 用来开发基于ARM核的系列微控制器的嵌入式应用程序。它适合不同层次的开 发者使用,包括专业的应用程序开发工程师和嵌入式软件开发的入门者。MDK 包含了工业标准的Keil C编译器、宏汇编器、调试器、实时内核等组件,支持所 有基于ARM的设备,能帮助工程师按照计划完成项目。Keil ARM开发工具集集成了很多有用的工具,如下图所示,正确的使用它 们,可以有助于快速完成项目开发。 Part Number Components ?Vision IDE RealView C/C++ Compiler RealView Macro Assembler RealView Utilities RTL-ARM Real-Time Library ?Vision Debugger GNU GCC1 注意 u ?Vision IDE集成开发环境和?Vision Debugger调试器可以创建和测试 应用程序,可以用GNU ARM ADS或者RealView的编译器来编译这些 应用程序; MDK-ARM是PK-ARM的一个超集; AARM汇编器、CARM C编译器、LARM连接器和OHARM目标文件 到十六进制的转换器仅包含在MDK-ARM开发工具集中。 MDKARM2,3 DB-ARMu u除了上表所列工具外,Keil 还提供以下工具:mk:@MSITStore:M:\Keil\ARM\Hlp\armtools.chm::/armtools.htm ARM Development ToolsPage 2 of 2? ?ULINK USB-JTAG Adapter 用于通过JTAG调试和烧写程序。 MCB2100 Evaluation Boards 用于测试基于Philips LPC2100系列设备的应用 程序。 MCB2103 Evaluation Boards用于测试基于Philips LPC2103系列设备的应用 程序。 MCB2130 Evaluation Boards 用于测试基于Philips LPC2130系列设备的应用 程序。 MCB2140 Evaluation Boards 用于测试基于Philips LPC2140系列设备的应用 程序。 MCB2300 Evaluation Boards 用于测试基于Philips LPCLPC2300系列设备的 应用程序。 MCBSTM32 Evaluation Boards用于测试基于STMicroelectronics STM32 系列 设备的应用程序。 MCBSTR7 Evaluation Boards 用于测试基于STMicroelectronics STR7系列设 备的应用程序。 MCBSTR730 Evaluation Boards 用于测试基于STMicroelectronics STR730系 列设备的应用程序。 MCBSTR9 Evaluation Boards 用于测试基于STMicroelectronics STR9系列设 备的应用程序。 RTL-ARM Real-Time Library 用于建立实时库。RTL-ARM 包含用于嵌入式 应用开发的Flash文件系统、TCP/IP协议栈。 Copyright (c) Keil - An ARM Company. All rights reserved.?????????mk:@MSITStore:M:\Keil\ARM\Hlp\armtools.chm::/armtools.htm GSARM: Getting Started User&#39;s GuidePage 1 of 9基于?Vision的RealView编译工具概 述本用户指南提供了有关RealView编译工具的说明,它是RealView 微控制器开发工具集的一部分。 本指南包括如下小节:? ? ?介绍 部分对RealView编译工具进行了概述。 嵌入式程序 给出了创建面向微控制器的应用程序所需的内容。 从 CARM移植 部分说明了如何将Keil CARM下的程序移植到RealView下。修订历史? ?2006.6: 第一版. 2007.7: 添加了non-volatile memory, at attribute,和 multiple memory regions。 Copyright (c) Keil - An ARM Company. All rights reserved.介绍此用户指南是RealView微控制器开发工具集的一部分,它介绍了如何使用RealView编译工具创建 高效的嵌入式程序。对以前使用过Keil CARM编译器的用户来说,它介绍如何将CARM应用程序移 植到RealView编译工具下。 RealView编译工具是ARM公司15年来深入研发的结果。RealView微控制器开发集(RealView Microcontroller Development Kit) 涵盖了如下RealView编译工具组件。在?Vision中的Project Workspace - Books页中可以看到有关这些产品的详细的PDF手册。 RealView 编译工具产品 C/C++ 编译器 C/C++运行时库 RogueWave C++ 标准模板库 Macro Assembler(宏汇编器) Linker/Locater(链接器/定位器) Library Manager (库管理) HEX File Creator (十六进制文件生成器) 用户手册 RV 编译器和库(RV_CC.PDF) RV 编译器和库 (RV_CC.PDF) RV 编译器和库 (RV_CC.PDF) RV 汇编器 (RV_ASM.PDF) RV 链接器/工具 (RV_Link.PDF) RV 链接器/工具 (RV_Link.PDF) RV 链接器/工具 (RV_Link.PDF)RealView编译工具被工业界认为是最能够充分发挥基于ARM体系结构处理器性能的编译器。编译 器能生成更小的代码映像,可帮助设计人员开发最紧凑的代码,这将大大降低产品成本。该编译 器能够生成面向32-bit ARM 和16-bit Thumb指令集的代码,并支持完全ISO标准的C和C++。 RealView 编译工具在减少程序代码和提高执行速度两个方面同时进行了优化。下图显示了在过去7 年内这两方面的改进。file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh... GSARM: Getting Started User&#39;s GuidePage 2 of 9RealView微控制器开发工具集有评估版(Evaluation Version)和完整版(Full Version)两个版本可 用。其中评估版的限制如下:? ? ?产生的应用程序ROM映像的大小被限制在16KB内。 链接器不能使用分散加载文件(scatter-loading description files)以进行复杂的存储设计。 代码/常量的基地址被限制为0xXXxXXx,其中XX为00, 01, ..., FF。因此,存储的开始地址必须类似为0x、 0x等。 不可能产生位置独立的代码或数据。 汇编器不产生列表文件。 不能将此评估版用作商业目的。? ? ?嵌入式程序使用 RealView微控制器开发工具集编写嵌入式程序是相对容易的,本节将介绍嵌入式应用开发所 需完成的工作:?启动代码 (Startup Code)是在应用程序的main函数被调用前进行一些初始化工作。此外,它还 为内存分配函数定义的栈空间及内存堆。 Retarget库文件 为硬件的I/O口配置C运行时库。 链接器配置( Linker Configuration) 定义的目标硬件的存储映像。?Vision可以自动生成工程 所需的链接配置文件。? ?此外,还要做如下几个指定的工作:? ?定位程序代码、常量或变量到指定的存储区。 中断服务程序可在直接使用__irq 关键字用C语言来写。启动代码中包含了所需的中断微量的 重定位。对一些设备和FIQ中断,需对启动代码进行调整。 向应用程序中添加软件中断处理(Software Interrupt Handler) ,它是应用程序中SWI函数的 入口地址。 定位变量到绝对地址。 使用non-vlatile存储区。?? ?file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh... GSARM: Getting Started User&#39;s GuidePage 3 of 9RealView 微控制器开发工具集针对不同的硬件平台提供了几个启动代码文件及例程,可以在如下 几个文件夹下后到这些文件: 文件夹 C:\KEIL\ARM\Startup C:\KEIL\ARM\Examples C:\KEIL\ARM\Boards 内容 基于RealView编译工具的启动代码文件. 基于RealView编译工具的通用例程. 基于RealView编译工具的板级例程.启动代码(startup code)启动代码用于初始化CPU以与硬件设计的配置相匹配,参阅开始使用ARM开发工具集用户指南, CPU启动代码 可以获取有关启动代码完成任务的详细信息。 不同系列的设备有不同的启动代码。文件夹\ARM\Startup 包含了基于 RealView编译工具的一些 启动代码,它被配置成适用于不同的硬件平台。当创建一个新的工程时,启动代码被自动地拷贝 到用于配置文件的工程文件夹下。 大多数启动文件为设备配置提供了符号定义,可以在 ?Vision的Project - Options - Asm - Define下 键入这些符号。 下面是常用的选项:? ? ? ?REMAP: 在某些设备上执行存储映射。 EXTMEM_MODE: 配置为从片外Flash ROM执行代码。 RAM_MODE: 配置为从RAM执行代码。 RAM_INTVEC: 执行重映射并拷贝中断向量。有关变量SET符号的详细说明及相关配置选项在启动代码文件中提供。 对由?Vision自动生成的链接器配置来说,要求启动代码本身位于Reset段内,且中断向量表位于标 号Reset_Handler (代表CPU重启地址)处。 例子 :: : AREA : : EXPORT Reset_H CPU Reset Handler (executed after CPU Interrupt) Reset_Handler Reset, CODE, READONLY注意?文件夹\ARM\Startup 下的所有启动代码都是按此方法配置。Retarget库文件RealView微控制器开发工具集带有一个预定义的retarget库文件,它是许多例程的一部分。 retarget 文件修改了底层的I/O 程序,并禁止了semi-hosting SWI 中断的使用。file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh... GSARM: Getting Started User&#39;s GuidePage 4 of 9在 ..\ARM\Startup 文件夹下提供了RETARGET.C模板文件,此模板文件实现了所需的字符I/O函 数的功能如printf和scanf。/******************************************************************************/ /* RETARGET.C: &#39;Retarget&#39; layer for target-dependent low level functions */ /******************************************************************************/ #include &stdio.h& #include &time.h& #include &rt_misc.h& #pragma import(__use_no_semihosting_swi) #include &lpc21xx.h& // disable semihosting // device specific header file/* Send a character via a UART channel */ int sendchar (int ch) { // implementation depends on the microcontroller hardware if (ch == &#39;\n&#39;) { while (!(U1LSR & 0x20)); U1THR = CR; /* output CR */ } while (!(U1LSR & 0x20)); return (U1THR = ch); }/* Get a character via a UART channel */ int getkey (void) { // implementation depends on the microcontroller hardware while (!(U1LSR & 0x01)); return (U1RBR); }struct __FILE { /* Add whatever you need here */ }; FILE __ FILE __// simplified fputc version that only redirects STDOUT int fputc(int ch, FILE *f) { // redirect STDOUT return (sendchar(ch)); }// simplified fgetc version that only redirects STDIN int fgetc(FILE *f) { // redirect STDIN return (sendchar(getkey())); }int ferror(FILE *f) { /* Your implementation of ferror */ return EOF; }void _ttywrch(int ch) { sendchar (ch); }file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh... GSARM: Getting Started User&#39;s GuidePage 5 of 9void _sys_exit(int return_code) { while (1); /* endless loop */ }注意:?更多有关retarge库文件的知识在RV Compiler and Library User&#39;s Guide, The C and C++ Libraries, Tailoring the C library to a new execution environment下提供。链接器配置使用Project - Options for Target - Target 对话框可以指定嵌入式系统的所有可用的存储域。 当使能Project - Options for Target - Linker下的Use Memory Layout from Target Dialog时, ?Vision会自动生成分散加载描述文件(scatter-loading description files )。使能存储器为Read/Only 和Read/Write,它作为应用中的默认存储域。只要不用Options Properties对话框把源文件或组分配到指定的存储域,默认存储域将用于存储应用程序。 用于选择存储启动代码的存储域。这将意味着此存储空间存储了重启(reset)和中断向量表,链 接器会在启动阶段(在进入主程序以前)把所有启动代码分配到此存储域内。 NoInit 复选框用于对某存储域禁止0初始化。需要注意的是在C源程序中仍然需要0(zero_init) 初始化。相关解释见禁止零初始化 。 注意:? ? ?默认的read/only存储域用于存储程序的初始化数据及分配到RAM中的程序代码和常量。 RealView微控制器开发集的评估板不支持分散加载描述文件。 有关分散加载描述文件请参阅RV Linker and Utilities User&#39;s Guide, Using Scatter-loadingfile://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh... GSARM: Getting Started User&#39;s GuidePage 6 of 9Description Files。?分散加载描述文件以target_name.SCT文件名存储在目标文件夹下(Object File folder)。可以对 其进行编辑,在Project - Options for Target - Linker对话框下,禁止Use Memory Layout from Target Dialog 并在Scatter File下键入所需文件。散列载入描述文件例子; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_ROM1 0xx { ; load region ER_ROM1 0x { ; load address = execution address *.o (RESET, +First) * (+RO) } RW_IRAM1 0xx00001FE0 { ; RW data * (+RW +ZI) } }指定存储域在Project Workspace下使用快捷键可在打开Options - Properties对话框,在此对话框中可以为源文 件或组指定存储域。在Options - Properties 对话框下可以将Code / Const, Zero Initialized Data,和 Other Data 分配到在 Project - Options for Target - Target对话框中定义的各种存储域中。注意:?当RAM 被用作Code / Const 时, __main 初始化会将程序代码和常量拷贝到此RAM区并执 行。映像文件存储在Project - Options for Target - Target对话框中指定的默认存储域内。 这样的设置用于为链接器产生分散加载文件。如果禁止Project - Options for Target Linker,此设置会被忽略。 此特性在RealView微控制器开发工具集的评估版下不可用。??中断服务程序file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh...
GSARM: Getting Started User&#39;s GuidePage 7 of 9不同的ARM微控制器有不同的中断优先级和中断系统。参考开始使用ARM开发工具集用户指南, 中断,可了解各种中断相关概念。 RealView编译器提供关键字__irq 以定义标准的(irq)和(fiq)中断函数。 例子 :__irq void IRQ_Handler (void) { /* the interrupt code */ }对没有向量中断处理或FIQ中断函数的微控制器,需要按要求改变CPU的启动代码。 例子 : 下面的C代码实现了一个空的 FIQ_Handler:__irq void FIQ_Handler (void) { ; }在启动代码中,要进行如下修改以调用FIQ_Handler:Vectors LDR : LDR : PC, Reset_Addr PC, FIQ_A Instruction at FIQ Vector locationFIQ_AddrPRESERVE8 IMPORT FIQ_Handler DCD FIQ_Handler; tell linker: stack alignment is 8- use external FIQ_H FIQ Entry point软件中断管理软件中断(SWI) 函数用于产生原子代码序列,此代码序列被保护,不会响应IQR中断而执行。参阅 支持知识库文件,可以获得更多有关原子执行序列信息。 使用RealView编译工具可以很容易地创建SWI函数。在文件夹..\ARM\Examples\SWI下提供了一个 SWI的例子。 C中的SWI函数的定义如下:int __swi(0) add (int i1, int i2); int __SWI_0 (int i1, int i2) { return (i1 + i2); } // function prototype for calling from C // function implementationSWI.S 定义了一个软件中断管理。在此文件下面的表中包含了应用程序SWI函数的入口。: IMPORT IMPORT IMPORT IMPORT SWI_Table DCD DCD DCD __SWI_0 __SWI_1 __SWI_2 ; SWI 0 Function E SWI 1 Function E SWI 2 Function Entry __SWI_0 __SWI_1 __SWI_2 __SWI_3file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh... GSARM: Getting Started User&#39;s GuidePage 8 of 9DCD :__SWI_3; SWI 3 Function Entry定位变量到指定的位置使用定义在头文件 absacc.h中的__at 宏,可以将变量以如下方式定位到绝对地址处: C 例子:#include &absacc.h& const char MyText[] __at (0x1F00) = &TEXT AT ADDRESS 0x1F00&; int x __at (0x); // variable at address 0x汇编例子 : 在汇编文件中可以使用段名,由|.ARM.__AT_&addr&|组成来定义位置。下面的例子是将一个段定 义到地址0xFFE0处:AREA |.ARM.__AT_0xFFE0|, CODE, READONLY禁止0初始化带有非易失(non-volatile)存储器的嵌入式系统在启动时会要求变量被初始化为0。 使用NoInit 可以定义一个存储域为非易失(non-volatile)的。此外,还需要在C代码中用zero_init属性定义变量,如下所示:__attribute__((zero_init))当存在几个混合的初始化Read/Write存储域,需要将使用非易失的模块分配到NoInit存储域。需要 在对话框Options - Properties 下Zero Initialized Data中选择正确的存储域。详情请参阅指定存储 区域。注意:?此特性在RealView微控制器开发工具集的评估版下不可用。file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh... GSARM: Getting Started User&#39;s GuidePage 9 of 9从CARM移植本节介绍如何将应用程序从Keil CARM编译器移植到RealView编译工具下。 将程序从Keil CARM编译器移植到RealView编译工具下所需的步骤如下: 1. 在 Project - Components, Environment, and Books - Folder/Extensions下选择RealView编译器 。 2. 替换并配置启动代码。支持不同微控制器的预配置启动代码在文件夹..\ARM\Startup下。 3. 使用printf或scanf检查应用是否使用了控制I/O函数。若使用的话需要添加一个库文件retarget。 4. 配置目标硬件的存储布局。 现在可以简单地重新编译应用代码,在编译应用代码时可能遇到下面的情况:? ? ?RealView编译工具通常趋向于使用更多的栈,这就需要增加应用中的栈空间。 调整应用中的软件中断函数(SWI)。 组合同一个源模块中在RAM中执行的函数,并利用Options - Properties对话框把代码/常量分 配到RAM中。 内嵌汇编函数的语法不同。 使用关键字__at 需要包含头文件absacc.h。 pragma NOINIT 需要被替换,如禁止零始化所述。? ? ?file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh... GSARM: Getting Started User&#39;s GuidePage 1 of 46开始使用ARM开发工具集用户指南感谢您选择了Keil公司的微控制器软件开发工具。使用这个工具可以创建ARM、XC16x、C16x、ST10、251及8051等微控制器的 嵌入式应用程序,详细的设备信息请参考设备数据库。 Keil公司将不断地添加新的设备和片上外设的的仿真支持,因此,如果本地设备数据库不包含用户打算使用的设备,请检查一下网 络设备数据库。 这个用户手册提供了Keil ARM开发工具的概述。包括如下的章节:? ?简介 给出来了开发工具的概述、讨论了文件结构。 开发工具 描述了包括?Vision IDE/调试器的Keil ARM开发工具的主要特性。解释了如何选择Keil CARM 编译器、GNU或 ADS/RealView工具链。 创建应用程序 描述了如何创建工程、编辑源文件、编译和修改语法错误以及产生可执行代码。 测试程序 描述了如何使用?Vision调试器仿真和测试完整的应用程序。 例程 提供了几个例子程序显示如何使用Keil ?Vision/ARM及相关开发工具。 使用片上外设 显示了如何使用开发工具访问片上外设。 CPU设置 提供了CPU启动代码和工具配置的详细信息。 JTAG调试讨论了如何如何使用Keil ULINK USB-JTAG仿真器调试目标系统。 Flash编程 描述了如何通过JTAG接口设置Keil ULINK仿真器进行Flash编程。 RDI接口驱动 解释了RDI调试解决方案的使用。? ? ? ? ? ? ? ?版本历史:? ? ? ?2005年7月:增加了 RDI接口驱动。 2004年11月:CPU和Flash编程章节的修订。 2004年5月:增加了Keil ARM 工具链及?Vision用户手册的相关部分。 2004年2月:ARM工具相关资料的收集。 Copyright (c) Keil - An ARM Company。 All rights reserved。介绍使用Keil软件开发工具可以创建基于ARM, XC16x, C16x, ST10, 251以及8051等微控制器(详细的微控制器列表请参考设备数据库) 的嵌入式应用程序。 Keil公司将不断地向设备数据库中添加新设备以及片上外设的仿真支持,因此,如果在本地安装的?Vision设备数据库中没有合适 的设备请参考一下基于网站的设备数据库。 这一章将介绍Keil 软件的可用ARM开发工具,简单的介绍一下软件开发周期以及ARM开发工具链的 文件结构 。软件开发周期使用?Vision 3作为嵌入式开发工具,其开发的流程与其他软件开发工具基本一样,一般分为以下几步: 1) 2) 3) 4) 5) 新建一个工程,从设备库中选择目标芯片,配置工程编译器环境; 用C或汇编编写源文件; 编译目标应用程序; 修改源程序中的错误; 测试链接应用程序。下图描述了完整的?Vision /ARM软件开发流程。本节后面将对其中的每一部分做简要描述。file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh4...
GSARM: Getting Started User&#39;s GuidePage 2 of 46?Vision IDE?Vision IDE集成了工程管理、带交互式错误修正的编辑器、选项设置、编译工具以及在线帮助。使用?Vision可以创建源文件以 及将这些源文件组织成定义目标应用程序的工程。用户可将注意力全部集中在?Vision集成开发环境,因为它提供了嵌入式应用程序 的自动编译、汇编以及链接。C编译器和宏汇编器在?Vision IDE中创建源文件,这些源文件将使用C编译器编译或宏汇编器汇编。编译器和汇编器处理源文件,产生可重载的目标 文件。 在Keil ?Vision/ARM中可以使用GNU 或ARM ADS/RealView 的开发工具。?Vision/ARM包含了许多使用这些工具链的例程及详细 信息。库管理器库管理器可以从编译器或汇编器产生的目标文件中创建目标库文件。库是具有特定格式和顺序的目标模块的集合,它在链接器中 使用。当链接器处理库文件时,只有那些在程序中使用到的库文件目标模块才会被处理。链接器/装载器链接器/装载器使用目标模块创建绝对的ELF/DWARF格式文件,这些目标模块来源于库文件或编译器和汇编器产生的目标文件。 绝对的目标文件或模块不包含可重载的代码或数据。所有的代码和数据都存储在固定的内存位置。绝对的ELF/DWARF文件可以在下 述情况下使用:? ? ?编程Flash ROM或其他存储设备。 仿真和目标调试的?Vision调试器。 程序测试的片内仿真器。?Vision调试器?Vision的源码级调试器非常适合快速可靠的调试。这个调试器包括一个高速的软件仿真器,它可以仿真一个包括片上外设和外部 硬件的完整ARM系统。当用户从设备数据库中选择所需芯片时,它的属性将自动被配置。 ?Vision的调试器为目标硬件上程序的测试提供了几种方法:?使用带USB-JTAG接口的Keil ULINK2仿真器进行应用程序的Flash下载和软件测试,它们是通过集成在ARM设备中的嵌入式ICE 宏单元实现的。 使用高级的GDI 接口连接?Vision调试器和目标系统。?目录结构file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh4...
GSARM: Getting Started User&#39;s GuidePage 3 of 46安装程序将开发工具安将在根目录下的子目录,默认的根目录是C:\KEIL。下表列出了MDK的目录结构。根据软件版本及安装目 录的不同这种结构会有所不同,以下说明以默认目录为例。ARM 开发工具目录 C:\KEIL\ARM\BIN C:\KEIL\ARM\INC C:\KEIL\ARM\ADS C:\KEIL\ARM\GNU C:\KEIL\ARM\Flash C:\KEIL\ARM\HLP C:\KEIL\ARM\ ... \Startup C:\KEIL\ARM\ ... \Examples C:\KEIL\ARM\ ... \Boards 说明 ?Vision/ARM工具链的可执行文件 Keil C的包含文件及特定的C编译器包含文件 ARM ADS/RealViewTM工具链的例程及启动文件 GNU工具链的例程及启动文件 Keil ULINK2 USB-JTAG Adapter Flash编程算法文件 Keil ARM 工具链及?Vision的在线帮助文档 特定设备的启动文件 基于Keil C, GNU or ADS的一般例程 基于Keil C, GNU or ADS的评估板例程通用?Vision文件目录 C:\KEIL\UV3 说明 通用?Vision文件请求协助Keil公司致力于提供嵌入式软件开发工具及可用文档。如果用户有关于这些产品在线手册的建议或注解,请与Keil公司联系。如 果用户认为发现了这款软件的问题,在请求Keil公司的技术支持之前做如下处理: 1. 阅读要完成工作或任务所涉及到的数据手册中的相关部分。 2. 确保所用的是当前最新的软件或使用工具。可以在.cn/wen-class.asp?lx=big&anid=51 中查询最新的软 件版本。 3. 分离出问题,以便确定这个问题是关于哪个方面的,如汇编器、编译器、链接器、调试器或其他开发工具的问题。 4. 通过将问题减少到几行,以便进一步的分离问题。 如果用户做了这些工作以后问题仍然不能解决,请和Keil公司的技术支持部门联系(必须附上产品序列号和版本号)。推荐使用 Email的形式将问题发给技术支持部门。如果使用的是传真,必须附上用户的名字和电话号码以便技术支持部门和用户联系。 在描述问题的时候必须尽可能的详细。问题表述地越详细,技术支持部门找出解决方案就越迅速。如果用户的问题只有单页的代 码量,请以Email的形式发给技术支持部门。如果可能的话,必须保证用户的问题能被?Vision的软件仿真器所重现。请尽量避免发送 完整的应用程序或过长的清单,以免影响技术支持部门的回复速度。 注意:?用户可以从.cn/news-class-class.asp获得技术支持、产品更新、应用笔记以及例程。开发工具Keil ARM开发工具提供了大量的特性和优越性,有助于开发者快速成功的开发嵌入式应用程序。这些工具易学易用,为用户完成 设计目标提供了保证。概述?Vision IDE和调试器是Keil ARM开发工具的核心部分。?Vision提供了两种工作模式,即编译模式 和调试模式。 在?Vision的编译模式下, 可以维护工程文件、产生应用程序。?Vision可以使用GNU或ARM ADS/RealView开发工具。 在?Vision的调试模式下,可以根据功能强大的CPU和外设软件仿真器或根据连接调试器和目标系统的Keil ULINK2仿真器测试程 序。同时ULINK仿真器还可以下载应用程序到目标系统的Flash ROM中。特性和优点特性 优点 ?Vision软件仿真器是唯一能完全仿真Atmel,Philips和Samsung 在目标硬件产品设计完成之前就可以编写和测试应用程序。研究不 ARM芯片片上外设的调试器。 同的硬件配置以优化硬件的设计。file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh4...
GSARM: Getting Started User&#39;s GuidePage 4 of 46使用高级仿真接口(AGSI)可以提高仿真的性能。 ?Vision软件仿真器的代码覆盖特性提供了程序执行的统计分 析。 ?Vision的设备数据库自动的配置了目标微处理器的开发工 具。 ?Vision IDE集成了第三方的工具,如VCS, CASE和 FLASH/ 设备编程器。 带USB-JTAG 接口的ULINK仿真器既支持调试又支持带可配 置算法文件的Flash编程。 一样的目标调试器和仿真器用户接口。 ?Vision在一个单一的环境中集成了工程管理器、编辑器和调 试器。通过增加定制的外设驱动可以精确的仿真复杂的系统。 可以彻底地测试和验证安全系统。执行分析报告可以作为测试证明 以供浏览和打印。 消除了工具配置中的错误,最小化工具配置的时间。 快速地访问开发工具和第三方工具。所有地配置细节都保存在 ?Vision工程中。 同一个工具既可以用作调试又可以用作编程。没有额外的时间配置 要求。 缩短学习路径。 加速了应用程序的开发。当在编辑源程序时,可以配置调试器;当 在调试程序时,可以修改源代码。uVision 集成开发环境?Vision IDE是一个窗口化的软件开发平台,它集成了功能强大的编辑器、工程管理器以及各种编译工具(包括C编译器、宏汇编 器、链接/装载器和十六进制文件转换器)。?Vision IDE包含以下功能组件,能加速嵌入式应用程序开发过程。 u u u u u u u u u 功能强大的源代码编辑器; 可根据开发工具配置的设备数据库; 用于创建和维护工程的工程管理器; 集汇编、编译和链接过程于一体的编译工具; 用于设置开发工具配置的对话框; 真正集成高速CPU及片上外设模拟器的源码级调试器; 高级GDI接口,可用于目标硬件的软件调试和Keil ULINK仿真器的连接; 用于下载应用程序到Flash ROM中的Flash编程器; 完善的开发工具手册、设备数据手册和用户向导。?Vision IDE使用简单、功能强大,是保证设计者完成设计任务的重要保证。?Vision IDE还提供了大量的例程及相关信息,有助 于开发人员快速开发嵌入式应用程序。 ?Vision IDE提供了编译和调试两种工作模式。编译模式用于维护工程文件和生成应用程序;调试模式下,则可以用功能强大的 CPU和外设仿真器测试程序,也可以使用调试器经Keil ULINK USB-JTAG适配器(或其他AGDI驱动器)连接目标系统来测试程序。 ULINK仿真器能用于下载应用程序到目标系统的Flash ROM中。操作?Vision集成开发环境包括菜单栏、工具栏、源文件显示框、对话框以及信息显示框等。?Vision允许同时打开和浏览多个源文 件。 ?Vision有如下两种操作模式:? ?编译模式: 编译所有应用程序文件,产生可执行程序。编译模式的这个特性将在创建应用程序一节详细阐述。 调试模式:为测试应用程序提供了一个功能强大的调试器。调试模式将在测试程序一节详细阐述。在这两种操作模式下都可以使用源文件编辑器修改源文件代码。调试模式下增加了一个窗口,存储了一个定制的界面层。下图显 示了调试模式下uVision的典型配置。file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh4...
GSARM: Getting Started User&#39;s GuidePage 5 of 46?Project Workspace窗口的各个页面可以访问如下内容:工程的文件和组;调试模式下CPU的寄存器;工具及工程相关的在线手 册。 Output Window 窗口的各个页面提供了如下内容: 编译信息及快速错误定位;调试 命令输入/输出控制台;带快速文件访问的 文本搜索 结果。 Memory Window 窗口以变量格式的形式显示了可以访问的内存区域。 Watch & Call Stack Window 窗口可以浏览及修改程序变量,显示当前函数调用树。 Workspace窗口用于文件编辑,反汇编输出窗口及调试相关信息。 Peripheral Dialogs窗口用于观察微控制器中片上外设的状态。?? ? ? ?实用工具?Vision包含了许多功能强大的实用工具。这些实用工具在下标中详细说明。 实用工具 文本查找 使用Flash 菜单 使用工具菜单 使用SVCS菜单 工具参数的键码序列 说明 在所有指定的文件中实现文本搜索。 使用Flash编程工具。 在?Vision IDE中使用定制实用工具。 为软件版本控制系统提供了一个可配置的SVCS接口。 键码序列用于从?Vision环境向外部的定制程序传递参数。选择工具集?Vision可以使用ARM RealView编译工具、 ARM ADS编译器、GNU GCC编译器和Keil C ARM编译器。当使用GNU GCC编译 器或ARM ADS编译器时必须另外安装它们编译集。实际使用的工具集可以在?Vision IDE的Project - Components, Environment, and Books对话框的Folders/Extensions页(见下图)中选择。?Use RealView Compiler复选框表示本工程使用ARM开发工具。RealView Folder文本框指定开发工具的路径。下面的例子显示file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh4...
GSARM: Getting Started User&#39;s GuidePage 6 of 46了各种版本的ARM ADS/RealView 开发工具的路径:? ? ? ? ??Vision的RealView编译器: BIN31\ ADS V1.2: C:\Program Files\ARM\ADSv1_2\Bin RealView评估版2.1: C:\Program Files\ARM\RVCT\Programs\2.1\350\eval2-sc\win_32-pentiumUse Keil CARM Compiler复选框表示本工程使用Keil CARM编译器、Keil AARM汇编器和Keil LARM链接器/装载器。 Use GNU Compiler复选框表示本工程使用GNU开发工具。Cygnus Folder文本框指定GNU的安装路径。GNU-Tool-Prefix文本框 指定不同的GNU工具链。下面是各种GNU版本的例子:? ?带uclib的GNU V3.22: GNU-Tool-Prefix: arm-uclibc- Cygnus Folder: C:\Cygnus 带标准库的GNUARM V4: GNU-Tool-Prefix: arm-elf- Cygnus Folder: C:\Program Files\GNUARM\?Keil根目录的设置是基于?Vision/ARM开发工具的安装目录的。对于Keil ARM 工具来说,工具组件的路径是在开发工具目录中 配置的(参考文件结构)。注意:?对使用ARM ADS/RealView工具来说,编译器可能在指定的头文件中找不到设备。在这种情况下,必须在?Vision的Project Options for Target - C对话框的Include Paths文本框中输入正确的路径。例如Keil\ARM\INC\Atmel。现在开发者必须能够转换 和调试像Keil\ARM\ADS\Examples\Measure这样的例程。带USB-JTAG 接口的ULINK仿真器带USB-JTAG 接口的Keil ULINK2 仿真器是一个连接微机USB端口和目标硬件 JTAG或OCDS调试端口的硬件(见下图)。使用带有ULINK仿真器的Keil ?Vision IDE/调试器,可以在实际的目标板上轻松的实现嵌入式应用程序的创建、下载以及测试。 使用ULINK仿真器可以实现如下功能:? ? ? ? ? ?下载目标程序。 检查内存和寄存器。 整个程序的单步执行。 插入多个段点。 运行实时程序。 对FLASH存储器进行编程。更详细的信息请参考JTAG调试 和 Flash编程。创建应用程序这一章描述了?Vision的编译模式,说明如何使用用户接口创建简单的工程。同时讨论了产生和维护工程的选项,包括输出文件选 项、优化代码质量的ARM工具的配置以及?Vision工程管理特性。 为了便于对?Vision/ARM产品的评估和熟悉,keil公司提供了具有简单例程和功能受限的评估版。这些简单的例程也同样包含在标 准版的产品中。 注意:?Keil ?Vision/ARM评估版在功能和创建应用程序代码容量上受到限制。更多评估版的受限信息请参考发布笔记(Release Notes)。 对如大的应用程序须使用标准版的开发工具。创建一个工程?Vision包含一个工程管理器,它使得设计ARM微控制器的嵌入式应用程序更加方便。为了创建一个新的工程,必须按如下步骤实 现:file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh4...
GSARM: Getting Started User&#39;s GuidePage 7 of 46? ? ? ? ? ?运行?Vision,选择工具集。 创建一个工程文件,从设备数据库中选择一个CPU芯片。 创建一个新的源文件,将这个源文件加载到工程中。 增加和配置ARM设备的启动代码。 设置目标硬件的工具选项。 编译工程,创建能烧写到PROM中的十六进制文件。本章后面将一步步说明如何创建一个简单的?Vision工程。运行uVision?Vision是一个标准的窗口应用程序,可以点击程序按钮开始运行。为了创建一个新的?Vision工程必须作如下处理:? ? ?选择工具集 创建工程文件 选择设备选择工具集在开发ARM工程时,用户可以使用Keil C, GNU, 或ARM ADS/RealView开发工具。对于?Vision工程来说,必须在Project Components, Environment, and Books对话框中选择工具集。创建工程文件单击Project -&New...-&?Vision Project菜单项,?Vision 3将打开一个标准对话框,输入希望新建工程的名字即可创建一个新的工程, 建议对每个新建工程使用独立的文件夹。例如,这里先建立一个新的文件夹,然后选择这个文件夹作为新建工程的目录,输入新建 工程的名字Project1,?Vision将会创建一个以Project1.UV2为名字的新工程文件,它包含了一个缺省的目标(target)和文件组名。这 些内容在Project Workspace-&Files中可以看到。选择设备在创建一个新的工程时,?Vision要求为这个工程选择一款CPU。选择设备对话框显示了?Vision的设备数据库,只需要选择用户 所需的微控制器即可。例如,选择 Philips LPC2106微控制器,这个选择设置了LPC2106设备的必要工具选项、简化了工具的配置。注意:? ?当创建一个新的工程时,?Vision会自动为所选择的CPU添加合适的启动代码。 对于一些设备而言,?Vision需要用户手动地输入额外的参数。请仔细阅读这个对话框右边的信息,因为它可能包含所选设备的 额外配置要求。当从设备数据库中选择了一个CPU后,就可以在Project Workspace -&Books页中打开这个设备的用户手册。这些用户数据手册是 Keil 开发工具CD-ROM的一部分。file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh4...
GSARM: Getting Started User&#39;s GuidePage 8 of 46创建新的源文件通过File -&New...菜单项可创建一个新的源文件。这时将打开一个空文件编辑窗口,在这里可以输入源文件代码。当通过File&Save As 对话框以扩展名.C的形式保存了这个源文件以后,?Vision可以用彩色高亮度显示C 语言的语法。例如,保存下面的代 码到MAIN.C文件中。#include &LPC210x.H& void wait (void) ; } { /* LPC210x definitions */ /* wait function */ /* only to delay for LED flashes */int main (void) { IODIR = 0xFF; while (1) { for (j = 0x01; j & 0x80; IOSET = for (i = 0; i & 10000; wait (); } IOCLR = } for (j = 0x80; j & 0x01; IOSET = for (i = 0; i & 10000; wait (); } IOCLR = } } }/* Delay var */ /* LED var */ /* /* /* /* /* /* P0.0..7 defined as Outputs */ Loop forever */ Blink LED 0, 1, 2, 3, 4, 5, 6 */ Turn on LED */ Delay for 10000 Counts */ call wait function */j &&= 1) { i++) {/* Turn off LED */ j &&=1) { i++) { /* /* /* /* Blink LED 7, 6, 5, 4, 3, 2, 1 */ Turn on LED */ Delay for 10000 Counts */ call wait function *//* Turn off LED */创建源文件以后,就可以将这个文件添加到工程中。?Vision提供了几种方法将源文件添加到工程中。例如, 在Project Workspace -&Files页的文件组上点击鼠标右键,然后在弹出的菜单中选择Add Files菜单项,这时将打开标准的文件对话框,选择 刚才创建的MAIN.C文件即完成源文件的添加。添加及配置启动代码一般来说,ARM程序需要与目标硬件的设计配置相匹配的CPU初始化代码。当创建工程的时候,?Vision要求添加与选定的 CPU相匹配的启动代码。根据所使用的工具链的不同,启动代码文件所在的文件夹分别为 ..\ARM\Startup (针对Keil开发工具 链),..\ARM\GNU\Startup(针对GNU开发工具链) 和 ..\ARM\ADS\Startup(针对ADS开发工具链)。对于不同的微控制器来说,这 些文件夹包含不同的 启动代码 。Philips LPC2106的启动代码文件为...\Startup\Philips\Startup.s 。为了和目标硬件相匹配,用户 可能会修改这个启动代码文件,所以工程中的启动代码文件是Startup.s的一个副本。file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh4...
GSARM: Getting Started User&#39;s GuidePage 9 of 46组工程文件文件组(file group)可以组织更大的工程。对于CPU的启动代码和其他的系统配置文件,可以通过Project -&Components, Environment, Books对话框创建一个单独的文件组。使用New (Insert)按钮创建名为System Files的文件组。在工程窗口中,可以将 Starup.s文件拖放到这个新建的文件组中。Project Workspace -&Files页列出了所有的工程文件。在工程工作区中双击这些文件名可以打开它们,此时可以对这些文件进 行编辑。?Vision有一个特点,就是可以在编辑器中以图形界面的形式编辑启动代码。设置目标硬件的工具选项?Vision可以设置目标硬件的选项。通过工具栏按钮或Project - Options for Target菜单项打开Options for Target对话框,在 Target页中设置目标硬件及所选 CPU片上组件的参数。下图是LPC2106的一些参数设置。下表描述了Target对话框的选项: 对话框项 描述file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh4...
GSARM: Getting Started User&#39;s GuidePage 10 of 46Xtal Use On-Chip ROM/RAM设备的晶振(XTAL)频率。大多数基于ARM的微控制器都使用片上PLL产生CPU时钟。所以,一般情况下CPU 的时钟与XTAL的频率是不同的。仔细查阅硬件手册以确定合适的XTAL的值。 仅针对Keil ARM工具。选择这两个多选框以后,将设置Keil LA链接器/装载器。对于GNU和ADS,是通过链接 器控制文件实现的。External Memory 仅针对Keil ARM工具。指定目标硬件的外部存储区域。RAM用于存取变量,而ROM用于存储常量和程序代码 (一般为EPROM或Flash存储器)。这些信息用于配置Keil LA链接器/装载器。对于GNU和ADS,是通过链接器控 制文件实现的。增加连接控制文件(针对GNU和ADS)对于GNU和ARM ADS/RealView工具链来说,链接器的配置是通过链接器控制文件实现的。这个文件指定了ARM目标硬件的 存储配置。预配置的链接器控制文件 在文件夹..\ARM\GNU或..\ARM\ADS中。 为了与目标硬件相匹配,用户可能会修改链接器 控制文件,所以工程中的那个文件是预配置的连接控制文件的一个副本。这个文件可以通过Project - Options for Target对话框的 Linker页添加到工程中。下表描述了链接器对话框的各个选项的功能: 对话框项 描述Enable Garbage Collection 允许未使用输入段的垃圾回收。在不支持这个选项的目标中,它会被忽略。这个选项和&#39;-r&#39;不一样,也 不能在动态链接时使用。 Do not use Standard System Startup Files Do not use Standard System Libraries Text Start Data Start BSS Start Linker Script File Include Libraries Include Paths Misc controls Linker control string 链接时不使用标准的系统启动文件。如果不选 中这个选项时标准的系统库会被正常使用。 链接时不使用标准的系统库文件。仅使用C和GCC库。 指定输出文件代码段的起始地址。必须是一个单精度的十六进制整数。为了保持和其他链接器的兼容 性,必须忽略这个十六进制值前面的0X。 指定输出文件数据段的起始地址。必须是一个单精度的十六进制整数。为了保持和其他链接器的兼容 性,必须忽略这个十六进制值前面的0X。 指定输出文件BSS段的起始地址。必须是一个单精度的十六进制整数。为了保持和其他链接器的兼容 性,必须忽略这个十六进制值前面的0X。 指定在编译时导入的库。 向路径列表中添加路径,在这些路径中LD将搜索库文件和ld控制脚本。在任何时候都可以使用这个选 项。这些文件夹是按照它们在列表中的顺序搜索,且是在默认文件之前搜索的。 使用Misc 控制框指定链接器需要的命令,这些命令没有单独的对话框控制。 这个文本框显示了当前链接器的命令行。编译工程以及创建十六进制文件一般来说,在新建一个应用程序的时候Options -&Target页中的所有的工具和属性都要配置。单击Build Target工具栏按钮将 编译所有的源文件,链接应用程序。当编译有语法错误的应用程序时,?Vision将在Output Window -&Build窗口中显示错误和警 告信息。单击这些信息行,?Vision将会定位到相应的源代码处。file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh4...
GSARM: Getting Started User&#39;s GuidePage 11 of 46源文件编译成功产生应用程序以后就可开始调试了,然后创建可下载到EPROM或软件仿真器中运行的Intel十六进制文件。 当Options for Target -&Output页中的Create HEX file多选框被选中后,?Vision每次编译后都会生成十六进制文件。FLASH Fill Byte、Start和End文本框中的值被OH166使用工具用来产生十六进制文件。在Run User Program #1文本框中指定程序时,当编译 过程完成后就可以启动PROM编程器了。现在,可以修改工程中已存在的代码或向工程中添加代码了。Build Target工具按钮仅编译已修改过或新建的源文件,产生可 执行的文件。?Vision有一个文件的依赖列表,它记录了每一个源文件所包含的头文件。甚至工具选项都保存在文件依赖列表 中,所以只有在需要的时候?Vision才会重新编译这些源文件。工程目标和文件组通过使用不同的工程目标(project target),?Vision 可以使单个工程生成几个不同的程序。开发者可能需要一个目标(target)作 为测试,另一个目标作为应用程序的发布版。在同一个工程文件中,每一个目标都具有各自的工具设置。 文件组(file group)可以将工程中相关的的文件组织在一起。这样有利于将一组文件组织到一个功能块中或区分一个开发团队 中的工程师。在以前的一些例程中,已经以文件组的形式将 CPU相关文件同其他源文件隔离开。在?Vision中,使用这种技术很 容易管理具有几百个文件的工程。 在Project -&Targets, Groups, Files 对话框中可以创建工程目标和文件组。在以前的一些例程中,已经使用了这个对话框添加 系统配置文件。下图显示了一个例程的工程结构。Project Workspace窗口显示了所有的组和相关文件。这个窗口中的文件以在窗口中的排列顺序进行编译和链接。可以通过拖 放的方式移动文件的位置,同时也可以单击目标和组改变它们的名字。在本窗口内单击鼠标 右键,在弹出的菜单中可以进行如 下的操作:? ? ?设置工具选项 删除文件或组 将文件添加到组中file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh4...
GSARM: Getting Started User&#39;s GuidePage 12 of 46?打开文件在编译工具栏可以快速的改变当前编译的工程目标。在工程工作区浏览文件和组的属性在Project Workspace - Files页中,不同的图标显示了文件和组的不同属性。这些图标解释如下: 带箭头的文件图标表示编译和链接工程文件。 链接运行时不包含的文件不带箭头。对于一般的文档文件这是很常见的。然而,在属性对话框中取消Include in Target Build的选 择,同样也可以不包含源文件。 只读文件被标志为一个钥匙。在软件版本控制系统中这样的文件是很常见的,因为SVCS使这样文件的拷贝只读。 带有特殊选项的文件和文件夹被圆点标记。 注意:?在工程的不同目标(target)中,不同的图标给出了工具设置的快速提示。这些图标反映了当前所选目标的属性。例如,如果 在目标的文件或文件夹设置了特殊的属性,当目标被选中时图标上就会显示圆点。工程选项页概述在Project - Options对话框页可以设置所有的工具选项。所有的选项都保存在?Vision工程文件中。 在Project Workspace -&Files窗口点击鼠标右键,在弹出的菜单中可以设置文件夹或单个文件的不同选项,这些选项在文件和 文件夹选项中解释过。在这种情况下,可能有附加的属性页及仅与所选项相关的对话框页。 下表概述了各种选项对话框的功能。 对话框页 描述 Device Target Output Listing C Asm Linker Debug Utilities 注意:?从?Vision的设备数据库中选择选择设备。 为应用程序指定硬件环境。 定义工具链的输出文件,在编译完成后运行用户程序。 指定工具链产生的所有列表文件。 设置C编译器的工具选项,例如代码优化和变量分配。 设置汇编器的工具选项,如宏处理。 设置链接器的相关选项。一般来说,链接器的设置需要配置目标系统的存储分配。设置链接器定义存储器类型和段的 位置。 ?Vision调试器的设置。 配置Flash编程实用工具。C编译器、Asm和链接器对话框页的标签随实际选择的工具链的不同可能有所差异。获得帮助在对话框中可以使用内容帮助。只需单击对话框右下角的帮助按钮即可获得相关的帮助信息。使用?Vision调试器测试程序这一章描述了?Vision的调试模式,说明了如何使用用户接口测试一个简单的例程。同时讨论了程序调试的仿真模式及不同的 可用选项设置。 ?Vision调试器可以测试用GNU或ARM ADS/RealView工具链开发的应用程序。?Vision调试器提供了两种操作模式,这两种模 式可以在Options for Target -&Debug 对话框中选择。file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh4...
GSARM: Getting Started User&#39;s GuidePage 13 of 46?单选框Use Simulator用于选择?Vision的软件仿真器作为调试器,它可以在没有目标硬件的情况下仿真ARM7微控制器的大 部分功能。在目标硬件设计好之前,可以用这个软件仿真器调试嵌入式应用程序。?Vision可以仿真许多片上外设,例如串 口,外部I/O和定时器。当为目标(target)从设备数据库中选择一个CPU时,可仿真的片上外围就已经确定了。 使用高级GDI驱动器,例如Keil ULINK2 ARM调试器 提供了一个与目标硬件相连接的接口。使用高级GDI接口可以直接将 ?Vision调试器与硬件仿真器、嵌入式ICE(片上调试系统)相连,例如带USB-JTAG接口的Keil ULINK2仿真器。?CPU仿真?Vision调试器可以仿真高达4GB的存储空间,这些存储空间可以被映射为读、写或可执行等访问权限。?Vision软件仿真器可 以捕获和报告非法的存储访问。除了存储映射以外,软件仿真器同时可以仿真各种基于ARM微控制器的片上外围设备。在创建 工程时,从设备数据库中选择的CPU就决定了可以用软件仿真器仿真的片上外围设备。关于从设备数据库中选择设备的信息请 参考运行?Vision及创建工程文件 。可以调试菜单选择和显示片上外围设备,同时通过相应的对话框改变这些外围设备的特征。启动调试模式可以通过Debug -&Start/Stop Debug Session菜单项启动?Vision的调试模式。根据Options for Target -& Debug页配置的不同, ?Vision将加载应用程序、运行启动代码。关于?Vision调试器配置的详细信息请参考设置调试选项。?Vision可以保存编辑窗口的 布局以及回复最后调试时的窗口布局。 如果程序停止执行,?Vision将打开一个显示源代码文本的编辑窗口或在反汇编窗口中显 示相应的CPU指令。下一个可执行的语句被标记为黄色箭头。 在调试的时,大多数编辑器的功能都是可用的。例如,可以使用查找命令或纠正程序错误。应用程序的源代码文本在同一窗 口中显示。?Vision的调试模式和编辑模式有如下的不同:? ?调试菜单和调试命令是可用的。调试窗口将在以后讨论。 工程结构和工具参数是不能被修改的。所有的编译命令不可用。执行应用程序?Vision有以下几种方法开始执行应用程序。? ? ?使用调试菜单和调试命令。 在编辑器或反汇编窗口上单击鼠标右键,在弹出的菜单中选择Run till Cursor line菜单项。 在Output Window C Command页中使用 Go, Ostep, Pstep和Tstep命令。设置调试选项Options for Target - Debug对话框用于配置?Vision调试器。下表描述了调试对话框的选项: 对话框项 Use Simulator Use ULINK2 ARM7 Debugger Settings Other dialog options 描述 选择?Vision的软件仿真器作为调试工具。 选择高级的GDI驱动器和调试硬件相连。Keil ULINK2 ARM7调试器可以用带USB-JTAG接口的Keil ULINK2仿真器和目标板相连。同时也有现存的第三方?Vision驱动器。 打开已选的高级GDI驱动器的配置对话框。 对软件仿真器和高级GDI 会话可用。file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh4...
GSARM: Getting Started User&#39;s GuidePage 14 of 46Load Application at Startup Go till main () Initialization File Breakpoints Toolbox Watchpoints & PA Memory Display CPU DLL Driver DLL Parameter选中该选项以后,在启动?Vision调试器时自动加载目标应用程序。 当启动调试器时开始执行程序,直到main()函数处停止。 调试程序时作为命令行输入的指定文件。 从前一个调试会话中恢复断点设置。 从前一个调试会话中恢复工具框按钮。 从前一个调试会话中恢复观察点和性能分析仪的设置。 从前一个调试会话中恢复内存显示设置。 配置内部?Vision调试DLL。这些设置来源于设备数据库。用户能修改DLL或DLL的参数。调试窗口和对话框在调试阶段,?Vision提供了几个用于帮助调试的窗口和对话框。它们可以通过工具按钮和?Vision菜单打开。 工具栏 菜单项和描述 Debug Breakpoint... (Ctrl+B):设置、浏览和修改断点。 View Code Coverage Window:已执行代码的统计。 View Project Workspace Regs Tab:显示或修改CPU寄存器的内容。 View Disassembly Window: 混合源代码的汇编指令和运行轨迹记录。 View Logic Analyzer Window: 变量或I/O值改变的图形化显示。 View Memory Window: 查看和修改内存的值。 Debug Memory Map...: 指定数据和程序代码的存储区域。 View Output Window Debug Tab: 输入调试命令,表达式 或调用 调试函数。 View Performance Analyzer Window:程序执行的时间统计。 View Serial Window 1 - 3:串行输入/输出的终端窗口。 View Symbol Window: 列出程序的符号信息。 View Toolbox: 用户可配置的按钮,用于快速执行命令。 View Watch & Call Stack Window:显示和修改变量值、列出函数间调用的情况。外设变量根据工程所选的CPU不同,?Vision自动定义一系列的标识符。这里主要分为两类:特殊功能寄存器(SFR)和CPU引脚寄存器 (VTREG)。? ? ? ?外设寄存器 CPU引脚寄存器(VTREG) I/O端口 串口外设寄存器?Vision为外设寄存器定义了标识符。外设寄存器标识符依赖于所选的微控制器。外设寄存器标识符有相关的地址、可在表达 式中使用。CPU引脚寄存器(VTREG)CPU引脚寄存器(VTREG)用于仿真CPU引脚的输入和输出。VTREG不是公共标识符,也不在CPU的存储空间中。这些寄存器 可以在表达式中使用,但它们的值和用法依赖于具体的CPU。VTREG提供了一种方法指定输入CPU中仿真硬件的信号。可以用 DIR VTREG命令列出所有的VTREG。 下表描述了VTREG标识符。实际可用的VTREG标识符依赖于具体的CPU. VTREG 描述file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh4...
GSARM: Getting Started User&#39;s GuidePage 15 of 46ADx DAx PORTx SxIN SxOUT片上模拟输入引脚,一般用于A/D转换器的输入。目标程序可以读写ADx VTREG寄存器的值。 片上模拟输出引脚,一般用于D/A转换器的输出。 片上端口的一组 I/O引脚。例如,PORTA只端口A的所有引脚。这些寄存器用于I/O的仿真。 串口x的输入缓冲。可以向寄存器SxIN中输入8位或9位的值。这些值可以通过目标程序读出。通过读取SxIN的值决定是 否可以接受下一个字符。0xFFFF表示前一个字符完全处理,可以输入下一个字符。 串口x的输出缓冲。?Vision拷贝8位或9位的值(可编程的)到SxOUT VTREG寄存器中。xxVREF 参考引脚的输入电压。SxTIME 定义串口x的波特率。当SxTIME为1时,?Vision使用已编程的波特率仿真串口的时序;当SxTIME为0(默认值)时, ?Vision忽视已编程的波特率,串行发送的时间是实时的。 CLOCK XTAL 注意:?仿真CPU的时钟频率。 在Options C Target对话框中定义的仿真CPU的晶振频率。用户可以使用VTREG仿真包括与片上外设相连的外部输入和输出。例如,如果绑定端口3(8051CPU的3号端口)的2号引脚, CPU仿真0号外部中断。I/O端口?Vision为每一个I/O端口定义了一个VTREG寄存器。不要将这些寄存器和每一个端口的外设寄存器(例如PIOA_OSR)混淆。 外设寄存器能被片内CPU存储空间访问。VTREGs代表引脚上的信号。 使用?Vision可以很容易仿真外部硬件的输入。如果有一个脉冲到达端口的引脚,可以使用信号函数仿真这个信号。例如,下 面的信号函数在端口A的0号引脚上输入1000Hz的方波。signal void one_thou_hz (void) { while (1) { PORTA |= 1; swatch (0.0005); PORTA &= ~1; swatch (0.0005); } } /* /* /* /* /* /* repeat forever */ set PORTA bit 0 */ delay for .0005 secs */ clear PORTA bit 0 */ delay for .0005 secs */ repeat */下面的命令用于运行这个信号函数:one_thou_hz ()关于用户和信号函数的更多信息请参考?Vision调试函数 。 相对于端口引脚的外部输出来说,仿真外部硬件稍微复杂一点,需要两步来完成。第一,写一个?Vision用户或信号函数实现 描述的操作。第二,创建一个调用用户函数的断点。 假设用户使用输出引脚(端口A的0号引脚)点亮或熄灭LED。下面的信号函数使用PORT2 VTREG寄存器检测CPU的输出,同时 在命令窗口中显示信息。signal void check_pA0 (void) { if (PORTA & 1)) { printf (&LED is ON\n&); } else { /* 0? LED is OFF */ printf (&LED is OFF\n&): } } /* Test PORTA bit 0 */ /* 1? LED is ON */现在,用户必须在向port1寄存器中写入数据的代码处添加一个断点。下面的命令行用于在PORT2寄存器中所有写入数据的代 码处增加断点。BS WRITE PORT2, 1, &check_p20 ()&现在,无论什么时候目标程序向PORT2寄存器中写入数据时,check_P20函数将打印当前的LED状态。 关于设置断点的详细 信息请参考断点 。串口片上串口由S0TIME、S0IN、S0OUT、S0IN控制。S0IN、S0OUT代表CPU的输入输出流。S0TIME用于指定串口时序是系统 默认的(当STIME = 0)还是指定的波特率(当SxTIME = 1)。当S0TIME为1时,在串行窗口中显示的数据是以指定的波特率输出 的。当S0TIME为0时,在串行窗口中显示的数据是以更快的速率输出的。 仿真串行输入像仿真数字输入一样容易。假设有一个以指定数据周期(1秒)输入的外部串行设备,可以创建如下信号函数向 CPU的串口提供数据。signal void serial_input (void) {file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh4...
GSARM: Getting Started User&#39;s GuidePage 16 of 46while (1) { twatch (CLOCK); S0IN = &#39;A&#39;; twatch (CLOCK / 900); S0IN = &#39;B&#39;; twatch (CLOCK / 900); S0IN = &#39;C&#39;; } }/* repeat forever */ /* Delay for 1 second */ /* /* /* /* Send first character */ Delay for 1 character time */ 900 is good for 9600 baud */ Send next character *//* Send final character */ /* repeat */当这个信号函数运行时,每延迟1秒向串行输入口输入‘A’, ‘B’, 和‘C’。 同理,串行输出的仿真方式也一样,即像以前描述的那样使用用户或信号函数和写入访问断点。技巧和窍门下面的部分讨论了?Vision调试器的高级技术。尽管这些特性不是经常被使用,但是这些技巧可以使用户更好的理解?Vision调 试器的性能。? ? ? ? ? ? ? ? ? ?修改外设和CPU的配置 仿真I/O端口 仿真中断和时钟中断 仿真外部I/O设备 给PC COM端口分配串行I/O 检测非法内存访问 从文件中输入命令 预设I/O端口和内存的值 向文件中写入调试信息 快捷键的使用预设外设和 CPU的配置?Vision调试器为大多数的外设提供了修改初始化值的对话框。例如,Peripheral C Advanced Power Management Controller用 于修改Atmel AT91M55800A设备的CPU配置。必须首先检查软件仿真器的CPU和外设的初始化值,因为错误的设置可能会导致 目标硬件调试器不能正常运行。仿真I/O端口?Vision提供了显示所有 I/O端口状态的对话框。这里,I/O引脚是用虚拟寄存器(VTREGs)表示的。下面的例程显示了VTREG 以及信号功能或断点。file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh4...
GSARM: Getting Started User&#39;s GuidePage 17 of 46?Vision提供了显示所有 I/O端口状态的对话框。这里,I/O引脚是用虚拟寄存器(VTREGs)表示的。下面的例程显示了VTREG 以及信号功能或断点。// in your C user program PortAvalue = PIOA_PDSR; // read Port A input在?Vision软件仿真器中定义断点。bs write PORT3, 1, &printf (\&Port3 value=%X\\n\&, PORT3)& bs read PORT5, 1, &PORT5 = getint (\&Input Port5 value\&)&当执行C程序时,?Vision将会要求输入Port5的值。如果将一个新的输出值写入Port5,Output Window - Command页将会显 示这个信息。详细信息请参考CPU引脚寄存器 (VTREGs)。仿真中断和时钟中断?Vision可以仿真I/O引脚的输入行为。如果I/O引脚被配置为计数器的输入,则当这个引脚被触发时计数值会增加。下面的例 子说明了如何仿真计数器3的输入行为:// in your C user program T3CON = 0x004B; // set T3 Counter Mode可以使用VTREG端口3同计数器的输入引脚P3.6绑定,例如,下面的信号函数实现了这种绑定。signal void ToggleT3Input (void) { while (1) { PORT3 = PORT3 ^ 0x0040; twatch (CLOCK / 100000); } } // toggle P3.6 // with 100kHz通过外设对话框观察定时器3的状态。 同样也可以仿真中断输入:当端口引脚作为中断输入时,如果绑定相关I/O引脚的话,中断请求将会被设置。仿真外部I/O设备外部I/O设备是典型的映射存储器。用户可以用?Vision调试器提供的存储器窗口仿真这样的I/O设备。因为C用户程序不包含 这样存储区域的任何变量声明,所以要求用MAP命令映射这段存储区。file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh4...
GSARM: Getting Started User&#39;s GuidePage 18 of 46MAP 0xx100FFF READ WRITE/* MAP memory for I/O area */可以用断点和调试函数仿真I/O设备的逻辑。 详细信息请参考用户函数 。 断点定义的例子:BS WRITE 0x, &IO_access ()&给 PC COM 端口分配串行I/OASSIGN命令用于将PC的COM端口作为?Vision软件仿真器的输入UART。如果输入如下的命令,串行I/O口是通过COM2(PC 的接口)实现的。STIME变量用于忽视仿真串行接口的定时。&MODE COM2 , 1 &ASSIGN COM2 &S0IN &S0OUT &S0TIME = 0 /*9600 bps, no parity, 8 data & 1 stop bit*/ /*ASC0 output & input is done with COM2:*/ /*ignore timing of simulated ASC0 interface*/检测非法内存访问有时需要捕获非法内存访问。?Vision的访问断点可能和系统变量_break_一起使用。在下面的例子中,当在函数lear_records 的外面访问数组save_record时程序停止执行。从文件中输入命令?Vision调试器的命令可以通过文件输入,这个文件是通过INCLUDE命令导入到调试器中的。在Options for Target - Debug页 可以指定带调试命令的初始化文件。详细信息请参考设置调试选项。预置I/O端口和内存的值有些应用程序在仿真之前需要预设I/O端口和内存单元的值。在调试初始化文件中可以包含需要预置软件仿真器的命令。例 如:PORT3 = 0 LOAD MEMORY.HEX /* set Port3 to zero */ /* load hex file contents to memory */ /* use the SAVE command to save memory contents */向文件中写入调试输出信息LOG和SLOG命令用于向文件写入调试输出信息。用户可以用一批命令或包含这些命令的调试初始化文件运行?Vision调试 器。&LOG &&C:\TMP\DEBUGOUT.TXT &SLOG &&C:\TMP\DEBUGOUT.TXT & &LOG OFF &SLOG OFF /* /* /* /* /* protocol Output Window - Command page*/ protocol Serial Window output */ Output of the Command page and the Serial Window is written to fil stop Output Window protocol */ stop Serial Window protocol */快捷键的使用在View C Options对话框中可以为所有菜单项配置快捷键。通过这个对话框,用户可以个性化自己的 ?Vision开发环境。例 如,可以在这个对话框中添加插入/删除断点的快捷键。file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh4...
GSARM: Getting Started User&#39;s GuidePage 19 of 46注意:?所有快捷键的分配情况都保存在C:\KEIL\UV3\UV3.MAC文件中。例程这一部分介绍了Keil ARM工具集里的例程。通过使用这些例程能够使开发者更好地了解?Vision的使用。另外,开发者也可 以直接拷贝这些例程代码作为开发使用。 这些例程可以在..\ARM\Examples (针对Keil工具集), ..\ARM\GNU\Examples (针对GNU), 和 ..\ARM\ADS\Examples (针对ADS) 里找到。每一个例程和工程文件会一起存放在一个独立的文件夹里以便更快地编译和评估这些例程。下表列出了这些例程和它 们相应文件夹的名字。 例程 Blinky DHRY Hello 描述 用来示范I/O控制的一个简单的LED点灯程序。 Dhrystone基准测试程序,计算目标CPU的dhrystone。 Hello World程序。建议在使用uVision时先运行此例程,该例程会在串口上打印出Hello World的字样,这有助于验证开发 工具是否工作正常。 ARM_Thumb 在ARM程序里调用Thumb函数。 Thumb_ARM 在Thumb程序里调用ARM函数。Interwork ARM模式和Thumb模式的相互结合。此文件包含两个工程:? ?Measure Memory数据采集系统,用以收集模拟和数字信号。 用来示范怎样来分离变量到不同的内存区域。除了上面所列的这些通用的例程之外,在文件夹..\ARM\..\Boards里?Vision还提供了一些与硬件相关的工程。在JTAG调试中 将介绍这些例程的使用。 可通过菜单Project C Open Project来装载这些工程文件。本章以下部分介绍了怎样编译以下例程:? ?HELLO: 第一个ARM 例程 MEASURE:一个远程测量系统HELLO: 第一个ARM例程HELLO例程可在C:\KEIL\ARM\GNU\EXAMPLES\HELLO中找到,这个例程用来通过串口打印出字符串“Hello World”。在 HELLO.C中包含整个程序的源代码。 这个小程序可以用来验证应用程序的编译、链接、以及调试。可以使用工程文件在DOS命令行、或使用批处理文件、或 ?Vision环境中执行这些操作。例程HELLO/GNU是基于Atmel AT91M40800的。该例程使用了片上外设的串口。此外,?Vision还 可以为此例程仿真目标硬件而不需要实际上的CPU。HELLO 工程文件在?Vision里应用程序被组织在一个工程文件中。在工具栏Project中选择Open Project选项,选择路径 …file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh4...
GSARM: Getting Started User&#39;s GuidePage 20 of 46\ARM\GNU\EXAMPLES\HELLO,打开HELLO.UV2装载此工程。编辑HELLO.C在工程工作区的文件页面双击HELLO.C,编辑此文件。?Vision会在编辑窗口装载和显示的文件内容以供修改。编译、链接HELLO例程在工具栏Project中选择Build Target选项编译、链接工程。?Vision会编译链接源文件并生成一个绝对目标文件,这个目}

我要回帖

更多关于 arm 异常向量表 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信