翻译于:http://www.keil.com/support/man/docs/uv4/uv4_db_expressions.htm
Home→µVision User's Guide→Expressions
目录
1 调试表达式
2 常量
2.1 二进制、十进制、十六进制和八进制常量
2.2 浮点常量
2.3 字符常量
2.4 字符串常量
2.5 使用内存属性说明符
3 系统变量
4 外部变量
5 程序变量(符号)
6 行号
7 位地址
8 类型说明
9 内存属性说明符
10 运算符
11 µVision和C之间的区别
12 表达式例子
组成部分 |
描述 |
常量 |
常量是固定的数值或字符串。 |
系统变量 |
系统变量改变或影响µVision运作方式。 |
外设变量 |
外设寄存器变量允许访问模拟的(simulated)片上外设。 |
程序变量(符号) |
程序变量是程序的变量。它们通常被称为符号(symbols)或象征性的名字(symbolic names)。 |
行号 |
行号参考了可执行程序的代码地址。编译或汇编程序时,编译器和汇编器在生成的对象模块中包含行号信息。 |
位地址 |
位地址引用了位可寻址数据存储器。 |
类型说明 |
类型说明允许您指定表达式或子表达式的数据类型。 |
内存属性说明符 |
内存属性说明符是用于调试命令中显式安全或非安全访问的地址扩展(address extensions)。 |
运算符 |
操作符包括+、-、*和/。运算符可用于将子表达式组合成单个表达式。您可以使用C编程语言中可用的所有操作符。 |
µVision和C之间的区别 |
需要注意的差异。 |
表达式例子 |
用于解释表达式用法的代码片段,这些片段可以在命令窗口中输入。 |
µVision调试器接受以下类型的常量:二进制、十进制、十六进制、八进制,浮点,字符和字符串。
默认情况下,数值常量的类型是十进制。如,输入10时,这是十进制数字10,而不是十六进制值10h。但是,命令窗口中的输出值由系统变量基数(radix)控制。
使用下表中列出的前缀或后缀来更改数字表达式的含义:
Base |
Prefix |
Suffix |
Example |
Binary: |
None |
Y or y |
11111111Y |
Decimal: |
None |
T or none |
1234T or 1234 |
Hexadecimal: |
0x or 0X |
H or h |
1234H or 0x1234 |
Octal: |
0 (zero) |
Q, q, O, or o |
0777 or 777q or 777Q or 777o |
关于数值常量:
0Ah, 1h, 1Ah
0xA, 0x1, 0x1A
无效的表达式如下:Ah, 0x0Ah, 0x1h, 0x1Ah
数值常量默认为16位值。它们可以用L后缀,使它们32位宽。例如:0x1234L, 1234L, 1255HL。
浮点数的小数点前必须有一位数字。因此,不允许输入。12,但必须输入0.12。浮点常量可以有以下格式:
有效浮点常数如下:4.12, 0.1e3, 12.12e–5
字符常量的C编程语言规则适用于µVision调试器。
有效的字符常量如下:'a', '1', '\n', '\v', '\x0FE', '\015'
转义字符同样被支持:
Sequence |
Description |
\\ |
Backslash character ( \ ). |
\" |
Double quote. |
\' |
Single quote. |
\a |
Alert, bell. |
\b |
Backspace. |
\f |
Form feed. |
\n |
Newline. |
\r |
Carriage return. |
\t |
Tab. |
\0nn |
Octal constant. |
\Xnnn |
HEX constant. |
字符串常量的C编程语言规则同样适用于µVision调试器。然而,与c语言相反,连续的字符串并不连接成一个字符串。例如,“string1”+“string2”没有组合成单个字符串。
有效字符串常量:"string\x007\n" "value of %s = %04XH\n"
在嵌套字符串中转义双引号:"printf (\"hello world!\n\")"
使用内存属性说明符将调试上下文设置为安全或非安全模式。
1、访问非安全内存
例如在内存窗口中,使用非安全说明符,你可以访问不安全的内存:
在这三种情况下,您都可以看到非安全内存的内容。当您访问安全内存时,这种情况会改变。
2、访问安全内存
例如在内存窗口中,使用非安全说明符,访问不安全的内存可能是不可行的:
当尝试使用非安全说明符(NS:0x00000200)访问安全内存时,访问将被拒绝。
系统变量允许访问特定的函数,并且可以在任何可以使用程序变量或表达式的地方使用。下表列出了系统变量。
系统变量 |
类型 |
说明 |
$ |
unsigned long |
表示程序计数器(寄存器)。使用$-符号来显示和更改程序计数器。例如,$ = 0x4000将程序计数器设置为地址0x4000。 |
_break_ |
unsigned int |
当设置为非零值时,将停止程序执行。在调试函数中使用此变量来停止程序执行。 |
states |
unsigned long |
显示CPU指令状态计数器值(32位)。它从0开始计数,并随着指令的执行而递增。 |
states64 |
unsigned long long |
显示CPU指令状态计数器值(64位)。它从0开始计数,并随着指令的执行而递增。 |
seconds |
double |
以秒为单位显示执行时间。此变量可用于某些设备。 |
itrace |
unsigned int |
指示是否执行跟踪记录。当itrace为0时,不执行任何跟踪记录。当itrace具有非零值时,将记录跟踪信息。请参阅指令跟踪窗口。 |
radix |
unsigned int |
显示和设置数值的输出基数。基数(radix)可以是10或16。十六进制输出的默认设置为16。通过在命令窗口中输入radix=10或在调试模式下使用编辑器(editor)中的上下文菜单项(context menu)来更改输出基数(参见下面的内容)。 |
在调试模式下使用编辑器更改基数:
在调试模式下,提示框显示变量的值:
使用编辑器的上下文菜单改变基数为10:
新的基数在工具提示中使用:
Related Knowledgebase Articles
ARM: Act on ULINK_IN (ULINKplus VTREG) changes
许多符号会根据你为你的项目选择的CPU自动定义:
可以使用调试功能(Debug Functions)自动输入外围设备。参考模拟脚本模板( Simulation Script Templates)。
也可以参考:
外部寄存器
外设寄存器µVision定义符号。可用的外围寄存器符号取决于所选的微控制器。它们有一个相关的地址,可以在表达式中使用。
虚拟仿真寄存器
虚拟仿真寄存器(vtreg)允许您使用CPU的模拟脚进行输入和输出。vtreg提供了一种能指定信号从模拟硬件进入CPU的方法。vtreg即不是Public symbols,也不在CPU的内存空间中。它们可以在表达式中使用,但是它们的值和利用率依赖于CPU。您可以使用命令DIR VTREG列出这些符号。
下表描述了VTREG符号。
VTREG |
Description |
ADx |
芯片上的模拟输入管脚。典型如,A/D转换器输入。您的目标程序可能会读取您写入ADx VTREGs的值。 |
DAx |
芯片上的模拟输出管脚。这个值通常反映了D/ A转换器的输出。 |
xxVREF |
输入电压参考引脚。 |
PORTx |
芯片上端口的一组I/O引脚。例如,PORTA指的是PORTA的所有引脚。这些寄存器允许您模拟端口I/O。 |
SxIN |
串行接口x的输入缓冲区。您可以将8位或9位的值写入SxIN。这些值由目标程序读取。您可以读取SxIN来确定输入缓冲区何时可以用于其他字符。值0xFFFF表示以前的值已经完全处理完毕,可以写入新的值。 |
SxOUT |
8位串行接口的输出缓冲区xµVision副本或9-bit值(编程)SxOUT VTREG。 |
SxTIME |
定义了串行接口的波特率时间x。当SxTIME是1,µVision模拟串行接口的时机使用编程的波特率。当SxTIME为0(默认值)时,忽略程序设定的baudrate定时,串行传输时间为瞬时。 |
CLOCK |
仿真CPU的实际时钟频率。 |
XTAL |
仿真CPU的晶振频率,该值被定义在Options for Target 对话框中. |
符号(Symbols)是源代码标识符的表示,如应用程序、模块、变量、函数、特殊函数寄存器或虚拟寄存器的名称。通常,符号与调试信息相关联,例如:它们所代表的标识符的类型、范围或位置。符号允许您使用在原始源代码中定义的标识符名称。
符号名称的一般形式是:
[\\ExecName][[\[Path/]Module][\Identifier]]
ExecName |
表示应用程序名称,这个名称定义于: Options for Target - Output - Name of Executable. 在该名称前面必须加两个反斜杠 (\\). |
路径,Path |
表示源代码文件的路径。用斜线(/)将文件夹与子文件夹分开。路径必须以斜杠(/)结束。Path可以是绝对路径,也可以是相对路径。 |
模块,Module |
表示源模块的名称(*.c *.cpp)。可以在前面加上一个路径,但必须以反斜杠(\)开头。可以使用调试命令从命令窗口查询模块名: DIR module |
标示符,Identifier |
表示源代码对象。必须使用反斜杠(\)与模块分开。可以独立使用,在应用程序中唯一时,不需要反斜杠。标识符可以是:
|
例子及其他更多的表达式:
使用内存属性说明符
访问安全的内存:例如在内存窗口,使用不同的说明符,访问位于安全内存中的程序变量可能是不可行的:
当试图使用非安全说明符(&NS:SystemCoreClock)访问位于安全内存中的程序变量时,访问将被拒绝。
行号支持源代码级调试。行号指定相关程序代码的源模块中的物理地址。行号的语法如下表所示:
Line Number Symbol |
Code Address ... |
\LineNumber |
... for line number LineNumber in the current module. |
\ModuleName\LineNumber |
... for line number LineNumber in ModuleName. |
Example
\Blinky.c\108 /* Line 108 in module Blinky.c */
\143 /* Line 143 in the current module */
位地址表示内存中的位。这包括特殊函数寄存器中的位。位地址的语法是表达式:expression.bit_position
Examples
R6.2 /* Bit 2 of register R6 */
0xFD00.15 /* Value of the 166 bit space */
在表达式中,µVision会进行隐式类型转换(implicit type casting).可以将表达式显式转换为特定的数据类型。类型转换遵循C编程语言中使用的规则。例子:
(unsigned int) 31.2 /* gives unsigned int 31 from the float value */
内存属性说明符是用于调试命令中显式安全或非安全访问的地址扩展。µVision提供了预定义的属性说明符。内存属性说明符由一个冒号(:)从内存地址中分隔。
这些说明符可用于所有调试命令,并且凸显了表示目标内存地址或需要目标内存访问来解析表达式的特征(这是常量和程序变量需要的特征):
下表显示了内存属性说明符及其在不同Arm Cortex-M架构中的可用性。
Specifier |
Armv6-M |
Armv7-M |
Armv8-M |
Description |
No specifier |
|
Debugger decides on the access (usually secure for Armv8-M). |
||
S: |
|
|
Secure debug access on debug access port (DAP). |
|
NS: |
|
|
Non-secure debug access on debug access port (DAP). |
内存属性说明符可用于以下命令和调试功能:
µVision支持所有运营商的C编程语言。这些操作符与它们的C等价物具有相同的含义。
μVision中的表达式与C编程语言中的表达式有许多不同:
在输出窗口的命令页中输入了以下表达式。所有适用的输出都包含在每个示例中。所有的例子都使用了MEASURE示例程序。
Constant
>0x1234 /* Simple constant */
0x1234 /* Output */
>EVAL 0x1234
4660T 11064Q 1234H '...4' /* Output in several number bases */
Register
>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 */
Function Symbol
>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...
Address Utilization Examples
>&\measure\main\cmdbuf[0] + 10 /* Address calculation */
0x23026
>_RBYTE (0x233DA) /* Read byte from code address 0x233DA */
0x76 /* Reply */
Symbol Output Examples
>dir \measure\main /* Output symbols from main() in module MEASURE */
R14 idx . . . uint /* Output */
R13 i . . . uint
0x0002301C cmdbuf . . . array[15] of char
Program Counter Examples
>$ = 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
Program Variable Examples
>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
Line Number Examples
>\163 /* Address of the line number #104 */
0x000230DA /* Reply */
>\MCOMMAND\91 /* A line number of module MCOMMAND */
0x000231F6
Operator Examples
>--R5 /* Auto-decrement also for CPU registers */
0xFE
>mdisplay /* Output a PUBLIC bit variable */
0
>mdisplay = 1 /* Change */
>mdisplay /* Check result */
1
Structure Examples
>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
µVision Debug Function Invocation Examples
>printf ("µVision is coming!\n") /* String constant within printf() */
µVision is coming! /* Output */
>_WBYTE(0x20000, _RBYTE(0x20001)) /* Read & Write Memory Byte */
> /* example useful in debug functions */
>interval.min = getint ("enter integer: ");
Fully Qualified Symbol Examples
>--\measure\main\idx /* Auto INC/DEC valid for qualified symbol */
0xFFFF
Fully Qualified Symbol Examples for Cortex-M
BS \\cpp_template\../../source/RVCT/STM32F10x.s\146, 1
BS \\cpp_template\_numeric.CC\293, 1