发新帖我要提问
123
返回列表
打印
[其他ST产品]

STM32 使用 Keil MDK 中的软件逻辑分析仪参与硬件调试

[复制链接]
楼主: 大鹏2365
手机看帖
扫描二维码
随时随地手机跟帖
41
大鹏2365|  楼主 | 2022-3-31 20:59 | 只看该作者 回帖奖励 |倒序浏览
配置 Logic Analyzer:

进入 Debug 模式 Debug。打开菜单 View/Analysis Windows 并选择 Logic Analyzer,或者选择工具栏上的 LA 按钮 LA 按钮 。
提示: 可以在程序运行中配置LA。

点击 Blinky.c 选项卡,右键点击
value
变量并选择 Add value to… 及 Logic Analyzer。也可以手动拖拽来添加。

点击 LA 左上角的 Setup… 按钮进入 LA 设置窗口。

选择 value,设置 Display Range Max 为 0x15。

点击 Close。
LA Setup

使用特权

评论回复
42
大鹏2365|  楼主 | 2022-3-31 21:00 | 只看该作者
运行程序:注意: 可以在程序运行中配置LA。

点击 RUN RUN。点击 Zoom Out 使图形中网格大小是5秒左右。

变量
value
的值将增加到 0x10(十进制16)再重新设为 0。
提示: 如果没有看到波形,请退出并重新进入 Debug 模式以刷新 LA。可能还需要重新上电 NUCLEO 板卡。请确认 Core Clock 的数值正确。
提示: Logic Analyzer 中最多可以显示4个变量,必须是全局变量、静态变量或原始地址如
*((unsigned long*)0x20000000)


请注意当 USER 按钮按下时,变量的值会随之停止增加。当然也请注意观察这个现象是如此直观。

选择 Signal Info、Show Cycles、Amplitude 及 Cursor,观察 LA 的测量功能。点击 Update Screen 栏的 Stop 按钮可以停止 LA。

停止运行处理器 STOP 。
LA波形

使用特权

评论回复
43
大鹏2365|  楼主 | 2022-3-31 21:00 | 只看该作者
15) 观察点:条件断点
不需要使用 Serial Wire Viewer

STM32 处理器有6个硬件断点,可以不停止 CPU 运行而在线设置。STM32 还有四个观察点。观察点可以认为是有条件的断点。观察点和逻辑分析仪共用比较器,因此要使用观察点,需要在逻辑分析仪中保证至少两个变量空位置。观察点也被称作 Access Breakpoint。

使用与前一练习相同的 Blinky 设置,停止程序运行,保持在 Debug 模式。

在 Blinky.c 中创建的全局变量
value
将用于观察点的探究。

配置观察点不需要 SWV Trace,但在这个练习中我们会用到逻辑分析仪。

延续上一个联系,变量
value
应保持在逻辑分析仪中。

在 μVision 菜单中选择 Debug 并点击 Breakpoints,或者按 Ctrl+B 键。

将 Read 和 Write 两个 Access 都选中,在 Expression 框中输入“
value == 0x5
”,不含引号。

点击 Define,应出现图中所示的一行。点击 Close。
Watchpoint Setup

如果 Watch 1 中没有
value
变量,添加一个进去。

打开菜单 Debug/Debug Settings 并选择 Trace 选项卡,选择“on Data R/W sample”,并保持 EXCTRC 不选中。

点击两次 OK 回到主界面。打开 Trace Records 窗口。
Trace Records 按钮

点击 RUN RUN 。

在逻辑分析仪和 Watch 窗口中可以看到
value
在变化。


value
等于 0x5 时,Watchpoint 会停止运行程序。

注意如下图所示的 Trace Records 窗口中的 data write 记录:0x5 在 Data 列的最后一行,另外还有写入数据的地址和写入指令对应的 PC 指针。当前使用的是 ST-Link,如果用 ULINK2 会显示相同的窗口,但如果是 ULINK pro 或 J-Link(黑盒子)显示的窗口会略有区别。
Trace Records

查看 Breakpoints 窗口中的 Help 按钮可以了解另一种可用的表达式格式,有些目前没有在 μVision 中实现。

点击 RUN 可以重复本次练习。

练习结束后,停止程序运行,点击 Debug 并选择 Breakpoints(或按 Ctrl+B),删除所有断点。

退出 Debug 模式。

使用特权

评论回复
44
大鹏2365|  楼主 | 2022-3-31 21:01 | 只看该作者
提示: 观察点不能像硬件断点那样在程序运行中设置。

提示: 在 Breakpoints 窗口中双击观察点,它的信息会放在下面的配置区域供编辑。点击 Define 会创建另一个观察点。如要删除旧的观察点,需要选中它并点击 Kill Selected,或者尝试下一条提示:

提示: 表达式旁边的选框可以用来临时屏蔽观察点。

提示: 逻辑分析仪中也可以输入原始地址,如:
*((unsigned long*)0x20000000)


图中显示了变量
value
的触发点为 0x5 时,逻辑分析仪的显示情况。这里运行了三次。

LA with watchpoint

使用特权

评论回复
45
大鹏2365|  楼主 | 2022-3-31 21:09 | 只看该作者
16) 基于 Keil RTX RTOS 的 RTX_Blinky 例程
Keil 提供了一个全功能的 RTOS —— RTX,做为 Keil MDK including 源代码的一部分。本章的例子将探索 RTX RTOS 工程。MDK 可以和任何 RTOS 配合使用,实际上 RTOS 只是和你的工程一同编译的一组 C 语言函数。RTX 包含在所有版本的 MDK 中,以 BSD 开源协议的形式提供。

译者注:原文附带提供了一个专门的 RTX_Blinky 程序,是四个任务控制 Discovery 开发板上的四个 LED。这个工程使用了 STM32F4xx_DFP 2.1.0 软件包,在新版本的 Keil MDK 中是不提供的(Keil 网站上也没有这个版本的下载链接),难以完成这个实验。
这一章翻译版中,将用新版本的 pack 中包含的 RTX_Blinky 程序替代。其他操作与原文相同。
原文的四任务程序确实更能够体现 Keil MDK 调试模式在观察 RTX 工程上的便利性,有兴趣的话可以参考阅读。

RTX 及其所有组件放在:
C:\Keil_v5\ARM\Pack\ARM\CMSIS\3.20.4\CMSIS_RTX


按照第6章的指示,安装并复制 RTX_Blinky 工程到
C:\MDK\Boards\ST\NUCLEO-F401RE\


在 μVision 的编辑模式(非 debug 模式)中选择 Project/Open Project。

打开文件
C:\MDK\Boards\ST\NUCLEO-F401RE\RTX_Blinky\RTX_Blinky.uvprojx


如果出现 Update Configuration Files 窗口,选择 Cancel。

这个工程已经为 ST-Link V2 调试器设置好了。

点击 Rebuild 图标 Rebuild 编译源文件,应该不会出现 error 或 warning。

点击 Load 图标 Load 手动编程 flash。左下角的进度条会显示这个过程。

点击 Debug 图标 Debug 进入 Debug 模式。点击 RUN 图标 RUN。

NUCLEO 开发板上的绿色 LED 会开始闪烁。

点击 STOP 图标 STOP 。

我们将借助 Kernel Awareness 窗口来探索 RTX 的运行。

使用特权

评论回复
46
大鹏2365|  楼主 | 2022-3-31 21:10 | 只看该作者
17) 使用 Serial Wire Viewer (SWV)的 RTX Kernel Awareness
用户经常需要了解当前执行的任务的编号和其他任务的状态,这些信息一般被 RTOS 存储在一个结构体或内存空间中。Keil 为 RTX 提供了 Task Aware 窗口,其他 RTOS 公司同样也提供 μVision 中的对应的 awareness 插件。

点击 RUN 图标 RUN 运行 RTX_Blinky。

打开菜单 Debug/OS Support 并选择 System and Thread Viewer,图中所示的窗口将打开。可以拖住这个窗口并移动至屏幕中间。窗口中的数值是实时更新的,使用的读写技术与 Watch 和 Memory 窗口相同。
重要提示: 需要选中菜单中的 View/Periodic Window Update。

打开菜单 Debug/OS Support 并选择 Event Viewer。由于还没有配置 SWV,估计不会有数据显示。

System and Thread Viewer

**RTX Viewer:配置 Serial Wire Viewer (SWV):

需要激活 Serial Wire Viewer 来使 Event Viewer 运行。

停止运行处理器 STOP 并退出 Debug 模式 Debug 。

点击 Target 选择框旁边的 Target Options Target Options ,选择 Debug 选项卡。

选择 ST-Link Debugger 旁边的 Settings。

在 Debug 窗口中,确认选择的是 SW 模式而不是 JTAG。SWV 只能运行在 SW 模式。

点击 Trace 选项卡。

设置 Core Clock 为 48 MHz,并选中 Trace Enable。

取消选择 Periodic 和 EXCTRC,如图所示。

译者注:CPU 时钟频率很重要,请务必按照实际值设置。Blinky 工程的时钟频率在
Abstract.txt
中可以找到。如果使用的是其他板卡,请自行检查时钟频率。

需要选中 ITM Stimulus Port 31,RTX Viewer 使用这个方法获得内核 awareness 信息并显示在 Event Viewer 中。这个功能有轻微的侵入性。

点击两个 OK 返回主界面。
Trace Setup
Serial Wire Viewer 配置完成!

进入 Debug 模式并点击 RUN。

选择 Task and System 选项卡,显示应该在更新。

点击 Event Viewer 选项卡。

如图所示,窗口中以图形的形式显示任务事件。可以尝试点击 Zoom 栏的 ALL、+ 和 - 来调整 Grid 到 1 秒左右,或调整到 20us 左右查看每次 LED 状态变化时的任务切换细节。
Event Viewer
Event Viewer

提示: 如果 Event Viewer 不工作,打开 Trace Records 并确认 ITM 31 帧显示正常。Core Clock 是否正确?这个工程运行在 48 MHz(NUCLEO-F401RE)。

Cortex-M3 警告: 利用上面提到的读、写方式,μVision 会实时更新目标板卡的所有 RTX 信息。Event Viewer 使用 ITM,有轻微的侵入性。

数据在程序运行的时候更新,并不需要在源代码中插入专门的观察代码。你会发现这个特点非常好!记住,所有版本的 MDK 中都提供 RTX 的源代码。

提示: 这些 RTX Kernel Awareness 窗口中的功能可以使用 ULINK2、ULINK-ME、ULINK pro、ST-Link V2 及 J-Link。

使用特权

评论回复
47
大鹏2365|  楼主 | 2022-3-31 21:11 | 只看该作者
18) Logic Analyzer 窗口:图形化地实时观察变量
μVision 包含图形化 Logic Analyzer 窗口,在 STM32 中可以利用 Serial Wire Viewer 实时显示多达四个变量。RTX_Blinky 使用一个任务来生成 LED 的闪烁,我们可以画出这个波形的图像。

关闭 RTX Viewer 窗口,停止运行处理器 STOP 并退出 Debug 模式 Debug 。

如图,在
RTX_Blinky.c
中添加一个全局变量
unsigned int led_status


如图,在
RTX_Blinky.c

blinkLED
任务中添加 2 行:
led_status = 1;

led_status = 0;
,大约在第 70 行左右的位置(在
LED_On

LED_Off
函数调用的前面)。
RTX_Blinky.c

选择菜单 File/Save All 或点击 Save All 。

Rebuild 工程 Rebuild ,烧写 flash Load 。

进入 Debug 模式 Debug 。

现在可以运行程序了 RUN 。

打开菜单 View/Analysis Windows 并选择 Logic Analyzer,或者选择工具栏上的 LA 按钮 LA 按钮 。

点击 RTX_Blinky.c 选项卡,右键点击
led_status
变量并选择 Add value to… 及 Logic Analyzer,
led_status
变量将添加到 LA。
提示: 如果不能添加变量到 LA,请确认 Trace Config 设置正确。要添加变量到 LA 必须开启 Serial Wire Viewer。
Logic Analyzer 可以显示静态或全局的变量、结构体和数组。
不能显示局部变量:请转换为静态或全局变量。如果要观察外设寄存器,请使用变量读取或写入,然后把变量添加进 LA。

点击 LA 左上角的 Setup… 按钮,设置 Display Range Max 为 0x3。

点击 Close 回到 LA 窗口。

使用 All、Out 和 In 按钮使图形中网格大小是 0.5 秒左右。如果需要的话,移动滚动条到最右边。

选择 Signal Info 和 Show Cycles,点击以标记一个位置,移动光标得到时序信息。在波形上放置光标以获得时序和其他信息,如图。

点击 Update Screen 栏的 Stop 按钮可以停止数据采集。

RTX Logic Analyzer

提示: 也可以在 Watch 和 Memory 窗口中添加变量,实时显示或修改。

提示: 可以显示表示变量的数**算的信号,这在物理世界中是无法测量的。

使用特权

评论回复
48
大鹏2365|  楼主 | 2022-3-31 21:11 | 只看该作者
21) Serial Wire Viewer(SWV)配置窗口(供参考)
跟踪功能的配置主要是在图中所示的 Trace 选项卡中完成的。μVision 中没有全局的 SWV 选项,对每个工程、以及工程中的每个 target 设置,都需要单独配置 SWV,配置信息存储在工程中。这个窗口有两种方法进入:

A. 在编辑模式中: 选择 Target Options Target Options 或者按 ALT+F7,并选择 Debug 选项卡。点击窗口右侧的 Settings,再选择 Trace 选项卡。启动 μVision 时默认是编辑模式。
B. 在 Debug 模式中: 选择菜单中的 Debug/Debug Settings,再选择 Trace 选项卡。Debug 模式用 Debug 按钮进入。

SWV 配置窗口

1) Core Clock: SWV 的 CPU 时钟频率。在工程的启动代码或者 Abstract.txt 中可以找到 CPU 时钟频率,通常叫 SYSCLK 或主时钟频率。除非使用的是 ULINK pro 调试器,否则这个选项必须填写正确。

2) Trace Enable: 使能 SWV 和 ITM。这个选项只能在编辑模式修改。不会影响 Watch 和 Memory 窗口的更新。

3) Trace Port: 使用 ST-Link 时,这个选项是不可更改的。

4) Timestamps: 使能时间戳,选择预分频器。预分频器默认是1。

5) PC Sampling: 对 PC 指针的采样:
a. Prescaler: 1024*16(默认值)指的是每 16,384 个 PC 指针会显示 1 个,其他的不会采集。
b. Periodic: 使能 PC 指针采样。
c. On Data R/W Sample: 显示造成逻辑分析仪中所列的变量的读写对应的指令地址。这个功能与数据跟踪有关,但与 PC 采样无关。

6) ITM Stimulus Ports: 使能用于在 μVision 中输出数据的类似 printf 的语句的 32 位寄存器。端口 31(a)用于 Keil RTX Viewer,实时内核识别(awareness)窗口;端口 0(b)用于 Debug (printf) Viewer;其他位在 μVision 中没有使用。
Enable: 显示 32 位十六进制数,代表哪些端口是使能的。
Privilege: Privilege 用于 RTOS 指定哪些 ITM 端口可以在用户程序中使用。

7) Trace Events: 使能各种 CPU 计数器。除了 EXCTRC 之外,其他的都是 8 位计数器。每个计数器是累积的,每 256 周期产生计数器溢出事件。Counter 窗口显示计数器的值,Instruction Trace 窗口显示计数器溢出并重新计数产生的事件。
a. CPI: 从第一个指令到每个指令所用的额外周期数,其中包括指令取指拖延(instruction fetch stall)。
b. EXC: CPU 的异常(exception)开销的累积周期数,包括入栈和返回操作,不包括花费在异常处理程序的时间。
c. Sleep: CPU 在睡眠模式的累积周期数,使用 FCLK 时钟。
d. LSU: 从第一个周期开始,花费在 load/store 上的累积周期数。
e. Fold: Folded 指令的累积数量。这个结果来自那些已经从流水线上移除(flush)了无用指令,从而导致零执行周期的预测分支指令。(译者注:我架构学的烂,这句不太会翻:These results from a predicted branch instruction where usused instructions are removed (flushed) from the pipeline giving a zero cycle execution time.)
f. EXCTRC: 异常跟踪。这一项与上面其他项有所不同,不是一个计数器。这个选项使能 Trace Exceptions 窗口中异常的显示。这个功能通常在调试中使用,用来显示异常。

提示: 计数器在单步执行是也会累加,这提供了很有用的信息。计数器是映射在存储器上的,可以在程序中读取。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则