Keil调试笔记:调试表达式(翻译)

翻译于: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 表达式例子


1 调试表达式

组成部分

描述

常量

常量是固定的数值或字符串。

系统变量

系统变量改变或影响µVision运作方式。

外设变量

外设寄存器变量允许访问模拟的(simulated)片上外设。

程序变量(符号)

程序变量是程序的变量。它们通常被称为符号(symbols)或象征性的名字(symbolic names)。

行号

行号参考了可执行程序的代码地址。编译或汇编程序时,编译器和汇编器在生成的对象模块中包含行号信息。

位地址

位地址引用了位可寻址数据存储器。

类型说明

类型说明允许您指定表达式或子表达式的数据类型。

内存属性说明符

内存属性说明符是用于调试命令中显式安全或非安全访问的地址扩展(address extensions)。

运算符

操作符包括+、-、*和/。运算符可用于将子表达式组合成单个表达式。您可以使用C编程语言中可用的所有操作符。

µVision和C之间的区别

需要注意的差异。

表达式例子

用于解释表达式用法的代码片段,这些片段可以在命令窗口中输入。

2 常量

µVision调试器接受以下类型的常量:二进制、十进制、十六进制、八进制,浮点,字符和字符串。

2.1 二进制、十进制、十六进制和八进制常量

默认情况下,数值常量的类型是十进制。如,输入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)

QqO, or o

0777 or 777q or 777Q or 777o

关于数值常量:

  • 当第一个数字是A到F并且使用了十六进制后缀时,十六进制常量必须以前导零作为前缀。不要将十六进制后缀和前缀合并为一个常量。有效的十六进制表达式如下:

0Ah, 1h,  1Ah

0xA, 0x1, 0x1A

无效的表达式如下:Ah, 0x0Ah, 0x1h,  0x1Ah

  • 超过16位整数范围的数字自动转换为32位整数。

数值常量默认为16位值。它们可以用L后缀,使它们32位宽。例如:0x1234L, 1234L, 1255HL

  • 数字可以用美元符号(“$”)进行分组(为了便于阅读)。例如,1111$1111y等同于11111111y

2.2 浮点常量

浮点数的小数点前必须有一位数字。因此,不允许输入。12,但必须输入0.12。浮点常量可以有以下格式:

  • number.number
  • number[e[+|-]number]
  • number.number[e[+|-]number]

有效浮点常数如下:4.12, 0.1e3, 12.12e–5

2.3 字符常量

字符常量的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.

2.4 字符串常量

字符串常量的C编程语言规则同样适用于µVision调试器。然而,与c语言相反,连续的字符串并不连接成一个字符串。例如,“string1”+“string2”没有组合成单个字符串。

有效字符串常量:"string\x007\n"   "value of %s = %04XH\n"

在嵌套字符串中转义双引号:"printf (\"hello world!\n\")"

2.5 使用内存属性说明符

使用内存属性说明符将调试上下文设置为安全或非安全模式。

1、访问非安全内存

例如在内存窗口中,使用非安全说明符,你可以访问不安全的内存:

在这三种情况下,您都可以看到非安全内存的内容。当您访问安全内存时,这种情况会改变。

2、访问安全内存

例如在内存窗口中,使用非安全说明符,访问不安全的内存可能是不可行的:

当尝试使用非安全说明符(NS:0x00000200)访问安全内存时,访问将被拒绝。

3 系统变量

系统变量允许访问特定的函数,并且可以在任何可以使用程序变量或表达式的地方使用。下表列出了系统变量。

系统变量

类型

说明

$

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

4 外部变量

许多符号会根据你为你的项目选择的CPU自动定义:

  • 外围寄存器(或特殊功能寄存器、SFRs)和
  • 虚拟仿真寄存器(VTREGs)。

可以使用调试功能(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 对话框中.

5 程序变量(符号)

符号(Symbols)是源代码标识符的表示,如应用程序、模块、变量、函数、特殊函数寄存器或虚拟寄存器的名称。通常,符号与调试信息相关联,例如:它们所代表的标识符的类型、范围或位置。符号允许您使用在原始源代码中定义的标识符名称。

符号名称的一般形式是:

[\\ExecName][[\[Path/]Module][\Identifier]]

ExecName

表示应用程序名称,这个名称定义于: Options for Target - Output - Name of Executable. 在该名称前面必须加两个反斜杠 (\\).

路径,Path

表示源代码文件的路径。用斜线(/)将文件夹与子文件夹分开。路径必须以斜杠(/)结束。Path可以是绝对路径,也可以是相对路径。

模块,Module

表示源模块的名称(*.c *.cpp)。可以在前面加上一个路径,但必须以反斜杠(\)开头。可以使用调试命令从命令窗口查询模块名: DIR module

标示符,Identifier

表示源代码对象。必须使用反斜杠(\)与模块分开。可以独立使用,在应用程序中唯一时,不需要反斜杠。标识符可以是:

  • 代码行号
  • 标量变量(char, int, long, float, double)
  • 复合变量 (array, structure, file).
  • 函数.
  • 以上标示符的有意义的组合

例子及其他更多的表达式:

使用内存属性说明符

访问安全的内存:例如在内存窗口,使用不同的说明符,访问位于安全内存中的程序变量可能是不可行的:

当试图使用非安全说明符(&NS:SystemCoreClock)访问位于安全内存中的程序变量时,访问将被拒绝。

6 行号

行号支持源代码级调试。行号指定相关程序代码的源模块中的物理地址。行号的语法如下表所示:

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 */

7 位地址

位地址表示内存中的位。这包括特殊函数寄存器中的位。位地址的语法是表达式:expression.bit_position

Examples

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

8 类型说明

在表达式中,µVision会进行隐式类型转换(implicit type casting).可以将表达式显式转换为特定的数据类型。类型转换遵循C编程语言中使用的规则。例子:

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

9 内存属性说明符

内存属性说明符是用于调试命令中显式安全或非安全访问的地址扩展。µ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).

内存属性说明符可用于以下命令和调试功能:

  • SAVE
  • D (Display)
  • WS (WatchSet)
  • E (Enter)
  • memset() function
  • T (Step)
  • P (Step Over)
  • G (Go)
  • LA (Logic Analyzer)
  • TRTSTHTDPTAP (Tracepoint Commands)
  • BSBLBA (Breakpoint Commands)
  • SBC (Software Breakpoint Configuration)
  • EVAL

10 运算符

µVision支持所有运营商的C编程语言。这些操作符与它们的C等价物具有相同的含义。

11 µVisionC之间的区别

μVision中的表达式与C编程语言中的表达式有许多不同:

  • µVision不区分大写和小写字母符号名称和命令名称。
  • µVision不支持将表达式转换为char*或int*型指针。指针类型是从目标程序中的符号信息中获得的。它们不能被创造。
  • 无法从命令行调用目标函数。
  • µVision不支持结构体赋值。

12 表达式例子

在输出窗口的命令页中输入了以下表达式。所有适用的输出都包含在每个示例中。所有的例子都使用了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

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值