使用Ozone调试基于nRF9160 Zephyr应用程序

描述

Ozone是SEGGER免费的嵌入式软件调试器。它是一个强大的工具,可以让你深入了解嵌入式系统中发生的事情。它在调试nRF9160 Zephyr应用程序时特别有用。整理多个线程和多映像构建可能很困难,但这就是你想要的工具。

在我们之前的博文《采取下一步:在Zephyr上使用SEGGER Ozone和SystemView进行调试》中,Chris Gammell撰写了有关如何设置SEGGER Ozone项目,以调试在i.MX RT1060评估套件上运行的Zephyr应用程序。这是在Ozone中调试Zephyr应用程序和分析RTOS运行时行为的一个很好的介绍。

当我尝试设置一个类似的Ozone项目来调试Nordic nRF9160 SIP开发板时,我在此过程中遇到了一些困难。今天,我将分享我所学到的知识。

在本文中,我将介绍如何:

• 配置nRF9160 Zephyr应用程序以进行线程感知调试。

• 使用新建项目向导为nRF9160创建Ozone项目。

• 修改Ozone工程以支持调试nRF9160多映像构建。

硬件配置

在下面的示例中,我将使用Nordic nRF9160 DK板。这款来自Nordic的开发套件在电路板中内置了SEGGER J-Link OB调试器,因此不需要外部J-Link调试器来跟进示例(SEGGER Ozone需要J-Link支持)。

嵌入式

Zephyr中的线程感知的支持

在使用Golioth Zephyr SDK构建的典型Zephyr应用程序中,将有多个线程。例如,一个用于应用程序的主循环,一个用于Golioth系统客户端,其他用于UART shell、日志记录子系统、网络管理等。

SEGGER为Ozone提供了一个Zephyr RTOS插件,可以显示每个线程的状态,但它要求Zephyr固件在构建时支持线程感知调试。Zephyr提供了一个CONFIG_DEBUG_THREAD_INFO Kconfig符号,该符号指示内核维护所有线程的列表,线程名称在Ozone中可见。

虽然你可以简单地将CONFIG_DEBUG_THREAD_INFO=y添加到应用程序的prj.conf文件中,但你可能只想在构建时启用这些额外的调试信息。我们可以创建一个额外的debug.conf Kconfig文件,只有当我们将-DEXTRA_CONF_FILE=debug.conf参数传递给构建系统时,该文件才会被合并。

由于本文是关于使用Ozone进行线程感知调试的,因此我们将使用nRF Connect SDK Zephyr存储库中的zephyr/samples/basic/threads/应用程序作为本文的示例应用程序。

如果这是你第一次构建Zephyr示例应用程序之一,请确保先完成nRF Connect SDK安装,并确保你的开发环境设置正确。

如何启用线程感知

首先创建一个zephyr/samples/basic/threads/debug.conf文件并添加以下命令行:

zephyr/samples/basic/threads/debug.conf

 

CONFIG_DEBUG_THREAD_INFO=y
# CONFIG_DEBUG_THREAD_INFO needs the heap memory pool to
# be defined for this app
CONFIG_HEAP_MEM_POOL_SIZE=256

 

接下来,构建固件,指定需要的debug.conf文件并合并到构建配置中:

 

cd /
west build -p -b nrf9160dk_nrf9160_ns zephyr/samples/basic/threads/ -- -
DEXTRA_CONF_FILE="debug.conf"

 

如果构建成功完成,你将看到我们在Ozone中启动调试会话所需的build/zephyr/zephyr.elf 文件

创建Ozone项目

现在我们已经构建了固件,可以启动Ozone并使用New Project Wizard创建一个Ozone项目:

嵌入式

选择nRF9160_xxAA芯片。

嵌入式

选择使用J-Link仿真器。

嵌入式

选择build/zephyr/zephyr.elf该文件在前面讨论中构建生成。

嵌入式

其他这些选择缺省。

嵌入式

单击“Finish”后,您将看到Ozone项目窗口出现。在“Console”窗口中,运行以下命令以加载Zephyr RTOS插件:

 

Project.SetOSPlugin("ZephyrPlugin.js");

 

嵌入式

现在,应该在Ozone项目中看到一个新的“Zephyr”窗口(如果没有,请单击“View”→“Zephyr”以显示该窗口):

嵌入式

最后,保存项目文件,点击“File”→“Save Project as…”:

嵌入式

启动调试会话

现在我们已经配置了Ozone项目,我们可以启动调试会话了。

点击“Debug”→“Start Debug Session”→“Download & Reset Pro”

嵌入式

奇怪的是,当固件开始运行时,将看到一个弹出窗口,指示目标已停止在HardFault异常状态!

嵌入式

此时,您可能想知道这里发生了什么......

这里有一个提示:答案与多映像构建有关。

缺少的步骤:

烧入合并的文件映像

你可能已经注意到,我们传递给west build(nrf9160dk_nrf9160_ns)的board参数以_ns结尾。此后缀表示固件将使用Trusted Firmware-M(TF-M)构建。这是ARM的IoT安全框架的参考实现,称为平台安全架构(PSA)。

TF-M使用nRF9160的Cortex-M33 MCU的ARM TrustZone安全功能将MCU划分为安全处理环境(SPE)和非安全处理环境(NSPE)。

简而言之,引导过程的工作原理如下:

1. 当MCU启动时,它开始在安全环境(SPE)中执行。

2. 引导过程可以选择从使用NSIB和/或MCUboot的安全引导加载程序链开始。

3. 如果使用,引导加载程序会启动TF-M,这会将MCU内存和外设的一部分配置为非安全。

4. TF-M启动在非安全环境(NSPE)中运行的Zephyr应用程序。

当我们针对_ns构建目标进行构建时,TF-M镜像会自动构建并与Zephyr应用程序链接。如果查看build/zephyr/输出目录,您将看到一个名为merged.hex的文件,这是一个合并文件,其中包含MCUboot引导加载程序(可选)、TF-M安全映像和非安全Zephyr应用程序。

修复Ozone项目文件

我们将直接在Ozone项目文件中进行一些更改,该文件可以通过单击“File”→“Edit Project File”在Ozone中打开:

嵌入式

烧写合并的映像

导航到Ozone项目文件的TargetDownload部分并添加以下内容,以将Ozone配置为刷写合并的图像(更改路径以匹配项目中的合并映像文件):

 

/*********************************************************************
*
* TargetDownload
*
* Function description
* Replaces the default program download routine. Optional.
*
**********************************************************************
*/
void TargetDownload(void)
{
Exec.Download("$(ProjectDir)/build/zephyr/merged.hex");
}

 

修复矢量表和PC地址

导航到Ozone项目文件的_SetupTarget部分,然后进行以下更改:

1. 将vector table地址设置为0

2. 从vector表中读取入口点程序计数器地址

 

/*********************************************************************
*
* _SetupTarget
*
* Function description
* Setup the target.
* Called by AfterTargetReset() and AfterTargetDownload().
*
* Auto-generated function. May be overridden by Ozone.
*
**********************************************************************
*/
void _SetupTarget(void) {
unsigned int SP;
unsigned int PC;
unsigned int VectorTableAddr;
VectorTableAddr = 0;
//
// Set up initial stack pointer
//
SP = Target.ReadU32(VectorTableAddr);
if (SP != 0xFFFFFFFF) {
Target.SetReg("SP", SP);
}
//
// Set up entry point PC
//
PC = Target.ReadU32(VectorTableAddr + 4);
if (PC != 0xFFFFFFFF) {
Target.SetReg("PC", PC);
} else {
Util.Error("Project script error: failed to set up entry point PC", 1);
}
}

 

保存项目文件时,您应该会看到一个模式弹出窗口,询问您是否要重新加载项目。

选择“Yes”:

嵌入式

启动调试会话

嵌入式

映像文件烧入到芯片后,你应该可以看到调试器停在main位置:

嵌入式

点击“Debug”→“Continue”:

嵌入式

这次固件可以正常运行没有出现异常。

总结

希望这可以帮助你开始使用Ozone调试nRF9160。nRF9160在Zephyr项目中获得了完全支持,并在Golioth物联网设备管理平台中具有最高级别的支持。借助Golioth,你可以连接和保护设备、将传感器数据发送到Web、无线更新固件,以及使用IoT云扩展你的覆盖度。

麦克泰技术是SEGGER产品在中国的代理商,具有超过20年嵌入式实时操作系统和工具的市场、服务和培训经验,已经录制许多SEGGER视频课程撰写博客文章,了解更多产品联系麦克泰技术Info@bmrtech.com。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分