【ARM Trace32(劳特巴赫) 使用介绍 2.1 -- TRACE32 Practice 脚本 cmm 脚本学习】


请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】


上篇文章【ARM Trace32(劳特巴赫) 使用介绍 2 - Veloce 环境中使用trace32 连接 Cortex-M33】
下篇文章【ARM Trace32(劳特巴赫) 使用介绍 2.2 – TRACE32 进阶命令之 DIAG 弹框命令】

文章目录

  • 1. TRACE32 Practice 语法
    • 1.1 脚本变量申明
      • 1.1.1 本地变量申明:
      • 1.1.2 全局变量申明:
      • 1.1.3 常量
    • 1.2 Trace32 循环语句
      • 1.2.1 While
      • 1.2.2 Repeat
      • 1.2.3 Repeat While
    • 1.2 Trace32 条件判断
      • 1.3.1 IF ELSE 条件判断
    • 1.4 Trace32 跳转语句
      • 1.4.1 GOTO
      • 1.4.2 JUMPTO

1. TRACE32 Practice 语法

Practice脚本是Lauterbach公司提供的一种脚本语言,运用于其TRACE32软件当中,非常容易上手、并且功能强大。其运用的主要领域包含:

  • 自动化测试
  • 创建图形化界面的工具
  • 初始化和配置TRACE32软件
  • 控制Lauterbach硬件

1.1 脚本变量申明

Practice脚本中的变量(Variable)被称为(Marco),其本质就是存储于内存中的字符串,与C语言中的宏不同,Practice脚本中的宏随时可以被创建和修改。且根据作用域的不同,其又被进一步分为三类: 本地宏,私有宏,全局宏:

  • 本地宏(Local Marco)
    在代码块(block)中存在,离开代码块时被擦除。本地宏在它的代码块、子代码块、子函数、子脚本中可见。
  • 私有宏(Private Marco)
    仅在声明它的代码块和子代码块中可见。
  • 全局宏(Global Marco)
    全局可见,并且声明它的代码块终止后也不会被擦除。

1.1.1 本地变量申明:

 LOCAL &a &b &c //关健字为LOCAL, 变量以 “&” 开头
 ENTRY &a &b
 &c=&a*&b
 RETURN &c

1.1.2 全局变量申明:

 GLOBAL &State &Level //关健字为 GLOBAL,变量以“&”开头

1.1.3 常量

Practice脚本中支持多种常量类型:
十进制 128.
浮点型 128.0369.36
十六进制 0xA5A5
二进制 0b0010
比特掩码 0y10xx0
布尔型 TRUE()FALSE()
字符串 “hello world
字符 ‘z
地址 P:0x100
带段信息的地址 P:0x02:0x100
地址范围 P:0x100--0x1ffP:0x100++0x0f
高级语言的符号表 ‘main

声明、初始化宏都很简单,下面是个简单的例子,先声明,再初始化。注意在初始化宏的时候,宏名称和等号之间不能有空格,等号后面允许有空格。

GLOBAL  &ChipVersion
LOCAL  &msg1
PRIVATE &val1 &val2

&ChipVersion= "ES1"
&msg1=  "Hello World!"
&val1=  0xAA55
&val2=  128.

1.2 Trace32 循环语句

在 practice 脚本中,常见的循环有while、repeat、以及这两种的组合。

1.2.1 While

在限定条件下,重复执行一个代码段

WHILE <condition>		Execute <block> while <condition> is true.
(
	<block>				<condition> has to be specified in TRACE32 syntax.
)
AREA.view
PRIVATE &i
&i=0.
WHILE &i<10. ;Loop while &i is smaller 10
(
    PRINT "Count: " &i
    &i=&i+1.
)
ENDDO

执行结果
在这里插入图片描述

1.2.2 Repeat

按照给定的次数,重复执行一个代码段。

语法1

RePeaT <count> <command> 		Repeat <command> <count>-times.

示例1

;Example 1
;Print the character X 5 times
AREA.view
RePeaT 5. PRINT "hello world"

执行结果
在这里插入图片描述

语法 2

RePeaT <count>					Repeat <block> <count>-times.
(
	<block>
)

示例1
每 200ms 打印一个“*

;Example 2
AREA.view
RePeaT 10.
(
	PRINT %CONTinue "*"
	WAIT 200.ms
)

结果如下
在这里插入图片描述

示例2

;Example 2
Var.Break.Set flags /Write 		//Set a Write breakpoint to array
								//flags
;Repeat the following 10 times
;Start the program and wait until the target halts at the breakpoint.
;Then export the contents of array flags to file flags_export.csv in CSV
;format.
RePeaT 10.
(
	Go
	WAIT !STATE.RUN()
	Var.EXPORT "flags_export.csv" flags /Append
)

1.2.3 Repeat While

类似 C 语言中的 do-while 循环

;Example 3
;Read a line from my_strings.txt
;Write not-empty lines to file my_strings_noempty.txt

PRIVATE &CurrentLine &RightLine
OPEN #1 my_strings.txt /Read
OPEN #2 my_strings_noempty.txt /Create
AREA.view
RePeaT
(
	READ #1 %LINE &CurrentLine
	IF (!FILE.EOFLASTREAD()&&("&CurrentLine"!=””))
	WRITE #2 "&CurrentLine"
)
WHILE !FILE.EOFLASTREAD()
CLOSE #1
CLOSE #2

1.2 Trace32 条件判断

1.3.1 IF ELSE 条件判断

Practice 脚本中的条件判断是依赖 IF ELSE 语句来完成的。

  • IF ELSE 和其后的条件语句之间要有至少一个空格;
  • 条件语句本身可以用圆括号包裹,也可不用;
  • IF ELSE 所条件执行的代码段必须使用圆括号包裹,注意这时圆括号必须位于独立的一行。

语法如下

IF <condition>
(
	<if_block>
)
ELSE
(
	<else_block>
)

示例1
Trace32 关健字不区分大小写,也可以是 if else

AREA.view
PRINT "IF ELSE Ttest"

IF "a"=="a"
(
  PRINT "true"
)
ELSE IF "a"=="b"
(
  PRINT "false"
)
ELSE
(
  PRINT "这里不会运行(test)"
)

运行结果
在这里插入图片描述

Trace32 里面没有 then 关健字,多行语句请使用括号"()"括起来。

示例 2

// Script double_if.cmm
PRIVATE &testfunc &correct_result
OPEN #1 "func_test.txt" /READ

WHILE TRUE()
(
	READ #1 &testfunc &correct_result
	IF "&testfunc"!=""
	(
		IF Var.VALUE(&testfunc)==&correct_result
		(
			APPEND "test_protocol.txt"\
			FORMAT.STRing("&testfunc=&correct_result",50.,' ')\
			FORMAT.UnixTime("c",DATE.UnixTime(),DATE.utcOffSet())
		)
		ELSE
		(
			PRIVATE &result
			&result=CONVert.HEXTOINT(Var.VALUE(&testfunc))
			APPEND "test_protocol.txt"\
			FORMAT.STRing("&testfunc failed with &result (&correct_result)",50.,' ')\
			FORMAT.UnixTime("c",DATE.UnixTime(),DATE.utcOffSet())
		)
	)
	ELSE
	(
		CLOSE #1
		ENDDO
	)
)
ENDDO

如果一行字符太长可以使用换行符 “\”。

1.4 Trace32 跳转语句

利用GOSUB、GOTO和JUMPTO指令可以完成脚本内的跳转。

1.4.1 GOTO

语法:

GOTO <label> 					Continue PRACTICE script at <label>.
								<label> must be part of the currently executing script.

示例

GOTO 88. 				 ;跳转至当前脚本文件第88
AREA.view
GOTO print_hello

print_hello:
	PRINT "hello world !"
ENDDO

运行结果
在这里插入图片描述

1.4.2 JUMPTO

JUMPTO <label> 			Continue PRACTICE script at <label>.
						<label> must be part of a script that is currently located on the
						PRACTICE stack. <label> must not be located in a block.

示例

AREA.view

PRINT "test start..."
GOTO jumpto_test

PRINT "jumpto test failed!"

jumpto_test:
	PRINT "jumpto test success!"
ENDDO

运行结果
在这里插入图片描述


上篇文章【ARM Trace32(劳特巴赫) 使用介绍 2 - Veloce 环境中使用trace32 连接 Cortex-M33】
下篇文章【ARM Trace32(劳特巴赫) 使用介绍 2.2 – TRACE32 进阶命令之 DIAG 弹框命令】

推荐阅读
https://blog.csdn.net/thanklife/article/details/119608383
https://blog.csdn.net/goodlinux/article/details/6736418
https://zhuanlan.zhihu.com/p/37827150

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/155842.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE基础篇七:特效

导语&#xff1a; 文末有工程地址&#xff0c;通过小游戏来学习特效 入门 下载项目&#xff0c;在文章最下面 按播放开始游戏。按住左键射击并使用W、A、S和D移动。 在本教程中&#xff0c;您将创建两个粒子效果。一个用于船舶的推进器&#xff0c;一个用于船舶爆炸时。要创…

filter - 常用滤镜效果(毛玻璃、图片阴影、图片褪色)

文章目录 filter 属性滤镜算法函数blur&#xff1a;高斯模糊hue-rotate&#xff1a;色相环contrast&#xff1a;对比度grayscale&#xff1a;灰度drop-shadow&#xff1a;图片阴影 常见的滤镜效果图片内容轮廓阴影毛玻璃图片黑白调整图片色相和对比度使元素或文字变圆润 filter…

租赁小程序|租赁系统一种新型的商业模式

租赁市场是一个庞大的市场&#xff0c;它由出租人和承租人组成&#xff0c;以及相关的中介机构和供应商等。随着经济的发展和人们对灵活性的需求增加&#xff0c;租赁市场也在不断发展和壮大。特别是在共享经济时代&#xff0c;租赁市场得到了进一步的推动和发展。租赁系统是一…

储能领域 / 通讯协议 / 技术栈 等专有名字集锦——主要收集一些储能领域的专有名词,以及相关的名词

目录 名词解释ModbusIOT设备通讯协议 CAN/ RS-485 储能术语电池管理系统Battery Management System&#xff0c;BMS电池相关知识拆解电池的构成逆变器 电池核心参数SOC 电池剩余容量 名词解释 英文中文biz layer业务层与业务层通信的服务CRC循环冗余校验&#xff08;CRC&#…

开发一款小程序游戏需要多少钱?

小程序游戏的开发成本因多种因素而异&#xff0c;无法提供具体的固定数字。以下是影响小程序游戏开发成本的一些关键因素&#xff1a; 游戏规模和复杂度&#xff1a; 小程序游戏可以是简单的休闲游戏&#xff0c;也可以是更复杂的策略游戏。规模和复杂度会影响开发所需的时间和…

软件测试入门:静态测试

什么是静态测试 顾名思义&#xff0c;这里的静态是指程序的状态&#xff0c;即在不执行代码的情况下检查软件应用程序中的缺陷。进行静态测试是为了仅早在开发的早期阶段发现程序缺陷&#xff0c;因为这样可以更快速地识别缺陷并低成本解决缺陷&#xff0c;它还有助于查找动态…

UE基础篇六:音频

导语: 通过实现一个小游戏,来学会音频,最后效果 入门 下载启动项目并解压缩。通过导航到项目文件夹并打开SkywardMuffin.uproject来打开项目。 按播放开始游戏。游戏的目标是在不坠落的情况下触摸尽可能多的云。单击鼠标左键跳到第一朵云。 游戏很放松,不是吗?为了强调…

【分布式】BASE理论详解

一、什么是BASE理论&#xff1f; BASE理论是对分布式系统设计和处理的一种理论指导&#xff0c;相对于ACID&#xff08;原子性、一致性、隔离性和持久性&#xff09;这一强一致性模型&#xff0c;BASE更强调在分布式系统中牺牲强一致性以获得可用性和性能的平衡。 BASE 理论是…

安装插件时Vscode XHR Failed 报错ERR_CERT_AUTHORITY_INVALID

安装插件时Vscode XHR Failed 报错ERR_CERT_AUTHORITY_INVALID 今天用vscode 安装python插件时报XHR failed,无法拉取应用商城的数据&#xff0c; 报的错如下&#xff1a; ERR_CERT_AUTHORITY_INVALID 翻译过来就是证书有问题 找错误代码的方法&#xff1a; 打开vscode, 按F1…

MYSQL中的触发器TRIGGER

1.概念 触发器是一个特殊的存储过程&#xff0c;当触发器保护的数据发生变更时就会触发。 2.特性 1.触发器与表息息相关&#xff0c;一般我们一个表创建六个触发器。 2.六个触发器其实是三种类六个 insert 类型 before | after insertupdate 类型 before | af…

Kubernetes基础知识了解

一、Kubernetes简介 Kubernetes是一个轻便的和可扩展的开源平台&#xff0c;用于管理容器化应用和服务。通过Kubernetes能够进行应用的自动化部署和扩缩容。在Kubernetes中&#xff0c;会将组成应用的容器组合成一个逻辑单元以更易管理和发现。Kubernetes积累了作为Google生产…

51单片机的基础知识汇总

文章目录 51单片机之点灯51单片机之灯的亮灭交替51单片机之灯的流水灯51单片机之数码管数字显示51单片机之数码管数字的流水灯51单片机之数码管数字的0-7显示51单片机之蜂鸣器的鸣叫与关闭51单片机之DS1302时钟设置51单片机之读出温度传感器温度代码模块化汇总主函数main.c 延时…

利用回溯绕过正则表达式

目录 利用strpos的特性拿到flag 利用回溯绕过正则表达式 利用回溯次数绕过正则表达式并且实现文件上传 使用回溯绕过正则表达式waf拿到flag 本篇会讲解三个实验来分别绕过正则表达式&#xff0c;python的正则表达式和Javascript的正则表达式大致相同如果有正则表达式不太懂…

千梦网创:实现自动化“挂机躺盈”的三种方法

在互联网众多行业中&#xff0c;有很多人一直在寻找所谓的“挂机躺盈”的项目&#xff0c;在理财领域这种收入被称为“被动收入”。 天上不会掉馅饼这是一句讲烂掉的话了&#xff0c;躺在家里吃白食等着钱进账是一件不可能的事情。 然而如果你看到身边有“被动收入”的例子&a…

QTableWidget 设置列宽行高大小的几种方式及其他常用属性设置

目录 效果&#xff1a; 1.列宽、行高自动分配 2.固定值 3.随内容分配列宽 随内容分配行高 4.水平方向标签拓展剩下的窗口部分&#xff0c;填满表格 5.列宽是自动分配的&#xff0c;但是第一列可手动调整宽度&#xff0c;而表格整体的列宽仍是自动分配的。第二、三列办法调…

UE基础篇五:动画

导语: 视频文档在文末 一、动画 1.1 物理资产可以用来做布娃娃系统 1.2 混合空间 调整这个值会在动画切换时有一个插值时间,表现为等一下再切 1.3 启用根运动 1.4 一些导入设置只有在导入时才有效, 1.5 动画图标可以预览调节数值<

类和对象(7):初始化列表

class Date { public:Date(int year 1, int month 1, int day 1){_year year;_month month;_day day;}private:int _year;int _month;int _day; };构造函数体内的语句只能称为赋初值&#xff0c;不能称为初始化。初始化只能初始化一次&#xff0c;而构造函数体内可以多次…

【洛谷算法题】P5712-Apples【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5712-Apples【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格式&…

Excel Unix时间戳和日期时间格式的相互转换

时间戳转日期时间 ((A18*3600)/86400)DATE(1970,1,1) # 或 (A18*3600)/8640070*36519# 带格式化 TEXT((C18*3600)/8640070*36519,"yyyy-mm-dd hh:mm:ss")首先加8小时进行时区转换&#xff0c;然后转换成天数&#xff0c;再加上1970年1月1日&#xff0c;最后设置日期…

在node-red 的function中使用第三方的npm 库来处理业务逻辑

首先找到node-red的安装目录,这个目录可以在启动日志里看到。 如我的 我的就是在 /Users/fizz/.node-red 进入该目录,安装所需要的库 如 npm install lodash 然后在setting.js 中配置functionGlobalContext // The following property can be used to seed Global Context …