Folder Structure

目录结构

安装程序将开发工具安装在 相应根目录下的子目录中，默认的根目录是C:\KEIL。 下表列出了Keil ARM 开发工具的目录结构。根据软件版本及安装目录的不同这种结构会有所不同。

在这个用户手册中，根据的是默认的文件夹结构。若在不同的文件夹安装软件，则必须调整路径名以与安装相对应。

ARM 开发工具

文件夹 | 内容
C:\KEIL\ARM\ARTX | 高级RTX实时操作系统。
C:\KEIL\ARM\BIN | µVision/ARM工具链的可执行文件。
C:\KEIL\ARM\INC | Keil C的包含文件及特定的C编译器包含文件。
C:\KEIL\ARM\ADS | ARM ADS/RealView™工具链的例程及启动文件。
C:\KEIL\ARM\GNU | GNU工具链的例程及启动文件。
C:\KEIL\ARM\Flash | Keil ULINK USB-JTAG Adapter Flash编程算法文件。
C:\KEIL\ARM\HLP | Keil ARM 工具链及µVision的在线帮助文档。
C:\KEIL\ARM\ ... \Startup | 特定设备的启动文件。
C:\KEIL\ARM\ ... \Examples | 基于Keil C、GNU 或ADS的一般例程。
C:\KEIL\ARM\ ... \Boards | 基于Keil C、GNU 或 ADS的评估板例程。

XC16x / C166 / ST10 开发工具

文件夹 | 内容
C:\KEIL\C166\AR166 | 高级RTX166实时操作系统。
C:\KEIL\C166\ASM | 宏汇编器的包含文件。
C:\KEIL\C166\BIN | µVision3/C166工具链的可执行文件。
C:\KEIL\C166\Boards | 评估板例程。
C:\KEIL\C166\Examples | 一般的例程。
C:\KEIL\C166\Flash | Keil ULINK USB-JTAG Adapter Flash编程算法文件。
C:\KEIL\C166\HLP | µVision3/C166在线帮助文档。
C:\KEIL\C166\INC | C和EC++编译器的包含文件。
C:\KEIL\C166\LIB | 运行时库及CPU启动文件。
C:\KEIL\C166\Monitor | Monitor-166 配置文件及预配置Monitor版本。
C:\KEIL\C166\OCDS | 片上调试系统和Keil ULINK的接口文件。
C:\KEIL\C166\RtxTiny | RTX166 微型实时操作系统。

C51 开发工具 (针对传统的及扩展的8051)

文件夹 | 内容
C:\KEIL\C51\ASM | 宏汇编器的源模板及包含文件。
C:\KEIL\C51\BIN | µVision3/C51 工具链的可执行文件。
C:\KEIL\C51\Examples | 例程
C:\KEIL\C51\FlashMon | Flash Monitor的配置文件及预配置版本。
C:\KEIL\C51\HLP | µVision3/C51在线帮助文档.
C:\KEIL\C51\INC | C编译器的包含文件.
C:\KEIL\C51\ISD51 | 针对ISD51在系统调试器的文件及预配置版本。
C:\KEIL\C51\LIB | 运行时库及CPU启动文件。
C:\KEIL\C51\Mon51 | Monitor-51配置文件 (针对传统8051设备)。
C:\KEIL\C51\Mon390 | Monitor-390配置文件 (针对Dallas Contiguous 模式) .
C:\KEIL\C51\RtxTiny2 | RTX51 微型版本2实时操作系统。

C251 开发工具

文件夹 | 内容
C:\KEIL\C251\ASM | 宏汇编器的包含文件
C:\KEIL\C251\BIN | µVision3/C51 工具链的可执行文件
C:\KEIL\C251\Examples | 例程
C:\KEIL\C251\HLP | µVision3/C166在线帮助文档
C:\KEIL\C251\INC | C编译器的包含文件
C:\KEIL\C251\LIB | 运行时库及CPU启动文件
C:\KEIL\C251\Mon251 | Monitor-251的配置文件

普通的µVision3 文件

Folder | Contents
C:\KEIL\UV3 | 普通的µVision3 文件。


Menu Commands, Toolbars, and Shortcuts

菜单命令、工具栏、快捷键

菜单栏提供如下菜单功能：编辑、工程维护、开发工具配置、程序调试、外部工具控制、窗口选择及操作及在线帮助等。工具栏按钮可以快速执行µVision 3的命令。状态栏 Status Bar 显示了编辑和调试信息。在 View Menu 中可以控制工具栏和状态栏是否显示。通过键盘快捷键可以快速执行µVision 3的命令，快捷键可以通过菜单命令 Edit – Configuration - Shortcut Key 来进行配置。

以下的章节列出了µVision 3的命令，它们可以通过菜单命令，工具栏按钮和快捷键来执行。在菜单栏中，µVision3 的命令是以外部特征来分类的。

  • File Menu and File Commands
  • Edit Menu and Editor Commands
    • Outlining Menu
    • Advanced Menu
    • Selecting Text Commands
  • View Menu
  • Project Menu and Project Commands
  • Debug Menu and Debug Commands
  • Flash Menu
  • Peripherals Menu
  • Tools Menu
  • SVCS Menu
  • Window Menu
  • Help Menu


File Menu and File Commands

File菜单和File命令

File 菜单 | 工具条 | 快捷键 | 功能描述
New |  | Ctrl+N | 创建新的源文件或文本文件
Open |  | Ctrl+O | 打开已存在的文件
Close |  |  | 关闭当前文件
Save |  | Ctrl+S | 保存当前文件
Save as... |  |  | 保存并重命名当前文件
Save All |  |  | 保存所有已打的源文件及文本文件包括工程和当前文件
Device Database |  |  | µVision3设备库的维护
License Management |  |  | 维护及查看已安装软件的组成
Print Setup... |  |  | 启动打印机
Print |  | Ctrl+P | 打印当前文件
Print Preview |  |  | 打印预览
1 - 9 |  |  | 打开最近使用的源文件或文本文件
Exit |  |  | 退出 µVision3


Edit Menu and Editor Commands

Edit菜单和Edit命令

Edit 菜单 | 工具条 | 快捷键 | 功能描述
 |  | Home | 将光标移到当前行的开始
 |  | End | 将光标移到当前行的结束
 |  | Ctrl+Home | 将光标移到当前文件的开始
 |  | Ctrl+End | 将光标移到当前文件的结束
 |  | Ctrl+Left Arrow | 将光标移到当前单词的左侧
 |  | Ctrl+Right Arrow | 将光标移到当前单词的右侧
 |  | Ctrl+A | 选中当前文件中的所有内容
 |  |  | 把光标返回到执行’find’或’go to line’命令前的位置
 |  |  | 把光标移到到执行’find’或’go to line’命令后的位置
Undo |  | Ctrl+Z | 撤消键入
Redo |  | Ctrl+Y | 恢复键入
Cut |  | Ctrl+X | 剪切
Copy |  | Ctrl+C | 复制
Paste |  | Ctrl+V | 粘贴
Indent Selected Text |  |  | 向右缩进选定的文本
Unindent Selected Text |  |  | I向左缩进选定的文本
Toggle Bookmark |  | Ctrl+F2 | 在当前行设置标签
Goto Next Bookmark |  | F2 | 将光标移到下一个标签
Goto Previous Bookmark |  | Shift+F2 | 将光标移到前一个标签
Clear All Bookmarks |  | Ctrl+Shift+F2 | 消除所有的标签
Find |  | Ctrl+F | 查找
 |  | F3 | 重复向前查找
 |  | Shift+F3 | 重复向后查找
 |  | Ctrl+F3 | 在光标之下查找
Replace |  | Ctrl+H | 替换
Find in Files... |  | Shift+Ctrl+F | 在几个文件内查找
Incremental Find |  | Ctrl+I | 增量查找
Outlining |  |  | 有关源代码的命令
Advanced |  |  | 编辑器命令
Configuration |  |  | 改变着色、字体、快捷键


Outlining Menu

Outlining 菜单

Outlining菜单在Edit -> Outlining下,它可以对源文件进行分组并隐藏分组。其菜单项条目如下表所示：

Outlining 菜单 | 工具条 | 快捷键 | 功能描述
Collapse Selection |  |  | 隐藏选定的文件内容
Collapse All Definitions |  |  | 隐藏所有程序
Collapse Current Block |  |  | 隐藏当前块
Collapse Current Procedure |  |  | 隐藏当前程序
Stop Current Outlining |  |  | 除去当前位置处的所有Outlining信息
Stop All Outlining |  |  | 除去整个文档的所有Outlining信息


Advanced Menu

高级(Advanced)菜单

高级菜单在Edit - Advanced下，它扩展了编辑器的特性。其菜单项条目如下表所示：

Advanced 菜单 | 工具条 | 快捷键 | 功能描述
Goto Matching Brace |  | Ctrl+E | 查找匹配的大括号、园括号或大括号
Tabify Selection的 |  |  | 在选定文本中用Tab替换空格
Untabify Selection |  |  | 在选定文本中用空格替换Tab
Make Uppercase |  | Shift+Ctrl+U | 把选定文本转化为大写字母
Make Lowercase |  | Ctrl+U | 把选定文本转化为小写字母
Delete Horizontal White Space |  |  | 删去选定文本中的空格或Tab
Comment Selection |  |  | 把选定的行转化为注释
Uncomment Selection |  |  | 把注释行转化为正常
Increase Line Indent with Text... |  |  | 对选定文本增加缩进
Decrease Line Indent with Text... |  |  | 对选定文本减少缩进
Cut current Line |  | Ctrl+L | 剪切当前行


View Menu

View 菜单

View 菜单 | 工具条 | 快捷键 | 功能描述
Status Bar |  |  | 显示或隐藏状态条(Status bar)
File Toolbar |  |  | 显示或隐藏文件工具条
Build Toolbar |  |  | 显示或隐藏编译工具条
Debug Toolbar |  |  | 显示或隐藏调试工具条
Project Workspace |  |  | 显示或隐藏工程空间
Output Window |  |  | 显示或隐藏输出窗口
Source Browser |  |  | 显示或隐藏浏览窗口
Disassembly |  |  | 显示或隐藏反汇编窗口
Watch & Call Stack Window |  |  | 显示或隐藏Watch & Call Stack 窗口
Memory Window |  |  | 显示或隐藏存储器窗口
Code Coverage Window |  |  | 显示或隐藏代码覆盖窗口
Performance Analyzer Window |  |  | 显示或隐藏性能分析窗口
Logic Analyzer Window |  |  | 显示或隐藏逻辑分析仪窗口
Symbol Window |  |  | 显示或隐藏符号窗口
Serial Window #1 |  |  | 显示或隐藏串行窗口 #1
Serial Window #2 |  |  | 显示或隐藏串行窗口#2
Serial Window #3 |  |  | 显示或隐藏串行窗口#3
Toolbox |  |  | 显示或隐藏工具箱
Periodic Window Update |  |  | 运行时更新调试窗口
Include Dependencies |  |  | 显示或隐藏源文件中的头文件


Project Menu and Project Commands

Project菜单和Project命令

Project 菜单 | 工具条 | 快捷键 | 功能描述
New Project... |  |  | 创建一个新工程
Import µVision1 Project... |  |  | 导入一个工程
Open Project... |  |  | 打开一个工程
Close Project |  |  | 关闭当前工程
Components, Environment, Books... |  |  | 维护工程组件、配置工具环境及管理书
Select Device for Target |  |  | 从设备库中选择CPU
Remove Item |  |  | 从工程中移出组或文件
Options for Target |  |  | 改变目标、组、文件的工具选项
 |  | Alt+F7 | 改变当前目标的工具选项
 |  |  | 选择当前目标
Build target |  | F7 | 翻译已修改的文件及编译应用
Rebuild all target files |  |  | 重新翻译所有的源文件并编译应用
Translate... |  | Ctrl+F7 | 翻译当前文件
Stop Build |  |  | 停止编译当前程序
1 - 9 |  |  | 打开最近使用的工程文件


Debug Menu and Debug Commands

Debug菜单和Debug命令

Debug 菜单 | 工具条 | 快捷键 | 功能描述
Start/Stop Debug Session |  | Ctrl+F5 | 启动或停止µVision3调试模式
Go |  | F5 | 运行到下一个活动断点
Step |  | F11 | 单步运行进入一个函数
Step Over |  | F10 | 单步运行跳过一个函数
Step Out of current Function |  | Ctrl+F11 | 从当前函数跳出
Run to Cursor Line |  |  | 运行到当前行
Stop Running |  | ESC | 停止运行
Breakpoints... |  |  | 打开断点对话框
Insert/Remove Breakpoint |  |  | 在当前行设置断点
Enable/Disable Breakpoint |  | Alt+F7 | Enable/disable当前行的断点
Disable All Breakpoints |  |  | 使程序中的所有断点无效
Kill All Breakpoints |  | F7 | 去除程序中的所有断点
Show Next Statement |  |  | 显示下一条要执行的指令
Enable/Disable Trace Recording |  | Ctrl+F7 | 使能跟踪刻录
View Trace Records |  |  | 浏览前面执行的指令
Execution Profiling |  |  | 记录执行时间
Setup Logic Analyzer |  |  | 打开逻辑分析仪对话框
Memory Map... |  |  | 打开存储器映射对话框
Performance Analyzer... |  |  | 打开性能分析仪对话框
Inline Assembly... |  |  | 打开在线汇编对话框
Function Editor (Open Ini File)... |  |  | 编辑调试函数及调试初始化文件


Flash Menu

Flash菜单

Flash菜单可以配置和运行Flash 编程设备。通过Configure Flash Tools?/b> ， 可选择并被配置编程工具，细节请参考配置Flash菜单小节。Flash菜单下的条目如下表所示：

Debug 菜单 | 工具条 | 快捷键 | 功能描述
Download |  |  | 按照配置下载到FLASH中
Erase |  |  | 擦除 Flash ROM (仅适用于一些设备).
Configure Flash Tools... |  |  | 打开对话框Options for Target - Utilities 配置Flash


Peripherals Menu

Peripherals菜单

Debug 菜单 | 工具条 | 快捷键 | 功能描述
Reset CPU |  |  | 重启CPU
Interrupts, I/O-Ports, Serial, Timer, A/D Converter, D/A Converter, I2C Controller, CAN Controller, Watchdog |  |  | 打开片上外设，这些外设对话框可能因为所选CPU的不同而不同


Tools Menu

Tool菜单

Tool菜单能够配置和运行Gimpel PC-Lint及自定义程序。通过Tools - Customize Tools Menu…，用户程序可以添加到此菜单下。详情请查阅Run External Programs 。Tool菜单下的条目如下表所示：

Tools 菜单 | 工具条 | 快捷键 | 功能描述
Setup PC-Lint… |  |  | 从Gimpel 软件配置PC-Lint
Lint |  |  | 根据当前编辑器文件运行PC-Lint
Lint all C Source Files |  |  | 通过工程中C源文件运行PC-Line
Customize Tools Menu... |  |  | 添加用户程序到Took菜单


SVCS Menu

SVCS菜单

SVCS菜单可以配置及添加SVCS命令。详情请查阅Using the SVCS Menu.Tool菜单下的条目如下表所示：

SVCS 菜单 | 工具条 | 快捷键 | 功能描述
Configure Version Control... |  |  | 配置SVCS命令


Window Menu

Window 菜单

Window 菜单 | 工具条 | 快捷键 | 功能描述
Cascade |  |  | 以重叠方式排列窗口
Tile Horizontally |  |  | 无重叠方式水平排列窗口
Tile Vertically |  |  | 无重叠方式垂直排列窗口
Arrange Icons |  |  | 在窗口底部排列窗口图标
Spilt |  |  | 划分当前窗口为多个方格
Close All |  |  | 关闭所有窗口
1 - 9 |  |  | 使选中窗口变为当前窗口


Help Menu

Help菜单

Help 菜单 | 工具条 | 快捷键 | 功能描述
µVision Help |  |  | 打开帮助文件
Open Books Window |  |  | 打开工程工作空间中的BOOKS标签
Simulated Peripherals for '...' |  |  | 有关所选CPU的外设信息
Internet Support Knowledgebase |  |  | Keil网站http://www.realview.com.cn/news-class-class.asp 的技术支持可解决一些常见问题
Contact Support |  |  | 通过论坛可以获得技术支持
Check for Update |  |  | 访问Keil网站http://www.realview.com.cn获得更新
About µVision... |  |  | 显示版本号及许可信息


Status Bar

状态栏

状态栏位于窗口的底部( View Menu被激活)，它显示了当前µVision的命令及其它一些状态信息，如下图所示：

Debug Channel : 显示了当前的调试工具；

Execution Time : 显示了执行时间；

Cursor Position : 显示光标位置；

Editor and Keyboard Status Information 显示：

  • CAP: Caps键有效
  • NUM: Num 键有效
  • SCRL: Scroll键有效
  • OVR: Insert键有效
  • R/W or R/O: 显示了当前编辑的文件的属性。R/W 表示可读写、R/O表示只读。


Create New Source Files

创建新的源文件

选择菜单选项File – New以创建一个新的源文件，选项会打开一个空的编辑窗口，用户可以在此窗口里输入源代码。如果以扩展名*.C保存文件，µVision3将以彩亮字体显示C源代码。本示例保存文件为MAIN.C。

#include <LPC210x.H>                       /* LPC210x definitions */

void wait (void)  {                        /* wait function */
  ;                                        /* only to delay for LED flashes */
}

int main (void)  {
  unsigned int i;                          /* Delay var */
  unsigned int j;                          /* LED var */

  IODIR = 0xFF;                            /* P0.0..7 defined as Outputs */
  while (1) {                              /* Loop forever */
    for (j = 0x01; j < 0x80; j <<= 1) {    /* Blink LED 0, 1, 2, 3, 4, 5, 6 */
      IOSET = j;                           /* Turn on LED */
      for (i = 0; i < 10000; i++)  {       /* Delay for 10000 Counts */
        wait ();                           /* call wait function */
      }
      IOCLR = j;                           /* Turn off LED */
    }
    for (j = 0x80; j > 0x01; j >>=1) {     /* Blink LED 7, 6, 5, 4, 3, 2, 1 */
      IOSET = j;                           /* Turn on LED */
      for (i = 0; i < 10000; i++)  {       /* Delay for 10000 Counts */
        wait ();                           /* call wait function */
      }
      IOCLR = j;                           /* Turn off LED */
    }
  }
}


File Extensions

文件扩展名

在Project->Components, Environment and Books->Folders/Extensions 对话框中，允许为工程中不同的文件类型设置文件扩展名，可以为一种文件类型设置几个扩展名，中间要以分号隔开。


Configuration Wizard

配置向导

µVision 3的配置向导通过菜单的方式对汇编程序、C程序或调试初始化文件进行配置。在配置文件中，对应这些配置菜单的是控制项(和html中的标签相似)，它们嵌入在配置文件的注释中。控制项的格式下面会详细的进行介绍。

包含配置向导的文件必须在前100行文本中声明如下语句，这样编辑器将以配置向导视图的形式打开配置文件。

<<< Use Configuration Wizard in Editor Context Menu >>>

配置向导段可通过如下的语句(可选的，即没有也可以)结束配置向导。

<<< end of configuration section >>>

配置菜单

配置菜单由items和modifiers进行控制的，各种配置向导控制项及含义见下表：

Item | 文本 | 描述
<h> | yes | Heading标题:表示以下选项在一个组中；
<e>§ | yes | Heading且Enable标题:表示以下选项在一个组中，选项可通过Checkbox使能；
<e.4>§ | yes | Heading且Enable 标题: 修改一个指定位 (例如第4位)
</h> or </e> | yes | 表示Heading标题、Heading且Enable标题结束
<i> | yes | 前一Item的工具帮助
<q>§ | yes | 带可显示checkbox的位值选项
<o>§ | yes | 选择项或数值输入选项
<o.4..5>§ | yes | 修改数值的指定位 (例如第4和第5位)
<o.4>§ | yes | 修改数值的某一位（第4位）
<s>§ | yes | 字符串输入选项
<s.10>§ | yes | 长度受限字符串输入选项(10 个字符)
Modifier | 文本 | 描述
<0-31> | no | 选项的取值范围；
<0-100:10> | no | 选项的取值范围，可调步数为10
<0x40-0x1000:0x10> | no | 十六进制格式的选项的取值范围及可调步数
<0=> | yes | 可选的值或文本
<#+1> <#-1> <#*8> <#/3> | no | 在该数据被使用前先做修改 (add, sub, mul, div)

注意：

  • 默认情况下，注释段后的一个数或字符串是通过注释段修改的。有§标志的项(如<o1>)表示可以指定一个值的范围(如<0-31>)；
  • Modifiers项后面是一段文本；
  • Items或modifiers中的空格符将被忽略；
  • 建议使用设备数据手册中的名字作为描述语句前的变量名。

例程

//*** <<< Use Configuration Wizard in Context Menu >>> ***

FUNC void Setup (void) {

// <h> External Bus Interface (EBI)

//   <e1.13> Enable Chip Select 0 (CSR0)
//     <o1.20..31> BA: Base Address <0x0-0xFFF00000:0x100000><#/0x100000>
//                 <i> Start Address for Chip Select Signal
//     <o1.7..8>   PAGES: Page Size      <0=> 1M Byte    <1=> 4M Bytes
//                                       <2=> 16M Bytes  <3=> 64M Bytes
//                 <i> Selects Active Bits in Base Address
//     <o1.0..1>   DBW: Data Bus Width   <1=> 16-bit     <2=> 8-bit
//     <o1.12>     BAT: Byte Access Type <0=> Byte-write
//                                       <1=> Byte-select
//     <e1.5>      WSE: Enable Wait State Generation
//       <o1.2..4>   NWS: Number of Standard Wait States <1-8><#-1>
//     </e>
//     <o1.9..11>  TDF: Data Float Output Time <0-7>
//                 <i> Number of Cycles Added after the Transfer
//   </e>
  _WDWORD(0xFFE00000, 0x010024A9);   // EBI_CSR0: Flash

//   <e1.13> Enable Chip Select 1 (CSR1)
//     <o1.20..31> BA: Base Address <0x0-0xFFF00000:0x100000><#/0x100000>
//                 <i> Start Address for Chip Select Signal
//     <o1.7..8>   PAGES: Page Size      <0=> 1M Byte    <1=> 4M Bytes
//                                       <2=> 16M Bytes  <3=> 64M Bytes
//                 <i> Selects Active Bits in Base Address
//     <o1.0..1>   DBW: Data Bus Width   <1=> 16-bit     <2=> 8-bit
//     <o1.12>     BAT: Byte Access Type <0=> Byte-write
//                                       <1=> Byte-select
//     <e1.5>      WSE: Enable Wait State Generation
//       <o1.2..4>   NWS: Number of Standard Wait States <1-8><#-1>
//     </e>
//     <o1.9..11>  TDF: Data Float Output Time <0-7>
//                 <i> Number of Cycles Added after the Transfer
//   </e>
  _WDWORD(0xFFE00004, 0x040034A5);   // EBI_CSR1: RAM

//   <q1.4>        DRP: Data Read Protocol
//                      <0=> Standard Read
//                      <1=> Early Read
  _WDWORD(0xFFE00024, 0x00000010);   // EBI_MCR:  Data Read Protocol

  _WDWORD(0xFFE00020, 0x00000001);   // EBI_RCR:  Remap Command

// </h>

// <o> Program Entry Point
  PC = 0x04000000;

}

// <s> Change ID
// <s1.30> Change Password String
#define ID  "My User ID"
char pw[] = "My Password";

当打开上面的例子时将产生如下对话框。


Find in Files

文本搜索

文本搜索对话框可实现指定文件中的文本搜索。在µVision IDE中，选择Edit->Find in Files，将弹出下图所示的文本搜索对话框。

上图的设置将在C:\Keil文件夹及子文件夹的所有.c文件中搜索文本“printf”，搜索结果见下图。双击搜索到的文本，编辑器将会自动定位到源文件中的相应部分。


Source Browser

源浏览器

源浏览器可显示程序中的所有符号信息，如符号名、种类、类型、存储空间和使用次数等。如果在编译目标程序的时候选择了Options for Target-> Output-> Browser Information选项，则编译器中会将这些浏览信息导入目标文件。单击菜单项View->Source Browser可打开源浏览器窗口，开发者可观看下图所示的符号信息。

通过设置上图中的各种选项，可将信息进行分类显示，下表列出这些选项所对应的信息过滤功能。

浏览选项 | 描述
Symbol | 设定一个带通配符的字符串来过滤符号名，该字符串可由字母和通配符组成，其中：# 匹配数字0-9、$ 匹配任意字符、* 匹配0或更多字符。
Filter on | 选择定义为某个类型的符号。
File Outline | 选择信息应该被列出的文件。
Memory Spaces | 为数据和功能符号指定所使用内存空间的类型。

下表给出了几个带通配符字符串过滤符号名的例子。

通配符字符串 | 描述
* | 匹配所有符号名，是源浏览器默认的通配符字符串。
*#* | 符号名中任意位置包含一个数字。
_a$#* | 符号名以下划线开头，后跟着字符“a”，再后面接任意字符，然后再接一个数字，最后以0或更多字符结尾。例如，_ab1 或 _a10value。
_*ABC | 符号名以下划线开头，后跟0或更多字符，再后面接“ABC”。

在源浏览器窗口中，选中某个符号项单击鼠标右键，在弹出的菜单中可以选择相关符号信息的编辑按钮，如显示函数调用、在源程序中定位符号定义的位置等等。对于函数而言，可显示函数的调用及调用图。在上图右侧Definitions and References view窗口可显示更多的相关信息，其中标示符号所表示的意义见下表。

标识符号 | 描述
[D] | 定义
[R] | 引用
[r] | 可读
[w] | 可写
[r/w] | 可读可写
[&] | 地址引用

在源浏览器窗口中，可使用快捷键来搜速和定位符号信息，如符号的定义、引用等。详细信息见下表。

快捷方式 | 描述
F12 | 跳至定义处，光标将位于定义该符号之处。
Shift+F12 | 跳至引用处，光标将位于一个引用该符号之处。
Ctrl+Num+ | 跳至下一个引用之处或定义之处。
Ctrl+Num- | 跳至上一个引用之处或定义之处。


Using the SVCS Menu

使用SVCS 菜单

µVision 3 为软件版本控制系统SVCS(Software Version Control Systems) 提供了一个可编程的接口，可为Intersolv PVCS、Microsoft SourceSafe、MKS Source Integrity和Rational Clear Case提供了预配置模板文件。µVision 3集成的CVS (Concurrent Versions System)是一个遵守GNU GPL协议的软件版本控制系统，可以自由使用，详细信息请参考应用笔记 179: µVision3可集成的CVS 。

SVCS菜单的配置保存在模板文件中，通过SVCS菜单可以调用许多版本控制系统的命令行工具。SVCS菜单通过SVCS->Customize SVCS Menu…对话框对进行配置，对话框选项的详细信息见下表。SVCS菜单配置中，可使用键码序列指定工程的名字、文件名字或其他的工程参数，具体用法请参考 键码序列 。

对话框项 | 描述
Template File | 菜单配置文件的名，建议软件开发团队中所有成员使用同一模本名，因此该模板文件可放在文件服务器上。
User Name | 注册到SVCS系统的用户名，在参数行中这个用户名用文件%U键码序列表示。
Database | 被SVCS系统使用的数据库的文件名和路径，在参数行中数据库字符串用文件码%V键码序列表示。
Menu Content | 菜单项所显示的文字，此行通常包含键码和文件码，快捷方式用前缀“&”字符定义。这个被选中菜单项允许在下面的选项列表中指定。
Query for … Comment | 要求加入评注，此评注将被复制到临时文件中，用文件码%Q键码序列加路径及文件名表示，在SVCS命令中可作为参数。
Query for Revision | 要求版本信息，用文件码%R键码序列加字符串表示。
Query for CheckPoint | 要求输入检测点信息，用文件码%C键码序列加字符串表示。
Run Minimized | 允许应用程序执行时窗口最小化选项。
Command | 当单击菜单项时程序将被调用的文件。
Arguments | 传递给SVCS程序的命令行参数。
Environment | 在SVCS程序执行之前设置的环境变量。

SVCS应用程序命令行的输出保存在一个临时文件中。当SVCS命令执行完后，临时文件的内容将会显示在Output Window窗口的Build页。uVision3工程分别保存在两个文件中。工程设置保存在*.UV2文件中，它受SVCS的控制，而本地uVision3配置保存在*.OPT文件中，包括窗口的位置和调试设置。

下表显示了一个典型版本控制系统的菜单项。根据配置的不同，版本控制系统的菜单项也不完全相同。

SVCS 菜单项 | 描述
Explorer | 启动交互浏览器。
Check In | 将文件保存至SVCS数据库，并令本地副本只读。
Check Out | 从SVCS中获取实际文件版本号，并允许修改。
Undo Check Out | 撤销文件的前一个 check out。
Put Current Version | 将文件保存至SVCS数据库，但本地副本仍可修改只读。
Get Actual Version | 从SVCS中获取一个文件的当前只读副本。
Add file to Project | 添加一个文件到SVCS中。
Differences, History | 显示一个文件的SVCS历史变化信息
Create Project | 产生一个与本地µVision3工程名相同的SVCS工程。

注意：

  • 预配置的*.SVCS文件可用文本编辑器修改以适应程序的路径和工具参数。

  • 当选择了一个新的µVision 3工程以后，Microsoft SourceSafe需要用命令设置当前的工程。从配置文件中删除SSUSER环境变量以便使用工作站名登陆。

  • 在服务器和工作站的本地工作区上，MKS Source Integrity被预配置创建工程数据库。

  • 创建和维护工程时，Intersolv PVCS未被预配置。


Key Sequence for Tool Parameters

键码序列

键码序列(Key Sequence)用于从µVision 3向外部程序传递参数，可应用在工具菜单、SVCS菜单及Options for Target->Output对话框中Run User Program项的参数设置中。键码序列是由键码(Key Code)和文件码(File Code)组成，详细信息请参考下表：

键码 | 通过文件码所指定的路径
% | 带扩展名的文件名，但不指定文件路径 (例如：PROJECT1.UV2)
# | 带扩展名且包含完整路径的文件名(例如：C:\MYPROJECT\PROJECT1.UV2)
@ | 不带扩展名和路径的文件名 (例如：PROJECT1)
$ | 文件所在的文件夹 (例如：C:\MYPROJECT)
! | 文件名包含当前路径的相对路径 (例如：SRC\TEST.C)
~ | 光标所在位置的行数 (仅对文件码F有效)
^ | 光标所在位置的列数 (仅对文件码F有效)

说明：

1. 键码~和^必须 和文件码F一起使用；

2. 如果要在程序命令行中使用$、#、%、@、~ 或^，必须使用$$、##、%%、@@、~~ 或^^这样的形式。例如在程序命令行中@@表示单个的@符号。

文件码 | 在用户程序行中插入指定的文件名或参数
$D | 表示从µVision 3设备库中所选择设备的名称
E | 表示编辑器中当前的文件
F | 表示Project Workspace->Files页中所选择的文件 (例如：Measure.C)，如果是目标文件名被选中则表示工程文件，如果是一个组的名被选中则表示当前编辑器激活的文件。
K | 表示开发工具的根目录 (例如：C:\Keil)
L | 表示链接输出文件，典型的调试器所使用可执行文件 (例如：PROJECT1)
H | 表示应用HEX文件 (例如：PROJECT1.H86)
P | 表示当前工程文件(例如：PROJECT1.UV2)
X | 对于键码：%, # @，表示µVision 3中可执行文件 (例如：C:\Keil\UV3\UV3.EXE)
$X | 对键码$，表示在Options for Target - Target – XTAL下XTAL的频率设置以MHz为单位
^X | 对键码^，表示在Options for Target - Target – XTAL下XTAL的频率设置以kHz为单位
以下文件码用于 SVCS系统：
Q | 文件名为 SVCS系统的注释
R | SVCS系统的版本号字符串
C | SVCS系统的检测点字符串
I | 用于 SVCS系统的SVCS->Configure Version Control->Project Ident字符串
U | SVCS - Configure Version Control - User Name 下指定的用户名
V | SVCS - Configure Version Control – Database下指定的文件名

说明：文件码Q、R、C、U和V必须和键码%一起使用。


Running PC-Lint

运行PC-Lint

Gimpel软件公司的PC-Lint可以检查应用程序所有模块的C语法和语意错误。PC-Lint可以标记可能的错误或不一致的、定位不清晰的、错误的或不合理的代码。因此，PC-Lint可以有效的提高目标应用程序的调试效率。

在PC上安装PC-Lint，在Tools – Setup PC Lint对话框中输入参数。下面的例子显示了典型的PC-Lint配置。

为了在Build页得到正确的输出，用户必须使用在文件夹KEIL\ARM\BIN中的配置文件。

安装PC-LINT以后就可以检查源代码了，Tools – Lint …用于检查编辑器打开的当前C源文件，Tools – Lint All C Source Files用于检查工程中所有C源文件。PC-Lint得到的信息将重新定位到Build – Output窗口中显示。双击Lint信息行编辑器将会定位到相应的源代码行。

为了在Build – Output Window窗口中得到正确的结果，PC-Lint需要在配置文件中需要下列选项行：

-hsb_3 // 3 lines output, column below
-format="*** LINT: %(%f(%l) %)%t %n: %m" // Change message output format
-width(0,10) // Don't break lines

每一个工具集都需要使用特定的PC-LINT配置文件，以便与不同的编译器对应。这些配置文件包含了所有的PC-LINT相关的配置选项。强烈推荐使用下表所示的配置文件，因为它们同时包含了各种编译器的其他PC-LINT选项。

PC-LINT 配置文件 | 描述
..\C51\BIN\CO-KC51.LNT | Keil C51和CX51的PC-LINT 配置文件
..\C251\BIN\CO-KC251.LNT | Keil C251的PC-LINT 配置文件
..\C166\BIN\CO-KC166.LNT | Keil C166中C16x和ST10设备的PC-LINT 配置文件
..\C166\BIN\CO-KC166XC.LNT | Keil C166中XC16x的PC-LINT 配置文件
..\ARM\BIN\CO-KCARM.LNT | Keil CARM的PC-LINT 配置文件


Using BKR EasyCODE

使用BKR EasyCODE

通过DTC 接口使BKR EasyCODE和µVision3相连接。使用EasyCODE菜单激活Options - Settings - Debug/DTC - DTC Debug/Make Interface项。当运行µVision3时，EasyCODEthe中的DTC菜单提供了访问几个µVision3功能。用户可以编译应用程序、控制µVision调试功能。EASYCODE的更多信息请参考EASYCODE, Inc. 或EASYCODE GmbH。

下图显示了µVision3调试时在EasyCODE中DTC的状态输出。

用户可以向Y工具菜单 中添加菜单项以便在中快速访问EasyCODE。下图的输入可以使能EasyCODE编辑器打开当前µVision编辑器文件。


DTC Interface

DTC接口

另外，µVision3提供了标准的DTC(开发工具连接)接口用于IDE和调试器的远程控制。 例如，第三方工具BKR EasyCODE可使用DTC启动工程编译以及同步调试器。 应用 笔记 170: 开发工具连接(DTC) 接口 提供了这个接口的详细信息。


Application Program Execution

应用程序的执行

µVision3提供如下几种执行应用程序的方式：

  • 使用调试菜单调试命令Debug Menu and Debug Commands.
  • 使用快捷菜单中的Run till Cursor line命令，在编辑或反汇编窗口中的代码行上单击右键就可以打开此快捷菜单。
  • 在Output Window – Command页中使用Go, Ostep, Pstep, Tstep命令。


CPU Registers

CPU 寄存器

在在Project Workspace -> Regs 页中，列出了CPU的寄存器，选中指定寄存器并单击，或按F2键便可以出现一个编辑框，从而可以改变此寄存器的值。


Serial Window

串行窗口

µVision 3 提供了两个串行窗口用于串行输入及输出的交互。仿真的CPU输出的数据会在此窗口中显示，同时在此窗口中输入的字符也会被输入到仿真的CPU中。

µVision 3在不需要外部硬件的情况下，可以仿真CPU的UART，在Output Window – Command页中使用ASSIGN命令也可以将串口输出指定为PC的COM口。


Toolbox

工具箱（Toolbox）

Toolbox中包含用户可配置的按钮。点击工具箱上的按钮可以执行相关的调试命令（debug command） 或调试函数（debug function）。工具箱按钮可以在任何时间执行，甚至是运行测试程序时。

可以在 Output Window – Command 页中使用 DEFINE BUTTON 命令来定义工具箱按钮。

语法格式如下：

>DEFINE BUTTON "button_label", "command"

button_label:显示在工具箱按钮上的名字；

command:当此按钮被按下时要执行的命令。

下在的例子说明了如何使用命令来定义如上图所示的工具箱按钮：

>DEFINE BUTTON "Decimal Output", "radix=0x0A">DEFINE BUTTON "Hex Output", "radix=0x10"
>DEFINE BUTTON "My Status Info", "MyStatus ()" /* call debug function */
>DEFINE BUTTON "Analog0..5V", "analog0 ()" /* call signal function */
>DEFINE BUTTON "Show R15", "printf (\"R15=%04XH\\n\")"

注意

  • 在上面最后一个按钮定义中，定义的printf命令使用了上面介绍的嵌套字符串。格式字符串中的双引号(") 和反斜杠符号(\)必须为使用“\”进行转意以避免语法错误。

可以使用KILL BUTTON命令，指定按钮号来移除工具箱Toolbox 中的按钮。例子:

>Kill Button 5 /* Remove Show R15 button */

注意

  • 工具箱中的更新窗口按钮Update Windows button 是自动被生成的，不可删除。在程序执行期间它可以用于更新几个调试窗口。


Expressions

表达式

许多调试命令都可采用数字表达式作为参数。数字表达式是一个数字或者包含数字、调试对象和操作符的复杂表达式 ，表达式可由以下成分组成：

成分 | 描述
Bit Addresses | 指示可位寻址的数据存储区的位址值
Constants | 固定点数值和字符串。
Line Numbers | 用于指明可执行程序的代码的位置。当编译和汇编一个程序时，编译器和汇编器将在生成的目标代码中加入line number。
Operators | 运算符包括+, -, *, 和 /等，可用于表达式和子表达式中。所有 C 语言程序中可以使用的运算符这里都可以使用。
Program Variables | 目标程序中的变量，通常称为符号和符号名。
System Variables | 可影响和改变µVision的操作。
Peripheral Variables | 用于访问模拟片上外设。
Type Specifications | 用于指定子表达式和表达式的数据类型。


Bit Addresses

位地址

位地址代表了存储器中的位。这包含特殊功能寄存器中的位。位地址的语法是expression . bit_position

例子
R6.2                                      /* Bit 2 of register R6 */
0xFD00.15                                 /* Value of the 166 bit space */


Type Specifications

类型说明

在表达式中µVision3会自动地执行隐式类型转换，也可以显示地把表达式转化为指定的数据类型。 类型转换的规则遵循C语言的类型转换规则。例如，

(unsigned int) 31.2                       /* gives unsigned int 31 from the float value */


Operators

操作符

µVision3 支持所有C编程语言的操作符，且操作符与C语言中对应的操作符有相同的含义。


Expression Examples

表达式例

下面的表达式都是在Output Window的Command页输入的。所有可用的输出包含在各个例子中，例子MEASURE被用到所有的其他的例子中。

常量
>0x1234                               /* Simple constant */
0x1234                                /* Output */
>EVAL 0x1234
4660T 11064Q 1234H '...4'             /* Output in several number bases */
寄存器
>R1                                   /* Interrogate value of register R1 */
0x000A                                /* Address from ACC = 0xE0, mem type = D: */
>R1 = --R7                            /* Set R1 and R7 equal to value R7-1 */
函数符号
>main                                 /* Get address of main() from MEASURE.C */
0x00233DA                             /* Reply, main starts at 0x233DA */

>&main                                /* Same as before */
0x00233DA

>d main                               /* Display: address = main */
0x0233DA: 76 E2 00 04 76 E3 00 04 - 66 E3 FF F7 E6 B6 80 00 v...v...f......
0x0233EA: E6 B7 00 00 E6 5A 40 00 - E6 D8 11 80 E6 2A 3C F6 .....Z@......*<
0x0233FA: E6 28 3C F6 E6 CE 44 00 - BF 88 E6 A8 40 00 BB D8 .(<...D.....@..
0x02340A: E6 F8 7A 40 CA 00 CE 39 - E6 F8 18 44 CA 00 CE 39 ..z@...9...D...
地址使用例
>&\measure\main\cmdbuf[0] + 10                         /* Address calculation */
0x23026

>_RBYTE (0x233DA)                                      /* Read byte from code address 0x233DA */
0x76 /* Reply */
符号输出例
>dir \measure\main                                     /* Output symbols from main() in module MEASURE */
  R14 idx . . . uint                                   /* Output */
  R13 i . . . uint
  0x0002301C cmdbuf . . . array[15] of char
程序计数器例
>$ = main                                             /* Set program counter to main() */
>dir                                                  /* points to local mem sym. from main() */
    R14 idx . . . uint                                /* Output */
    R13 i . . . uint
    0x0002301C cmdbuf . . . array[15] of char
程序变量例
>cmdbuf                                               /* Interrogate address from cmdbuf */
0x0002301C                                            /* Output of address due to aggregate type (Array)*/
>cmdbuf[0]                                            /* Output contents of first array element */
0x00
>i                                                    /* Output contents from i */
0x00
>idx                                                  /* Output contents from idx */
0x0000
>idx = DPP2                                           /* Set contents from index equal to register DPP2 */
>idx                                                  /* Output contents from idx */
0x0008
行号例
>\163                                                 /* Address of the line number #104 */
0x000230DA                                            /* Reply */
>\MCOMMAND\91                                         /* A line number of module MCOMMAND */
0x000231F6
操作符例
>--R5                                                 /* Auto-decrement also for CPU registers */
0xFE
>mdisplay                                             /* Output a PUBLIC bit variable */
0
>mdisplay = 1                                         /* Change */
>mdisplay                                             /* Check result */
1
结构体例
>save_record[0]                                       /* Address of a record */
0x002100A
>save_record[0].time.hour = DPP3                      /* Change struct element of records */

>save_record[0].time.hour /* Interrogation */
0x03
µVision3调试函数调用例
>printf ("µVision3 is coming!\n")                     /* String constant within printf() */
µVision3 is coming!                                   /* Output */
>_WBYTE(0x20000, _RBYTE(0x20001))                     /* Read & Write Memory Byte */
>                                                     /* example useful in debug functions */
>interval.min = getint ("enter integer: ");
完全限制符号例
>--\measure\main\idx /* Auto INC/DEC valid for qualified symbol */
0xFFFF


Simulate I/O Ports

I/O口仿真

µVision3所提供的对话框可以显示所有I/O口的状态。I/O引脚通过VTREGs表示，可以与信号函数或断点一起使用，如下例程所示。

// in your C user program
PortAvalue = PIOA_PDSR; // read Port A input

在µVision3 仿真器中定义的断点:

bs write PORT3, 1, "printf (\"Port3 value=%X\\n\", PORT3)"
bs read PORT5, 1, "PORT5 = getint (\"Input Port5 value\")"

在执行C程序时，µVision3会请求得到一个Port 5的输入值。若一个新的输出值被写入到端口Port3，在Output Window - Command页将会打印出一条相应信息，详情可参考CPU Pin Registers (VTREGs).


Assign Serial I/O to a PC COM Port

用PC的COM 口仿真目标串口

ASSIGN命令可以使用PC的COM口作为µVision3仿真器的UART输入。若键入了如下命令，串行I/O将通过PC机的COM2来实现。变量STIME=0允许忽略串口的时序，也就是采用及时时序。

>MODE COM2 9600, 0, 8, 1                  /*9600 bps, no parity, 8 data & 1 stop bit*/
>ASSIGN COM2 <S0IN >S0OUT                 /*ASC0 output & input is done with COM2:*/
>S0TIME = 0                               /*ignore timing of simulated ASC0 interface*/


Check Illegal Memory Accesses

检查非法内存访问

有时需要检查非法的内存访问。µVision3的断点访问及系统变量 _break_可用于此目的。在下面的例子中，当数组save_record在函数 clear_records外被访问时，程序会停止执行。


Command Input from File

从文件中输入命令

µVision3调试器的命令可以通过INCLUDE命令从文件中读取。在Options for Target - Debug 下可指定一个由调试命令组成的Initialization File ，参考Set Debug Options可以获得得到更多信息。


Preset I/O Ports or Memory Contents

预置I/O口或存储器的内容

一些应用程序要求在调试之前预先设置I/O口的值及存储内容。在调试初始化文件中可以包含一些预置仿真器的命令。例如：

PORT3 = 0                                      /* set Port3 to zero */
LOAD MEMORY.HEX                                /* load hex file contents to memory */
                                               /* use the SAVE command to save memory contents */


Write Debug Output to a File

写调试输出到文件

命令LOG和SLOG可被用于写调试输出文件。使用批处理文件可以运行µVision3调试器，通过使用包含这些命令的调试初始化文件可以实现自动程序测试。

>LOG >>C:\TMP\DEBUGOUT.TXT                     /* protocol Output Window - Command page*/
>SLOG >>C:\TMP\DEBUGOUT.TXT                    /* protocol Serial Window output */
>                                              /* Output of the Command page and the Serial Window is written to file */
>LOG OFF                                       /* stop Output Window protocol */
>SLOG OFF                                      /* stop Serial Window protocol */


Use Keyboard Shortcuts

使用快捷键

µVision3菜单命令Edit – Configuration - Shortcut Key 允许为所有菜单条目配置快捷键。通过这个对话框可以设置个性化的µVision3。例如，可以在编辑窗口中添加一个快捷键用于插入/移除断点。


ASSIGN

语法 | 描述
ASSIGN | 显示串行端口I/O 的分配。
ASSIGN channel < inreg > outreg | 改变串行端口I/O 的分配。

ASSIGN命令用于显示和修改特定串行端口的输入和输出。

下表显示了支持的端口及默认的输入寄存器（Inreg）和输出寄存器(Outreg)。

端口 | 默认Inreg | 默认Outreg | 默认
COM1 | None | None | PC上的COM口port1.
COM2 | None | None | PC上的COM口port2.
COM3 | None | None | PC上的COM口port3.
COM4 | None | None | PC上的COM口port4.
WIN | SIN or S1IN | SOUT or S1OUT | 串行窗口.

目前，基于windows的µVision3支持下列端口：WIN, COM1, COM2, COM3, and COM4。WIN端口是串行窗口，COMx端口代表了PC机的串行通讯端口，通过它可以进行仿真CPU与目标程序间进行通讯。但必须使用MODE 命令对PC机的串行端口进行参数设置。

输入寄存器和输出寄存器的名字是由从设备库中所选CPU定义的，可用的VTREGs可以通过命令 DIR VTREG 列出。

例子
>ASSIGN                     /* Display serial assignment                */
  WIN: <S0IN >S0OUT         /* S0IN provides serial input &             */
                            /* S0OUT provides serial output             */
>
>ASSIGN WIN <S1IN >S1OUT    /* Assign S1IN & S1OUT to the Serial window */
>ASSIGN                     /* And display the assignment               */
  WIN: <S1IN >S1OUT

>ASSIGN COM1 < SIN > SOUT   /* Assign SIN & SOUT to COM1                */

注意

  • 当µVision3调试器与硬件驱动会话时，在目标模式下ASSIGN命令不可用。

  • 波特率及其它串口参数要通过MODE命令进行设置。

  • PC机的串口（COM口）仅支持8位数据，因此不可能生成多于8位的数据，然而在一些微控制器的UART接口上却是可能的。


BreakAccess

语法 | 描述
BreakAccess READ exp, len, cnt , "cmd" | 设置读访问断点
BreakAccess WRITE exp, len, cnt, "cmd" | 设置写访问断点
BreakAccess READWRITE exp, len, cnt, "cmd" | 设置读/写访问断点

BreakAccess 命令是BreakSet 命令的一个变体，它为被访问的断点指定一个以字节为单位的地址范围（len）。参数len是一个用于指定地址范围的表达式，在该地址处触发断点。其它性质与BreakSet 命令相同。


BreakDisable

语法 | 描述
BreakDisable number , number… | 使指定的断点为不可用状态，但并不是删除。Numbers是断点被定义时分配的号码defined.
BreakDisable * | 使所有断点不可用

BreakDisable 命令用于使先前定义的断点不可用。当遇到一个断点时，µVision3会停止执行或执行一个特定的命令。一个不可用断点的定义仍然会在断点列表中， 但是在执行目标程序时µVision3会忽略这个断点。

例子
>BL                                 /* List breakpoints        */

 0: (E C: 0xFF01EF) 'main', CNT=1, enabled
 1: (E C: 0xFF006A) 'timer0', CNT=10, enabled
     exec ("MyRegs()")

>BD 0                               /* Disable breakpoint 0    */
>BD *                               /* Disable all breakpoints */
>BL                                 /* List breakpoints        */

 0: (E C: 0xFF01EF) 'main', CNT=1, disabled
 1: (E C: 0xFF006A) 'timer0', CNT=10, disabled
     exec ("MyRegs()")

可以通过对话框 Breakpoints使断点不可用，这个对话框可以从主菜单Debug – Breakpoints….打开。


BreakEnable

语法 | 描述
BreakEnable number , number… | 使指定断点可用。Numbers是断点被定义时分配的号码。
BreakEnable * | 使所有断点可用。

BreakEnable 命令可使先前定义了但被BreakDisable命令变为不可用的断点变为可用。当遇到一个断点时，µVision3会停止执行或执行一个特定的命令。

例子
>BE 0,1                        /* Enable breakpoints 0 and 1   */
>BE *                          /* Enable all breakpoints       */
>BL                            /* List current breakpoints     */

 0: (E C: 0xFF01EF) 'main', CNT=1, enabled
 1: (E C: 0xFF006A) 'timer0', CNT=10, enabled
     exec ("MyRegs()")

可以通过对话框 Breakpoints使断点不可用，这个对话框可以从主菜单Debug – Breakpoints….打开。


BreakKill

语法 | 描述
BreakKill number , number… | 移除指定的断点。Numbers是断点被定义时分配的号码。
BreakKill * | 移除所有断点。

BreakKill 命令用于移除先前由BreakSet 命令定义的一个断点。

例子
>BK 0,1                        /* Remove breakpoints 0 and 1   */
>BK *                          /* Remove all breakpoints       */

可以通过对话框 Breakpoints使断点不可用，这个对话框可以从主菜单Debug – Breakpoints….打开。


BreakList

语法 | 描述
BreakList | 列出所有断点

BreakList 命令用于列出所在断点。断点在每行中以如下格式列出：

number: (type) 'expression', CNT=count, enable_flag
        exec ("command")
其中: |
number | 断点的索引。当断点被创建时µVision3会分配这个号码。在使用BreakEnable, BreakDisable或 BreakKill 命令时可以使用它。
type | 断点类型，可以是执行断点（e：后为地址）、条件断点（c：后为地址）或者是访问断点（a后为rd的是可读的，为wr可写的，为rw为可读写的，再后面是地址）。
expression | 断点定义的原始表示。
count | 经过断点的次数，若它的值为2，当第二次遇到该断点时µVision3停止程序的执行。
enable_flag | enabled代表可用断点，或 disabled 代表一个不可用断点。
command | 当遇到断点时要执行的命令。
例子
>BL                                          /* List current breakpoints */
 0: (E C: 0xFF01EF) 'main', CNT=1, enabled
 1: (E C: 0xFF006A) 'timer0', CNT=10, enabled
     exec ("MyRegs()")
 2: (C) 'sindex == 8', CNT=1, enabled
 3: (C) 'save_record[5].time.sec > 5', CNT=3, enabled
 4: (A RD 0x000037) 'READ interval.min == 3', CNT=1, enabled
 5: (A WR 0x000034) 'WRITE savefirst==5 && acc==0x12', CNT=1, enabled

可以通过对话框 Breakpoints使断点不可用，这个对话框可以从主菜单Debug – Breakpoints….打开。


COVERAGE

语法 | 描述
COVERAGE | 显示整个应用程序的统计分析信息。
COVERAGE \module | 显示选定模块module的代码统计分析信息。
COVERAGE \module\func | 显示模块module中函数func的符号的代码统计分析信息。

使用 COVERAGE 命令显示µVision3 调试器的代码统计分析信息。可用这个命令及 LOG命令把统计分析信息拷贝到一个日志文件中。

除了COVERAGE 命令外，也可以使用Code Coverage窗口来查看代码统计分析信息。这个窗口可以通过View - Code Coverage Window...打开

例子

下面的例子是使用C51编译包中的MEASURE例程生成的。

\\Measure\MEASURE\{CvtB} - 32% of 52 instructions executed
\\Measure\MEASURE\{CvtB} - 0% of 127 instructions executed
\\Measure\MEASURE\{CvtB} - 100% of 1 instructions executed
\\Measure\MEASURE\{CvtB} - 100% of 6 instructions executed
\\Measure\MEASURE\{CvtB} - 0% of 595 instructions executed
\\Measure\MEASURE\{CvtB} - 0% of 5 instructions executed
\\Measure\MEASURE\{CvtB} - 100% of 1 instructions executed
\\Measure\MEASURE\SAVE_CURRENT_MEASUREMENTS - 0% of 46 instructions executed
\\Measure\MEASURE\TIMER0 - 72% of 94 instructions executed
\\Measure\MEASURE\READ_INDEX - 0% of 64 instructions executed
\\Measure\MEASURE\CLEAR_RECORDS - 100% of 24 instructions executed
\\Measure\MEASURE\MAIN - 31% of 215 instructions executed
\\Measure\MCOMMAND\{CvtB} - 0% of 74 instructions executed
\\Measure\MCOMMAND\MEASURE_DISPLAY - 100% of 44 instructions executed
\\Measure\MCOMMAND\SET_TIME - 0% of 58 instructions executed
\\Measure\MCOMMAND\SET_INTERVAL - 0% of 101 instructions executed
\\Measure\GETLINE\GETLINE - 78% of 51 instructions executed
\\Measure\TOUPPER\{CvtB} - 100% of 18 instructions executed
\\Measure\TOUPPER\{CvtB} - 51% of 91 instructions executed
\\Measure\TOUPPER\{CvtB} - 0% of 0 instructions executed


DIR

语法 | 描述
DIR | 显示当前模块中的符号名。
DIR \module | 显示模块module中的符号.
DIR \module LINE DIR \module\func LINE | 显示当前的或指定的模块或函数的行号信息
DIR \module\func | 显示模块module中的函数func中的符号。
DIR BFUNC | 显示µVision3的所有预定义函数名。
DIR DEFSYM | 显示由DEFINE 命令定义的符号名。
DIR FUNC | 显示µVision3的所有函数名。
DIR LINE | 对当前模块显示行信息。
DIR MODULE | 显示目标程序中的模块名。
DIR PUBLIC | 显示所有全局符号名。
DIR SIGNAL | 显示所有用户定义的信号函数名。
DIR UFUNC | 显示所有用户定义函数名。
DIR VTREG | 显示CPU驱动支持的所有CPU引脚寄存器的名字。

可以使用DIR 命令显示不同类型的符号，当仅使用DIR而无额外的参数时，当前模块的符号名被显示。若模块的地址空间被程序记数器（$）指示，那么此模块就是当前模块。在目标程序载入时µVision3决定分配给模块的地址域。

µVision3 有各种内部符号表，它的内容可以使用DIR 及其选项来显示。

DIR 命令选项 | 描述
\module \module\func | 显示指定的要输出的模块或函数的符号。
BFUNC | 显示预定义µVision3 函数名。这个函数总是可以使用的且不能被删除或重定义。
DEFSYM | 显示由DEFINE命令定义的符号，详情参考DEFINE 。 使用这个选项，由 'DEFINE <type><name>' 命令定义的符号被允许输出。
FUNC | 显示所有当前定义的µVision3函数的名字及原型。它包括：预定义函数，用户定义函数及信号函数。 注意，µVision3的函数与目标程序中的函数不同。
LINE \module LINE \module\func LINE | 显示当前模块，指定模块或指定的函数的行号信息。
MODULE | 显示目标程序中所有模块的名字，目标程序必须被载入
PUBLIC | 显示所有全局符号名。这些目标在汇编语言中具有PUBLIC 属性，非静态C变量也包括在此组中。
SIGNAL | 显示信号函数名，信号函数也是用户函数，它在后台进行处理。它们用于为端口输入提供信号形式。
UFUNC | 显示µVision3用户函数名。用户函数就是用户定义的函数。
VTREG | 显示从设备库中选择的当前CPU支持的CPU引脚寄存器名。
例子

下面的例子是使用C51编译包中的MEASURE例程生成的。

DIR MODULE

>DIR MODULE      /* all module names */
  MEASURE
  MCOMMAND
  GETLINE
  ?C_FPADD
  ?C_FPMUL
  ...

DIR \module

>DIR \MEASURE    /* module 'MEASURE' */
 MODULE: MEASURE
    C:0x000000 . . . . _ICE_DUMMY_ . . uint
     FUNCTION: {CvtB} RANGE: 0xFF03B7-0xFF07E5
      C:0x000000 . . . . _ICE_DUMMY_ . . uint
     FUNCTION: {CvtB} RANGE: 0xFF000B-0xFF000D
      C:0x000000 . . . . _ICE_DUMMY_ . . uint
     FUNCTION: SAVE_CURRENT_MEASUREMENTS RANGE: 0xFF000E-0xFF0069
     FUNCTION: TIMER0 RANGE: 0xFF006A-0xFF0135
      D:0x00000F . . . . i . . uchar
     FUNCTION: _READ_INDEX RANGE: 0xFF0136-0xFF01BF
      D:0x00003F . . . . buffer . . ptr to char
      D:0x000042 . . . . index . . int
      D:0x000007 . . . . args . . uchar
     FUNCTION: CLEAR_RECORDS RANGE: 0xFF01C0-0xFF01EE
      D:0x000006 . . . . idx . . uint
     FUNCTION: MAIN RANGE: 0xFF01EF-0xFF03B6
      I:0x000067 . . . . cmdbuf . . array[15] of char
      D:0x00003C . . . . i . . uchar
      D:0x00003D . . . . idx . . uint

DIR /module LINE

>DIR \MEASURE LINE     /* Lines of module 'MEASURE' */
 MODULE: MEASURE
C:0x000E . . . . #87
C:0x000E . . . . #88
C:0x003A . . . . #89
C:0x0049 . . . . #90
...
C:0x03B6 . . . . #291
C:0x03B6 . . . . #292

DIR PUBLIC

>DIR PUBLIC            /* all PUBLIC symbols */
  B:0x000640 . . . . T2I0 . . bit
  B:0x000641 . . . . T2I1 . . bit
  ...
  D:0x000023 . . . . current . . struct mrec
  C:0x0007CD . . . . ERROR . . array[16] of char
  X:0x004000 . . . . save_record . . array[744] of struct mrec
  C:0x00000E . . . . save_current_measurements . . void-function
  C:0x0001EF . . . . main . . void-function
  C:0x00047E . . . . menu . . array[847] of char
  D:0x000030 . . . . setinterval . . struct interval
  ...
  B:0x000601 . . . . IEX2 . . bit
  B:0x000600 . . . . IADC . . bit

DIR VTREG

>DIR VTREG           /* Show Pin-Registers and Values */
    PORT0:  uchar, value = 0xFF
    PORT1:  uchar, value = 0xFF
    PORT2:  uchar, value = 0xFF
    PORT3:  uchar, value = 0xFF
    PORT4:  uchar, value = 0xFF
    PORT5:  uchar, value = 0xFF
    PORT6:  uchar, value = 0xFF
    PORT7:  uchar, value = 0x00
    PORT8:  uchar, value = 0x00
     AIN0:  float, value = 0
     AIN1:  float, value = 0
     AIN2:  float, value = 0
     AIN3:  float, value = 0
     AIN4:  float, value = 0
     AIN5:  float, value = 0
     AIN6:  float, value = 0
     AIN7:  float, value = 0
     AIN8:  float, value = 0
     AIN9:  float, value = 0
    AIN10:  float, value = 0
    AIN11:  float, value = 0
     S0IN:   uint, value = 0x0000
    S0OUT:   uint, value = 0x0000
     S1IN:   uint, value = 0x0000
    S1OUT:   uint, value = 0x0000
    VAGND:  float, value = 0
    VAREF:  float, value = 5
     XTAL:  ulong, value = 0xB71B00
   PE_SWD:  uchar, value = 0x00
    STIME:  uchar, value = 0x00

DIR

>$ = MAIN     /* set current execution point to main() */
>DIR          /* now, the main() symbols are preselected */
 FUNCTION: MAIN RANGE: 0xFF01EF-0xFF03B6
  I:0x000067 . . . . cmdbuf . . array[15] of char
  D:0x00003C . . . . i . . uchar
  D:0x00003D . . . . idx . . uint

DIR DEFSYM

>DIR DEFSYM   /* those created by 'DEFINE <type> <name>' */
            word00:    int, value = 0x0000
            byte00:   char, value = 0x00
           dword00:   long, value = 0x0
           float00:  float, value = 0

DIR FUNC

>DIR FUNC     /* predefined µVision3 functions */
predef'd:   void  MEMSET (ulong, ulong, uchar)
predef'd:   void  TWATCH (ulong)
predef'd:    int  RAND (uint)
predef'd:  float  GETFLOAT (char *)
predef'd:   long  GETLONG (char *)
predef'd:    int  GETINT (char *)
predef'd:   void  EXEC (char *)
predef'd:   void  PRINTF (char *, ...)


Enter

语法 | 描述
Enter type address = expr , expr … | 用指定的数据类型type的表达式 (expr) 改变从地址address处开始的存储器内容。

Enter命令可以改变从指定地址开始的存储器内容，可键入的数据类型如下：

类型 | 描述
CHAR | 一个有符号或无符号的字符.
DOUBLE | 一个双精度浮点数.
FLOAT | 一个浮点数.
INT | 一个有符号或无符号整型.
LONG | 一个有符号或无符号的长整型.

可以指定多个表达式，以逗号( , )隔开，它可以被转化为指定的数据类型且最后被存储在连续的地址空间内。

例子
>E CHAR x:0 = 1,2,"-µVision3-"                   /* Enter Characters */
>D x:0
 X:0000  01 02 2D 64 53 63 6F 70 65 2D 00 00 00 00 00 00   ..-µVision3-......

>E FLOAT x:0x2000 = 3,4,15.2,0.33                /* Enter Float      */


EVALuate

语法 | 描述
EVALuate expression | 以十进制、八进制、十六进制或ASCII码显示表达式的结果。

EVALuate 命令用于计算指定的表达式并以十进制、八进制、十六进制或ASCII码格式输出结果。若表达式以不带EVALuate命令的方式输入，则会以系统变量RADIX选定的基显示输出结果。表达式可以包含用逗号分开的多个子表达式。

例子
>eval -1
16777215T 77777777Q 0xFFFFFF '....'

>eval intcycle
0T 0Q 0x0 '....'

>intcycle = 0x12
>eval intcycle
18T 22Q 0x12 '....'

>eval 'a'+'b'+'c'
294T 446Q 0x126 '...&'

>eval main
16712175T 77600757Q 0xFF01EF '....'

>eval save_record[1].time
81931T 240013Q 0x1400B '..@.'

>eval save_record[1].time.sec
0T 0Q 0x0 '....'

>save_record[1].time.sec = 1
>eval save_record[1].time.sec
1T 1Q 0x1 '....'

>eval save_record[1].time.sec = 0
0T 0Q 0x0 '....'


EXIT

语法 | 描述
EXIT | 退出µVision3 调试器（模式）

EXIT命令用于退出µVision3 调试器（模式）。

这个命令允许作为EXEC函数的一个参数。


KILL

语法 | 描述
KILL BUTTON number | 移除工具箱按钮。
KILL FUNC * | 删除所有的µVision3 函数。
KILL FUNC function_name | 删除名为 function_name µVision3函数。

KILL 命令可用于删除已定义的工具箱按钮和µVision3函数。

KILL BUTTON 命令用于移除前面已定义的一个工具箱按钮。当使用这个命令时，必须要指定要移除工具箱按钮的编号。这个编号在工具箱窗口中每个按钮的前面。

KILL FUNC * 命令用于移除前面已定义的所有用户函数和信号函数。µVision3 内部定义函数不能被删除。

KILL FUNC function_name 命令用于删除指定的用户函数或信号函数。

例子

>KILL FUNC ANALOG      /* Delete user function analog */
>KILL FUNC myregs      /* Delete user function myregs */
>KILL FUNC *           /* Delete all user functions     */

>KILL BUTTON 3         /* Kill Toolbox Button number 3  */

>KILL BUTTON 1         /* Kill Toolbox Button number 1  */


SAVE

语法 | 描述
SAVE path filename addr1, addr2 | 把从addr1 到 addr2 的地址域存放在格式为HEX386文件filename 中。

SAVE 命令可以把存储映像保存在文件filename中 ，文件以HEX386格式被保存。从addr1到addr2 的存储器内容被保存，然后使用LOAD命令将文件的内容载入到µVision3调试器中。

注意

  • 不能保存到8051和251中的内部RAM从I:0x80 到 I:0xFF处.


SCOPE

语法 | 描述
SCOPE \module\function | 显示指定程序模块或函数的地址域。

SCOPE 命令显示：

  • 目标程序中所有函数的地址域(若无模块和函数名被键入)
  • 程序模块中所有函数的地址域(若仅有模块名被指定)
  • 单个函数的地址域(若有模块和函数名被指定)

当程序及调试信息被载入时，µVision3 调试器创建一个地址分配及相关符号信息的内部表。非法符号可被自动地从这个表中选出。

例子

在下面的例子中的缩进行反应了每个模块中源程序的布局。

>scope \measure\main                  /* show scope range of main()      */
MAIN RANGE: 0xFF01EF-0xFF03B6
>
>scope \measure                       /* show scope for module 'measure' */
MEASURE
  {CvtB} RANGE: 0xFF03B7-0xFF07E5     /* µVision3 dummy scope block      */
  {CvtB} RANGE: 0xFF000B-0xFF000D
  SAVE_CURRENT_MEASUREMENTS RANGE: 0xFF000E-0xFF0069
  TIMER0 RANGE: 0xFF006A-0xFF0135
  _READ_INDEX RANGE: 0xFF0136-0xFF01BF
  CLEAR_RECORDS RANGE: 0xFF01C0-0xFF01EE
  MAIN RANGE: 0xFF01EF-0xFF03B6
>
>scope                                /* show all scope ranges           */
MEASURE
  {CvtB} RANGE: 0xFF03B7-0xFF07E5
  {CvtB} RANGE: 0xFF000B-0xFF000D
  SAVE_CURRENT_MEASUREMENTS RANGE: 0xFF000E-0xFF0069
  TIMER0 RANGE: 0xFF006A-0xFF0135
  _READ_INDEX RANGE: 0xFF0136-0xFF01BF
  CLEAR_RECORDS RANGE: 0xFF01C0-0xFF01EE
  MAIN RANGE: 0xFF01EF-0xFF03B6
MCOMMAND
  {CvtB} RANGE: 0xFF09A6-0xFF0A23
  MEASURE_DISPLAY RANGE: 0xFF07E7-0xFF084A
  _SET_TIME RANGE: 0xFF084B-0xFF08CA
  _SET_INTERVAL RANGE: 0xFF08CB-0xFF09A5
GETLINE
  _GETLINE RANGE: 0xFF0A24-0xFF0A87
?C_FPADD
?C_FPMUL
?C_FPDIV
?C_FPCMP
...

注意

  • {CvtB}是由µVision3创建的，它是少量调试信息的结果。这对没有调试信息的库模块，汇编语言模块及具有有效名但无范围域的块是正常的。


SIGNAL

语法 | 描述
SIGNAL KILL function_name | 使指定的有效信号函数变为无效。
SIGNAL STATE | 显示所有有效的信号函数。

SIGNAL 命令可以显示有效的信号函数或使有效的信号函数变为无效。

例子
>SIGNAL KILL ANALOG0          /* Deactivate the analog0 signal function */

上面的例子说明了如何使有效的信号函数变为无效。

>SIGNAL STATE
 0  idle     Signal = ANALOG0 (line 10)

上面的例子显示了有效的信号函数。函数编号、函数状态(idle或running)、函数名(在此例中为ANALOG0)及函数最后被执行所在的行号将被显示。


WatchSet

语法 | 描述
WatchSet windownr, expression, base | 定义一个观测点表达式，并把它添加到观测窗口的一个页中。参数base指定使用的基 (10 或 16)。

WatchSet 命令可用于定义一个观测点表达式并在观测窗口中显示。观测窗口Watch window 会在程序执行命令如Go, Ostep, Pstep, 和 Tstep后更新。

参数windownr 指定了观察窗口Watch window中的页。base为表达式的值指定基(10或16)。

例子
>WS interval,0x0a LINE
>WS save_record[0].analog
>WS save_record[0]
>WS sindex


WatchKill

语法 | 描述
WatchKill windownr | 删除观察窗口一个页中的所有观察点。

WatchKill 命令可以删除观察窗口中所有已定义的观察点表达式。

参数windownr 指定了观察窗口Watch window中的页。

例子
>WK 1     /* delete all defined watchpoint expressions in watch window 1 */
>WK 2


Predefined Functions

预定义函数

µVision3提高了一些可被调用的预定义调试函数，它们不能被重定义或者被删除。预定义函数用来帮助开发者定义用户和信号函数。

下表列出了所有的µVision3预定义调试函数。

返回值 | 名字 | 参数 | 描述
void | exec | ("command_string") | 执行调试命令
double | getdbl | ("prompt_string") | 请求用户输入一个双精度浮点数据
int | getint | ("prompt_string") | 请求用户输入一个整型数据
long | getlong | ("prompt_string") | 请求用户输入一个长整型数据
void | memset | (start_addr, value, len) | 以常量填充内存
void | printf | ("string", ...) | 输出函数
int | rand | (int seed) | 返回介于0到32767之间的随即数
void | rwatch | (ulong address) | 延迟执行信号函数直到读取地址成功
void | swatch | (float seconds) | 延迟一段时间执行信号函数
void | twatch | (ulong states) | 延迟一个指定数量的CPU状态执行信号函数
void | wwatch | (ulong address) | 延迟执行信号函数直到写访问地址发生
uchar | _RBYTE | (address) | 在指定内存地址上读取字符数据
uint | _RWORD | (address) | 在指定内存地址上读取短整型数据
ulong | _RDWORD | (address) | 在指定内存地址上读取长整型数据
float | _RFLOAT | (address) | 在指定内存地址上读取浮点数数据
double | _RDOUBLE | (address) | 在指定内存地址上读取双精度浮点数据
int | _TaskRunning_ | (ulong func_address) | 检查特定任务函数是否是当前运行任务。仅对RTX内核所对应的DLL已知的情形有效。
double | _sleep_ | (ulong milli_seconds) | 延迟一段时间执行脚本
void | _WBYTE | (address, uchar val) | 在指定内存地址上写字符数据
void | _WWORD | (address, uint val) | 在指定内存地址上写短整型数据
void | _WDWORD | (address, ulong val) | 在指定内存地址上写长整型数据
void | _WFLOAT | (address, float val) | 在指定内存地址上写浮点数数据
void | _WDOUBLE | (address, double val) | 在指定内存地址上写双精度浮点数据
double | __acos | (double x) | 计算反余弦
double | __asin | (double x) | 计算反正弦
double | __atan | (double x) | 计算反正切
double | __cos | (double x) | 计算余弦
double | __exp | (double x) | 计算指数函数
double | __log | (double x) | 计算自然对数
double | __log10 | (double x) | 计算常用对数
double | __sin | (double x) | 计算正弦
double | __sqrt | (double x) | 计算平方根
double | __tan | (double x) | 计算正切


exec

exec函数

返回值 | 名字 | 参数 | 描述
void | exec | ("command_string") | 执行Debug命令

exec函数用于在用户和信号函数中调用µVision3调试命令，不同的命令字符串之间用分号间隔。

命令字符串被传递给命令解释程序执行，但是前提是该命令是合法的调试命令。

例如

>exec ("DIR PUBLIC; EVAL R7")


getdbl

getdbl函数

返回值 | 名字 | 参数 | 描述
double | getdbl | ("prompt_string") | 要求用户输入一个双精度数据

本函数提示用户输入一个双精度数据并在输入后返回该数据。如果输入为空，则返回0。

例如
>getdbl ("Enter double number")


getint

getint函数

返回 | 名字 | 参数 | 描述
int | getint | ("prompt_string") | 请求用户输入一个整型数据

本函数提示用户输入一个整型数据并在输入后返回该数据。如果输入为空，则返回0。

例如

>getint ("Enter Your Age")


getlong

getlong函数

返回值 | 名字 | 参数 | 描述
long | getlong | ("prompt_string") | 请求用户输入一个长整型的数据

本函数提示用户输入一个长整型数据，在输入后函数将返回该数据。如果输入为空，则返回0。

例如

>getlong ("Enter a long number")


memset

memset函数

返回 | 名字 | 参数 | 描述
void | memset | (start_address, length, value) | 以常量填充内存

memset函数将用常数value填充从start address开始、长度为length的 内存区域。

例如
>MEMSET (0x20000, 0x1000, 'a')       /* Fill 0x20000 to 0x20FFF with 'a' */


printf

printf函数

返回值 | 名字 | 参数 | 描述
void | printf | ("string", ...) | 功能与ANSI C中printf函数相同

prinf 函数功能与ANSI C中printf函数相同，如下例。在ANSI C中惯用的用法也适用于本函数。

例子

>printf ("random number = %04XH\n", rand(0))
random number = 1014H


rand

rand函数

返回值 | 名字 | 参数 | 描述
int | rand | (int seed) | 返回一个介于0到32767之间的随即数

rand 函数返回一个介于0到32767之间的随机数，每次使用该函数都 会重新初始化并产生一个非0随机数。因此该函数可用于产生一个随机时钟数用来延迟一定的时钟周期、参与运算或作为输入传递给程序。

例如
>rand (0x1234) /* Initialize random generator with 0x1234 */
0x3B98

>rand (0) /* No initialization */
0x64BD


twatch

twatch函数

返回值 | 名字 | 参数 | 描述
void | twatch | (ulong states) | 延迟指定数量的CPU周期后继续执行信号函数

twatch常被用于延迟指定数量的CPU周期后继续执行信号函数。当执行目标程序时，µVision3更新CPU周期计数器。

例如

下面的信号函数将每秒钟暂缓INTO输入(P3.2)一次：

signal void int0_signal (void) {
  while (1) {
    PORT3 |= 0x04;             /* pull INT0(P3.2) high */
    PORT3 &= ~0x04;            /* pull INT0(P3.2) low and generate interrupt */
    PORT3 |= 0x04;             /* pull INT0(P3.2) high again */
    twatch (CLOCK);            /* wait for 1 second */
  }
}

注意

  • twatch 函数只能在信号函数中调用，在信号函数之外调用将返回错误信息。


_TaskRunning_

_TaskRunning_函数

返回值 | 名字 | 参数 | 描述
int | _TaskRunning_ | (ulong func_address) | 检查特定任务函数是否是当前运行任务。仅对RTX内核所对应的DLL已知的情形有效。

该函数检查特定任务函数是否是当前运行任务，仅当在Options for Target – Target选择了操作系统时可用。对于已经内核的操作系统，µVision3会调用一个额外的DLL。详情请参考RTX Kernel Aware Debugging。

调试函数_TaskRunning_的返回值可以被传递给_break_ 系统变量，用来停止一个已激活程序的执行。

例如

>_TaskRunning_ (command)       /* check if task 'command' is running     */
0001                           /* returns 1 if task is currently running */
>_break_= _TaskRunning_ (init) /* stop program when 'init' is running    */


_RBYTE

_RBYTE函数

返回值 | 名字 | 参数 | 描述
uchar | _RBYTE | (address) | 在指定内存地址上读取字符数据

该函数返回在指定内存地址上读取的字符数据。

例如

>_RBYTE (0x20000)              /* return the character at 0x20000  */


_RWORD

_RWORD函数

返回值 | 名字 | 参数 | 描述
uint | _RWORD | (address) | 在指定内存地址上读取短整型数据

该函数返回在指定内存地址上读取的短整型数据。

例如

>_RDWORD (0x1000)              /* return the long value at 0x1000  */


_RDWORD

_RDWORD函数

返回值 | 名字 | 参数 | 描述
ulong | _RDWORD | (address) | 在指定内存地址上读取长整型数据

该函数返回在指定内存地址上读取的长整型数据

例如

>_RDWORD (0x1000)              /* return the long value at 0x1000  */


_RFLOAT

_RFLOAT函数

返回 | 名字 | 参数 | 描述
float | _RFLOAT | (address) | 在指定内存地址上读取浮点数数据

该函数返回在指定内存地址上读取的浮点数数据。

例如

>_RFLOAT (0xE000)              /* return the float value at 0xE000 */


_RDOUBLE

_RDOUBLE函数

返回值 | 名字 | 参数 | 描述
double | _RDOUBLE | (address) | 在指定内存地址上读取双精度数据

函数返回在指定内存地址上读取的双精度数据。

例如

>_RDOUBLE (0x20000)              /* return the character at 0x20000  */


_sleep_

_sleep_函数

返回值 | 名字 | 参数 | 描述
void | _Sleep_ | (ulong milli_seconds) | 延迟指定一段时间（milli_seconds）后执行脚本

_sleep_ 函数在调试函数或信号函数中用来延迟程序脚本的执行。_sleep_ 在允许少量延迟的脚本语言的执行中很有用，它可在防真模式和调试模式中被调用。

例如

下面的程序在ARM设备上切换慢速振荡器，用于实现高速下载：

// Switching from Slow Clock to Main Oscillator for faster Download on Atmel AT91M55800A
_WDWORD(0xFFFF4020, 0x002F0002);     // APMC_CGMR: Enable Main Oscillator
_sleep_(10);                         // Wait for stable Main Oscillator
_WDWORD(0xFFFF4020, 0x002F4002);     // APMC_CGMR: Switch to Main Oscillator


_WBYTE

_WBYTE函数

返回值 | 名字 | 参数 | 描述
uchar | _WBYTE | (address, uchar val) | 在指定内存地址上写入指定字符数据

该函数在指定内存地址上写入一个指定字符数据。

例如

>_WBYTE (0x20000, 0x55)        /* write the byte 0x33 at 0x20000          */


_WWORD

_WWORD函数

返回值 | 名字 | 参数 | 描述
void | _WWORD | (address, uint val) | 在指定内存地址上写入指定短整型数据。

该函数在指定内存地址上写入指定短整型数据。

例如
>_WWORD (0x20000, 123)         /* write the int 123 at 0x20000            */


_WDWORD

_WDWORD函数

返回值 | 名字 | 参数 | 描述
void | _WDWORD | (address, ulong val) | 在指定内存地址上写入指定长整型数据。

该函数在指定内存地址上写入指定长整型数据。

例如
>_WDWORD (0x1000, 12345678)    /* write the long value 12345678 at 0x1000 */


_WFLOAT

_WFLOAT函数

返回值 | 名字 | 参数 | 描述
void | _WFLOAT | (address, float val) | 在指定内存地址上写入指定浮点数数据。

该函数在指定内存地址上写入指定浮点数数据。

例如
>_WFLOAT (0xE000, 1.5)         /* write the float value 1.5 at 0xE000     */


_WDOUBLE

_WDOUBLE函数

返回值 | 名字 | 参数 | 描述
void | _WDOUBLE | (address, double val) | 在指定内存地址上写入指定双精度浮点数据

该函数在指定内存地址上写入指定双精度浮点数据。

例如

>_WDOUBLE (0x20000, 1234567890 )        /* write the double 1234567890 at 0x20000 */


__acos

返回值 | 名字 | 参数 | 描述
double | __acos | (double x) | 计算反余弦

__acos函数完成对浮点数x的反余弦计算。其中参数x的值必须介于-1与1之间，该函数返回一个介于0和π 之间的浮点数。

例如

>__acos(0.532)


__asin

返回 | 名字 | 参数 | 描述
double | __asin | (double x) | 计算反正弦

__asin函数完成对浮点数x的反正弦计算。其中参数x的值必须介于-1与1之间，该函数返回一个介于-π/2 to π/2 之间的浮点数。

例如

>__asin(0.3)


__atan

返回 | 名字 | 参数 | 描述
double | __atan | (double x) | 计算反正切

__atan函数完成对浮点数x的反正切计算。其中参数x的值必须介于-1与1之间，该函数返回一个介于-π/2 to π/2 之间的浮点数。

Example

>__atan(3)


__cos

返回 | 名字 | 参数 | 描述
double | __cos | (double x) | 计算余弦

__cos函数完成对浮点数x的余弦函数计算。

例如

>__cos(3.3)


__exp

__exp函数

返回值 | 名字 | 参数 | 描述
double | __exp | (double x) | 计算幂函数

__exp函数计算e的x次幂，其中x为浮点数。

例如

>__exp(3)


__log

__log函数

返回值 | 名字 | 参数 | 描述
double | __log | (double x) | 计算自然对数

__log函数计算浮点数x的自然对数。

例如

>__log(3.3)


__log10

__log10函数

返回值 | 名字 | 参数 | 描述
double | __log10 | (double x) | 计算常用对数

__log10函数计算浮点数x的常用对数，常用对数是以10为底的对数。

例如

>__log10(1000)


__sin

__sin函数

返回值 | 名字 | 参数 | 描述
double | __sin | (double x) | 计算正弦

__sin 函数计算浮点数x的正弦值。

例如

// Generate a sine wave signal with frequency 'f'

FUNC float sine_wave (float f)  {
  return __sin (f * (((float) STATES) / CLOCK) * 2 * 3.1415926);
}


__sqrt

__sqrt函数

返回值 | 名字 | 参数 | 描述
double | __sqrt | (double x) | 计算平方根

__sqrt函数计算x的平方根。

例如

>__sqrt(3)


__tan

__tan函数

返回值 | 名字 | 参数 | 描述
double | __tan | (double x) | 计算正切

__tan 函数计算浮点数x的正切函数。

例如

>__tan (1.2)


Differences Between µVision3 and dScope

µVision3 和 dScope的差异

在Windows操作系统中，µVision3调试器代替了Keil dScope。dScope调试函数需要作如下修改才能在µVision3调试器中正确执行。

  • 在dScope中，memset调试函数的参数不同。在µVision3中memset调试函数参数与ANSI C中的memset函数相同。
  • dScope调试函数位不可用，需要用_RBYTE和_WBYTE函数调用来代替。dScope调试函数中char,uchar,int,uint,long,ulong,float和double能读写内存，在µVision3中这些调试函数被下表所列函数代替。

    dScope内存访问函数 | µVision3中相应的内存读函数 | 内存写函数
    bit | _RBYTE | combine _RBYTE and _WBYTE
    char, uchar | _RBYTE | _WBYTE
    int, uint | _RWORD | _WWORD
    long, ulong | _RDWORD | _WDWORD
    float | _RFLOAT | _WFLOAT
    double | _RDOUBLE | _WDOUBLE


Digital Input

数字信号输入

µVision 3可以仿真片上数字I/O端口的逻辑行为。

  • 在外设菜单中的对话框中可修正这些外设的设置，可直接在这些对话框中输入值。
  • 虚拟仿真寄存器 (VTREG's)代表CPU的引脚，可以在 表达式和调试函数中使用。

Philips LPC2100设备的I/O端口：

这一节将提供使用VTREG和信号函数的仿真脚本，例子如下：

  • 按钮
  • 中断信号
  • 脉冲模式


Push Button

按钮

下面的信号函数可以和一个I/O引脚绑定，就像一个连接的开关。

//
// Toggle I/O Pin
//
signal void Toggle_IO_Pin (unsigned char digit)  {
  PORT2 = (PORT2 ^ 0x01);
}

用户可以定义一个工具箱按钮，通过这个按钮可以快速地访问下面定义的命令。

DEFINE BUTTON "Toggle P2.0", "Toggle_IO_Pin"


Interrupt Signal

中断信号

下面的信号函数用于产生GPIO中断信号。

//
// Generates a number of pulses on GPIO 0.14
//
signal void GPIO_0_14_Square (unsigned int pulses)  {
  float frequency;           // pulse frequency in Hz

  frequency = 1000;          // 1 KHz

  printf ("%d Square Pulses on GPIO 0.14\n", pulses);

  while (pulses)
  {
    PORT0 |=  (1 << 14);     // set   pin 0.14
    swatch (0.5 / frequency);
    PORT0 &= ~(1 << 14);     // reset pin 0.14
    swatch (0.5 / frequency);
    pulses--;
  }
}

GPIO_0_14_Square (100);      // 100 Pulses at debugger startup

define button "EINT1 1  Pulse",  "GPIO_0_14_Square (1)"
define button "EINT1 100Pulses", "GPIO_0_14_Square (100)"

上面的设置将在PORT0端口上产生下图所示的信号，逻辑分析仪所显示的输出是例程Keil MCB2100评估板上使用EINT1中断运行的结果，具体代码可在网站 http://www.realview.com.cn/down.asp下载。


Impulse Pattern

脉冲模式

以下信号函数产生的信号脉冲模式在许多嵌入式系统中是很常见的。此例中脉冲信号是DTMF接收器的输入，在电信应用中是很常见的。

//
// Generate Input Signal Pattern from a DTMF Receiver
//
signal void SendDtmf (unsigned char digit)  {
  if (digit == 0)  digit = 10;
  PORT2 = (PORT2 & 0x07) | (digit << 4);
  swatch (0.06);
  PORT2 |= 0x8;
}

signal void Send (void)  {
  SendDtmf (12);    // send digit 12 = '*'
  swatch (0.12);
  SendDtmf (7);     // send digit 7
  swatch (0.12);
  SendDtmf (2);     // send digit 2
  swatch (0.12);
  SendDtmf (11);    // send digit 11 = '#'
}

上面的信号函数在Port 2端口上产生了下图所示的输入模式。


Square Wave Signal

方波信号

下面的信号函数模板可以产生方波信号。输入信号由VTREG ADC0提供。变量volts、frequency、offset和duration用于设置方波信号参数。

//
// Generates an Square Wave Signal on AD Channel 0
//
signal void ADC0_Square (void)  {
  float volts;        // peak-to-peak volatage
  float frequency;    // output frequency in Hz
  float offset;       // volatge offset
  float duration;     // duration in Seconds

  volts     = 0.5;
  offset    = 1.6;
  frequency = 2400;
  duration  = 0.5;

  printf ("Square Wave Signal on AD Channel 0.\n");

  while (duration > 0.0)  {
    ADC0 = volts + offset;
    swatch (0.5 / frequency);
    ADC0 = offset;
    swatch (0.5 / frequency);
    duration -= 1.0 / frequency;
  }
}

上面的设置产生如下图所示的输出波形。


Saw Tooth Signal

锯齿波信号

下面的信号函数模板可以产生锯齿波信号。输入信号由VTREG ADC0提供。变量volts、frequency、offset和duration用于设置锯齿波信号参数。

//
// Generate Saw Tooth Signal on AD Channel 0
//
signal void ADC0_Saw (void)  {
  float volts;        // peak-to-peak volatage
  float frequency;    // output frequency in Hz
  float offset;       // volatge offset
  float duration;     // duration in Seconds
  float val;
  long  i, end, steps;

  volts     = 2.0;
  offset    = 0.2;
  frequency = 1400;
  duration  = 0.2;

  printf ("Saw Tooth Signal on AD Channel 0.\n");

  steps = (100000 * (1/frequency));
  end = (duration * 100000);
  for (i = 0 ; i < end; i++)  {
    val = (i % steps) / ((float) steps);
    ADC0 = (val * volts) + offset;
    swatch (0.00001);                // in 10 uSec increments
  }
}

上面的设置产生如下图所示的输出波形。


Sine Wave Signal

正弦波信号

下面的信号函数模板可以产生正弦波信号。输入信号由VTREG ADC0提供。变量volts、frequency、offset和duration用于设置正弦波信号参数。

//
// Generate Sine Wave Signal on AD Channel 0
//
signal void ADC0_Sine (void)  {
  float volts;        // peak-to-peak voltage
  float frequency;    // output frequency in Hz
  float offset;       // voltage offset
  float duration;     // duration in Seconds
  float val;
  long  i, end;

  volts     = 1.4;
  offset    = 1.6;
  frequency = 1800;
  duration  = 0.1;

  printf ("Sine Wave Signal on AD Channel 0.\n");

  end = (duration * 100000);
  for (i = 0 ; i < end; i++)  {
    val = __sin (frequency * (((float) STATES) / CLOCK) * 2 * 3.1415926);
    ADC0 = (val * volts) + offset;
    swatch (0.00001);                // in 10 uSec steps
  }
}

上面的设置产生如下图所示的输出波形。


Noise Signal

噪音信号

下面的信号函数模板可以产生噪音信号模式。输入信号由VTREG ADC0提供。变量volts、frequency、offset和duration用于设置噪音信号参数。

//
// Generate Noise Signal on AD Channel 0
//
signal void ADC0_Noise (void)  {
  float volts;        // peak-to-peak volatage
  float frequency;    // output frequency in Hz
  float offset;       // volatge offset
  float duration;     // duration in Seconds
  float val;
  long  i, end;

  volts     = 1.4;
  offset    = 1.6;
  duration  = 0.1;

  printf ("Sine Wave Signal on AD Channel 0.\n");

  end = (duration * 100000);
  for (i = 0 ; i < end; i++)  {
    val =  ((float) rand (0)) / 32767.0;
    ADC0 = (val * volts) + offset;
    swatch (0.00001);                // in 10 uSec steps
  }
}

上面的设置在ADC0上产生如下图所示的输出波形。


Signal Combination

混合信号

信号函数和信号输入可进行简单地混合。下面的信号函数显示了如何调用几个信号，以使它们按顺序被处理。

//
// Combine the Signals
//
signal void Startup (void)  {
  swatch (1.0);    // wait 1.0 seconds
  ADC0_Saw ();
  swatch (0.3);    // wait 0.3 seconds
  ADC0_Square ();
  swatch (0.6);    // wait 0.6 seconds
  ADC0_Sine ();
}

上面设置的信号函数产生如下的输出波形。

甚至可以用如下的信号函数混合两个正弦波信号。

/*
 * Generate a Sine Wave Input
 */
signal void mix_sine (float freq1, float freq2)  {
  float sig1;
  float sig2;
  int z;

  z = 0;

  while (z < 10000)  {   // generate 100 mSec sine wave pulse
/* Generate 1. Sine Wave input signal*/
    sig1 = __sin (((states * freq1) / CLOCK) * 3.1415926 * 2);

/* Generate 2. Sine Wave input signal */
    sig2 = __sin (((states * freq2) / CLOCK) * 3.1415926 * 2);

/* Input: 1. Sine Wave with 0.5V, 2. Sine Wave with 0.2V, offset 2.5V */
    AN0 =  (sig1 * 0.5) + (sig2 * 0.2) + 2.5;
    swatch (0.00001);    // wait 10 uSec
    z++;
  }
}

信号函数可以直接使用带两个频率参数的命令行来调用，例如：

mix_sine (300, 2000)

产生一个300Hz、0.5V振幅和2000Hz、0.2V振幅的具有2.5V偏移量的混合波形。逻辑分析仪窗口产生如下图所示的波形。


CAN - Simulate Incoming Messages

CAN - 仿真输入消息

下面的例程显示了2字节的输入消息仿真。
>CAN0ID = 0x4500   // message ID = 0x4500
>CAN0L = 2         // message length 2 bytes
>CAN0B0 = 0x12     // message data byte 0
>CAN0B1 = 0x34     // message data byte 1
>CAN0IN = 2        // set CAN message with 29-bit identifier to the application program

注意

  • 开发者可以直接在CAN通信对话框中键入输入消息。


CAN - Process Outgoing Messages

CAN - 处理输出消息

通过在CAN0OUT寄存器上使用断点可调用调试函数。调试函数可检查CAN消息对象、给CAN消息发送应答信号或调用发送延迟应答的信号函数。

FUNC void CANmessage (void)  {
  switch (CAN0OUT)  {
    case 1: printf ("\nSend Message (11-bit ID=%04X)", CAN0ID);     break;
    case 2: printf ("\nSend Message (29-bit ID=%08X)", CAN0ID);     break;
    case 3: printf ("\nRequest Message (11-bit ID=%04X)", CAN0ID);  return;
    case 4: printf ("\nRequest Message (29-bit ID=%08X)", CAN0ID);  return;
  }

  printf ("\nMessage Length %d, Data: ", CAN0L);
  printf ("%02X %02X %02X %02X ",   CAN0B0, CAN0B1, CAN0B2, CAN0B3);
  printf ("%02X %02X %02X %02X \n", CAN0B4, CAN0B5, CAN0B6, CAN0B7);
}

>BS WRITE CAN0OUT, 1, "CANmessage ()"  // call CANmessage debug function with outgoing messages

注意：

所有的CAN消息都可以在CAN通信对话框中浏览到。


CAN - Send Periodical Messages

CAN - 发送周期性的消息

通过信号函数可以给应用程序发送周期性的消息。信号函数是在µVision 3调试器中创建的。详细信息请参考µVision 3调试函数。下面的信号函数每0.1秒发送2字节的消息。这个信号函数接收了一个发给应用程序的参数info，info的值不断地增加：

SIGNAL void sendCAN (unsigned int info)  {
 while (1)  {
    CAN0ID = 0x4510;          // CAN message ID
    CAN0L  = 2;               // message length 2 bytes
    CAN0B0 = (info & 0xFF);   // message data byte 0
    CAN0B1 = (info >> 8);     // message data byte 1
    CAN0IN = 2;               // send CAN message with 29-bit ID
    twatch (CLOCK / 10);      // send message 10 times per second
    info++;                   // increment info value
  }
}

>sendCAN (500);    // invoke sendCAN function


SPI Simulation

SPI仿真

串行外设接口(SPI)用于连接板级设备。µVision 3调试器仿真几个工作在主模式和从模式下的微控制器SPI接口。

虚拟仿真寄存器(VTREG)

为了仿真SPI的通信，µVision3调试器实现了如下几个虚拟仿真寄存器(VTREG)：

VTREG | 描述
SPIxIN | SPI输入寄存器，用于获得当前接受的数据。
SPIxOUT | SPI输出寄存器，用于保存当前发送的数据。

SPIx VTREG的命名方法根据所选设备的不同而有所差异。有一些设备提供了多个SPI接口，所以VTREG的命名是以前缀SPI0或SPI1开始的。开发者可以使用DIR VTREG命令检测所选设备的SPI接口的虚拟仿真寄存器。

SPI仿真例程

下面的调试脚本包含了用于仿真Atmel AT250X0 SPI存储设备的调试信号函数。这个设备是使用简单的带有选择语句的状态机实现的。

/* Define the state and address for the AT250x0.*/
define char spi_at250x0_state
define int  spi_at250x0_address
define char spi_at250x0_status

/* MAP the memory area to use for the SPI RAM. */
map X:0x700000,X:0x70FFFF READ WRITE

/*-----------------------------------------------
This function implements the state matching for
the AT250x0.

State       Transition
-------------------------------------------------
0: WREN  -> 0
0: WRDI  -> 0
0: RDSR  -> 0
0: Read  -> 1: Get Address LSB -> 2: Read Byte <-
0: Write -> 3: Get Address LSB -> 4: Write Byte -> 5 <-

1: Get Addr LSB -> 2
2: Read Byte(s) -> 2

3: Get Addr LSB -> 4
4: Write Byte   -> 5
-----------------------------------------------*/
func char spi_at250x0 (char st) {
  unsigned char opcode;

  printf ("AT250X0: STATE %u\n", (unsigned) st);

  switch (st)  {
    case 0:  /* Get OPCode */
      opcode = SPI_OUT & 0x0007;
      printf ("AT250X0: OPCODE %u\n", (unsigned) opcode);

    switch (opcode)
      {
      case 1: /* WRSR */
        return (0);

      case 2: /* Write */
        printf ("AT250X0: WRITE OPCODE Detected\n");
        spi_at250x0_address = (SPI_OUT & 0x08) << 5;
        return (3);

      case 3: /* Read */
        printf ("AT250X0: READ OPCODE Detected\n");
        spi_at250x0_address = (SPI_OUT & 0x08) << 5;
        return (1);

      case 4: /* WRDI */
        spi_at250x0_status &= ~0x02; /* Clear Write Enable Bit */
        return (0);

      case 5: /* RDSR */
        SPI_IN = spi_at250x0_status;
        return (5);

      case 6: /* WREN */
        spi_at250x0_status |= 0x02; /* Set Write Enable Bit */
        return (0);
      }
    return (0);

  case 1:  /* Get Address LSB for READ */
    spi_at250x0_address |= (SPI_OUT & 0xFF);
    printf ("AT250X0: Address %4.4X Detected\n", spi_at250x0_address);
    return (2);

  case 2:  /* Read */
    printf ("AT250X0: Read %2.2X from address %4.4X\n", 'A', spi_at250x0_address);
    SPI_IN = _rbyte(X:0x700000 + spi_at250x0_address);
    spi_at250x0_address = (spi_at250x0_address + 1) % 512;
    return (2);

  case 3:  /* Get Address LSB for WRITE */
    spi_at250x0_address |= (SPI_OUT & 0xFF);
    printf ("AT250X0: Address %4.4X Detected\n", spi_at250x0_address);
    return (4);

  case 4:  /* Write */
    if (spi_at250x0_status & 0x02)
      {
      printf ("AT250X0: Write %2.2X to address %4.4X\n", SPI_OUT, spi_at250x0_address);
      _wbyte(X:0x700000 + spi_at250x0_address, SPI_OUT);
      spi_at250x0_status |= 0x01;
      }
    return (5);

  case 5:  /* Instruction End */
    return (5);
  }

return (0);
}

/*
 * This signal function watches the AT89S8252 SPI port for writes.  If there
 * is an SPI port output and if P1.0 is LO (AT250X0 chip select) then interpret
 * the SPI output data and run the state machine.
 */
signal void spi_watcher (void) {

spi_at250x0_state = 0;

while (1) {
  wwatch (SPI_OUT);
  printf ("SPI_OUT Detected\n");

  if ((PORT1 & 0x01) == 0)
    {
    printf ("Calling AT250X0 Routines\n");
    spi_at250x0_state = spi_at250x0 (spi_at250x0_state);

    if (spi_at250x0_status & 0x01)
      swatch (0.000100);
      spi_at250x0_status &= ~0x01;
    }
  else
    {
    printf ("Resetting AT250X0 Routines\n");
    spi_at250x0_state = 0;
    }
  }
}

/*-----------------------------------------------
Enable the signal function for SPI writes.
-----------------------------------------------*/
spi_watcher ();


Flash Programming

Flash编程

µVision 3 集成了Flash编程工具，所有的相关配置将被保存在当前工程中。在菜单项 Project - Options - Utilities 下可配置当前工程所使用的Flash编程工具，开发人员既可使用外部的命令行驱动工具（通常由芯片销售商提供），也可使用Keil ULINK2 USB-JTAG适配器等工具。

用户可通过 Flash 菜单 启动Flash编程器，若设置了Project->Options->Utilities->Update Target before Debugging，那么在调试器启动之前Falsh编程器也将启动。

详细信息请参考下面的主题：

  • 配置Flash菜单：配置Flash菜单以使用基于命令行的外部工具或Keil ULINK2 USB-JTAG适配器。
  • ULink2配置： 介绍Keil ULINK2 USB-JTAG适配器的配置。
  • 准备Flash编程： 在使用ULINK2对片外Flash设备进行编程之前，允许用户编写初始化文件进行总线配置、寄存器配置等初始化设置，该文件可应用于多个应用程序的Flash编程中。
  • Flash算法：介绍如何创建针对Keil ULINK2 USB-JTAG适配器的Flash编程算法。
  • 十六进制Flash文件下载： 介绍如何对已存在的十六进制文件作Flash编程。


Configure Flash Menu

配置Flash菜单

µVision 3为Flash编程工具提供了一个命令接口，在Project->Option for Target对话框的Utilities页中可配置Flash编程器，通过菜单项 Flash - Configure Flash Tools 也可进入此对话框，如下图所示。一旦配置好了命令接口方式，就可以通过 Flash 菜单 下载(Download)或擦除(Erase)目标板中Flash存储器的内容。

  • 使用目标板驱动：选择一个Flash编程驱动程序(例如 Keil ULINK2)，在输出 对话框中下载指定的可执行应用程序。通过设置按钮可以打开 驱动程序配置对话框。Init File文本框中的初始化文件，包括总线的配置、附加程序的下载及 调试命令 或 调试函数 ，文件的格式及用法请参考 准备Flash编程 。
  • 外部工具：使用第三方的基于命令行的Flash编程工具。通过命令行及参数调用下载工具 。使用 键码序列 (Key Sequences)指定输出文件名、设备名及Flash编程器的时钟频率等。设置Run Independent复选框决定编程工具是否能独立运行。

注意：

  • 对于大多数单片设备，µVision3设备数据库已经提供了片上Flash ROM的相应设置(如下图所示)。


Flash Programming Menu Commands

ULINK2配置

ULINK2为大多数支持的设备提供了Flash编程功能。Flash通过在Project - Options for Target - Utilities - Settings下打开的对话框中配置。这个对话框是一个特别的驱动器，在线用户手册中有相关部分的描述。大多数的对话框提供了一个帮助按钮，以便打开相应的描述页。


Prepare Flash Programming

准备Flash编程

在使用ULINK USB-JTAG适配器进行Flash编程之前，可以执行 调试命令 或 调试函数 ，这些命令和函数包含在Flash初始化文件中。在 Project - Options - Utilities - Init File 页的Init File文本框中，可输入初始化文件名，开始Flash下载前将首先自动执行这个初始化文件。

Flash初始化文件有两个典型的应用：

  • 配置存储器或寄存器，这些存储器或寄存器是用来配置访问Flash的总线设置；
  • 加载附加程序部分。

下面是这个标准应用的例子：

总线配置

与微控制器总线系统相连的Flash需要进行总线配置，这个配置可以通过写存储器的 预定义函数 来实现，例如 _WBYTE 或 _WDWORD。

下面是使用预定义函数的例子，这些函数包含在 配置对话框的初始化文件中。

_WDWORD(0xFFE00000, 0x20003CE3);   // BCFG0: Flash Bus Configuration
_WDWORD(0xE002C014, 0x0E6001E4);   // PINSEL2: CS0, OE, WE, BLS0..3

在初始化文件中，除了使用预定义的函数以外还可以加入自己的调试函数，例如：

/***********************************************************************/
/*  FLASH.INI: Flash Initialization File                               */
/***********************************************************************/

//*** <<< Use Configuration Wizard in Context Menu >>> ***

FUNC void Setup (void) {

//  External Memory Controller (EMC)
//    Bank Configuration 0 (BCFG0)
//        IDCY: Idle Cycles <0-15>
//        WST1: Wait States 1 <0-31>
//      WST2: Wait States 2 <0-31>
//          RBLE: Read Byte Lane Enable
//          WP: Write Protect
//          BM: Burst ROM
//      MW: Memory Width  <0=>  8-bit  <1=> 16-bit
//                                   <2=> 32-bit  <3=> Reserved
//
  _WDWORD(0xFFE00000, 0x20003CE3);   // BCFG0: Flash Bus Configuration

  _WDWORD(0xE002C014, 0x0E6001E4);   // PINSEL2: CS0, OE, WE, BLS0..3
                                     //          D0..31, A2..23, JTAG
}

Setup();                             // Setup for Flash

加载附加程序

在Flash初始化文件中还可加载附加程序，附加程序由 Project - Options for Target - Output 页中指定。有些情况下是必须使用附加应用程序的，这时可以通过 LOAD 命令来实现，例如：

LOAD MyFile.HEX


Flash Programming Algorithms

Flash编程算法

ULINK2 USB-JTAG适配器允许用户定义附加的Flash编程算法。这些Flash编程算法可用于ARM和C166工具链，保存在下列的文件夹中：

  • C:\Keil\ARM\Flash：用于ARM工具链
  • C:\Keil\C166\Flash：用于C166工具链

ARM和C166工具链已经包含了几个Flash编程算法，它们可以作为用户自己编写算法的模板。

创建新的Flash编程算法的详细信息请参考下面的帮助文档：

  • ARM工具链：Getting Started User's Guide - Flash Programming - Define Flash Algorithms
  • C166工具链：OCDS Debugging User's Guide - Flash Programming - Programming Algorithms


HEX File Flash Download

十六进制文件的Flash下载

配置好Flash编程器，编译生成HEX文件后就可以下载到Flash中了，具体的操作步骤如下：

  1. 通过 Project - New Project....菜单命令产生一个µVision工程文件；

  2. 在设备数据库中选择合适的微控制器，但是不要将初始化代码拷贝到工程中去；

  3. 在 Project - Options for Target - Output 页中输入即将生成的十六进制文件名；

  4. 按照配置Flash菜单中 所述的内容设置下载工具；

当使用Flash - Download命令时， µVision会将指定的十六进制文件下载到Flash中 。

用户可以用一个含有批处理文件的µVision工程进行自动Flash编程。


µVision3 Dialog Pages

µVision对话框页面

µVision3提供了一系列对话框页面供用户使用：

  • File — Device Database: 查看、修改微控制器设备列表。
  • File — License Management: 管理软件许可。
  • Edit — Find in Files: 在多个文件中查找。
  • Edit — Configuration: 配置编辑器, 颜色&字体, 用户关键字, 快捷键, 和文本模板。
  • View — Symbol Window: 列表显示当前的调试符号和调试信息。
  • Project — Components, Environment, and Books: 管理源文件，工具环境以及文档。
  • Project — Select Device: 为工程选择微控制设备。
  • Project — Options: 配置工具链。
  • Debug — Breakpoints: 管理执行，存取访问和条件断点。
  • Debug — Debug Settings: 配置仿真存取陷阱。
  • Debug — Logic Analyzer: 配置逻辑分析仪的信号记录。
  • Debug — Memory Map: 配置内存区域和存取类型。
  • Debug — Performance Analyzer: 设置需要统计的地址范围。
  • Debug — Function Editor: 创建调试函数或调试器 .INI文件。
  • Flash — Configure Flash Tools: 配置Flash编程工具。
  • Tools — Setup PC-Lint: 配置Gimpel PC-Lint。
  • Tools — Customize Tools Menu: 添加外部命令行工具。
  • SVCS — Configure Version Control: 设置外部软件版本控制系统。


File - Device Database

在这个对话框里，用户可以为设备数据库添加一个新设备.更多有关配置选项的信息请参考C. 设备数据库参数 。

Database
所选的Device Database™中所有支持的CPU列表。
Vendor
所选设备的制造商。
Family
所选设备的设备系列。
Device
所选设备的CPU名。
Description
有关设备特点的简要说明。
Options
µVision IDE的配置选项。
Add
为设备数据库增加一个新设备。
Update
更新当前对设备数据库所做的修改。


Edit - Find in Files

关于这个对话框的更多信息请参考在文件中查找。

Find what
输入想要查找的内容。
In files of type
输入需要查找的文件类型。
In folder
输入要查找的文件夹名。
Look in subfolders
查找包含指定文件的子文件夹。
Match case
搜索时区分大小写。
Match whole word only
只搜索全字匹配的结果(不包含部分匹配的结果）。
Find
开始查找。
Browse
选择要搜索的文件夹。


Edit - Configuration - User Keywords

Text File Types
选择要修改用户关键字的文件类型。
User Keywords
通过为用户关键字设置颜色，增加或删除编辑器中颜色亮显的关键字。


Edit - Configuration - Shortcut Keys

Text File Types
选择要修改用户关键字的文件类型。
User Keywords
通过为用户关键字设置颜色，增加或删除编辑器中颜色亮显的关键字。


Project - Components, Environment, Books... - Books

在工程工作区中可以浏览书籍和手册。用户可以使用General Books, Tool Specific 和Device Specific中的列表框按钮可进行添加，删除，或者重新排列这些书籍和手册。

General Books
与工具链或者微控制器相独立的通用书籍的列表。
Tool Specific
与工具链相关的书籍列表。
Device Specific
与设备相关的书籍列表。
Default Root
显示在Tools.ini中为这三个组配置的缺省根文件夹。
Add/Change Item
选中一个条目，单击这个按钮便可以改变它。


Project - Options - ARM GNU Target

Xtal (MHz)
指定用户设备的XTAL频率。
Operating System
目前还未实现。


Project - Options - ARM GNU Assembler

Pre-defined Symbols

Define
使用SETA命令设置符号。定义的名字区分大小写。每一个名字可以赋予一个可选值，例如：Check, NoExtRam, X1=1+5 。
Undefine
Reset 清除先前在目标或文件组上层选项对话框中的Define设置。

Language / Code Generation

Enable Arm/Thumb Interworking
在汇编源文件中允许ARM与Thumb模式之间的相互调用。

Other Controls

Include Paths
允许用户指定一个或多个源文件路径（中间以分号隔开）。
Misc Controls
用户可在此指定汇编命令，其中可以包含在对话框中没有提供对话控制选项的命令。
Assembler control string
在汇编命令行中显示当前的汇编控制设置（命令）。


Project - Options - LA Misc

Project - Options - LA Misc (Keil LARM Linker)

Warnings
使能或者禁止链接器警告。警告级别0会禁止大多数链接器警告，警告级别2会使能全部警告。
Disable Warning Numbers
输入禁止的警告数字序列（中间以分号隔开）。
Use Linker Control File
使能链接控制文件。
Function Inlining
配置函数内联以消除调用和参数传递的开销。
Unused Functions
去除或保留在应用程序中没有使用到的函数。
Assign
在链接时定义公共符号和它们相应的值。中间以逗号分割。
Misc Controls
用户可在此指定链接命令，其中可以包含在对话框中没有提供对话控制选项的命令。
Linker Control String
在链接命令行中显示当前的链接控制设置（命令）。


Project - Options - L51 Misc

Disable Warning Numbers
输入禁止的警告数字序列（中间以分号隔开）。
Use Linker Control File
使能链接控制文件。
Overlay
修改用于数据覆盖的调用树。如果在用户程序里使用了函数指针，或者使用了像实时操作系统中调度器那样的跳转，那么修改程序调用树将是很有必要的。
Misc Controls
用户可在此指定链接命令，其中可以包含在对话框中没有提供对话控制选项的命令。
Linker Control String
在链接命令行中显示当前的链接控制设置（命令）。


Project - Debug - Debug Settings

目前只在ARM仿真器中提供此对话框。

Display Message
当所选择事件发生时，在Output Window - Command页面会有相应的信息输出。
Stop Execution
当所选择的事件发生时，中止程序仿真。


Debug - Performance Analyzer

Current PA Ranges
列表显示当前在性能分析仪中所选择的函数或定义的地址范围。
Function Symbols
列表显示可获得的函数符号。双击一个函数可将其名字拷贝到定义行中。
Define Performance Analyzer Range
定义性能分析仪的范围。这个范围可以是一个函数符号或者一段地址范围。
Kill Selected
删除在当前性能分析仪范围列表中所选择的一个表项。
Kill All
删除所有的表项。
Close
关闭对话框。


Debug - Function Editor

关于创建函数文件的详细信息请参考创建函数。

Open
打开浏览对话框，选择一个要编辑的文件。
New...
创建一个新的文件以加入函数。
Save
保存文件的编辑内容。
Save As...
在不同的文件中保存当前的编辑内容。
Compile
编译当前文件，相应的结果在Output Window的Build页中显示。
Compile Errors
显示编译错误。选择一个错误可以在编辑窗口定位相应的出错行。


Tools - Setup PC-Lint

这个对话框用来配置PC-Lint from Gimpel Software，此软件可以添加到µVision3中。

PC-Lint Include Folders
管理PC-Lint的包含文件。所有列出的包含文件夹将会被PC-Lint扫描。
Lint Executable
指定PC-Lint可执行文件的路径。
Configuration File
指定PC-Lint配置文件的路径。下表列出了µVision提供的预定义配置文件。
PC-LINT 配置文件 | 描述
..\C51\BIN\CO-KC51.LNT | PC-LINT配置文件（针对Keil C51和CX51）。
..\C251\BIN\CO-KC251.LNT | PC-LINT配置文件（针对Keil C251）。
..\C166\BIN\CO-KC166.LNT | PC-LINT配置文件（针对C16X的Keil C166和ST10设备）。
..\C166\BIN\CO-KC166XC.LNT | PC-LINT配置文件（针对XC16x的Keil C166设备）。
..\ARM\BIN\CO-KCARM.LNT | PC-LINT配置文件（针对Keil CARM）。


Compiling and Linking MEASURE

编译链接MEASURE

使用菜单Project里的Build Target命令或者工具栏里的相应按钮来编译链接MEASURE例程。编译链接完成后，µVision会显示出相应的信息。

工程编译链接完成后就可以浏览相关符号信息，或者测试MEASURE例程了。


View Program Code

查看程序代码

在µVision里可以通过打开View菜单或工具栏里相应的按钮来查看程序代码，这些源代码连同反汇编代码会一同在反汇编窗口里显示。单击鼠标右键，可通过局部菜单中的选项来改变查看模式或使用其它的一些命令。


View Memory Contents

查看内存内容

µVision3可以多种格式显示内存的内容。可通过View菜单或工具栏里相应的按钮来打开内存窗口。可以在四个页面中输入四个不同的内存地址。另外，通过局部菜单也可以修改内存中的内容或选择不同的输出格式。


Call Stack

调用栈

随着程序的执行，µVision3内部会跟踪函数的嵌套情况。Watch Window的调用栈（Call Stack）页面会显示当前函数的嵌套情况。 双击此页中的某行，将会在工作区中显示所选择函数的源代码。


Trace Recording

跟踪记录

在调试过程中，如果程序运行到某个断点，设计者可能会需要知道一些诸如寄存器的值和其它一些环境信息。如果设置了Enable/Disable Trace Recording，那么就可以看到在到达断点前CPU所执行的指令。在工程工作空间的Regs页面也会显示执行所选择指令的过程中相应CPU寄存器的内容。


µVision: Appendix

附录

附录提供了许多关于Keil µVision的详细信息，包括：

  • 产品认证
  • 文件类型
  • 设备数据库参数


View - Source Browser

Symbol
g
Filter on
g
File Outline
g
Memory Spaces
g
Function list
g
Definitions and References
g


View - Code Coverage

更多相关信息请参考 Code Coverage 。

Current Module
Current module下拉列表用于选择进行代码统计分析的源模块。一旦某个模块被选中，Code Coverage窗口将显示该模块中已执行部分每个函数的指令执行百分比.
Module/Function list
显示带执行百分比的模块及函数的列表。
Reset
在程序运行过程中若按下Reset按钮，将复位Code Coverage窗口的状态。
Update
在目标程序运行过程中若按下Update按钮，将会更新Code Coverage窗口内百分比值。
Close
关闭本对话框。


Get Filetype


Go To Address


Go To Line


Debug - Inline Assembler

Current Instruction
显示在Current Assembly Address中指定地址处的汇编指令。
Current Assembly Address
指定一个汇编地址进行查看和编辑。
Enter New Instruction
输入新的汇编指令以替换先前在指定地址上的那条指令。


View - Logic Analyzer


View - Logic Analyser


View - Performance Analyser


SVCS - Query for Input


Configuration Wizard


Toolbox