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。
-
嵌入式
+关注
关注
5122文章
19423浏览量
312743 -
调试
+关注
关注
7文章
601浏览量
34392 -
开发板
+关注
关注
25文章
5378浏览量
100632 -
应用程序
+关注
关注
38文章
3312浏览量
58507 -
Zephyr
+关注
关注
0文章
33浏览量
6171
原文标题:使用Ozone调试基于nRF9160 Zephyr应用程序
文章出处:【微信号:麦克泰技术,微信公众号:麦克泰技术】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
恩智浦分享Zephyr调试技巧
Nordic nRF9160 SiP LTE-M/NB-IoT模块成功通过一系列主要资格和认证
NRF9160低功耗蜂窝IOT方案
SEGGER Ozone调试器使用攻略!
你们有使用过Nordic的NRF9160来做远距离通讯吗?
如何在Eclipse中配置K64F Zephyr/项目的调试?
Nordic nRF9160 SiP提供了强大的数据处理能力 并能透过云端进行分析
nRF9160 SiP认证世界最大型NB-IoT网络
如何开发你的第一个NCS(Zephyr)应用程序

Nordic Semiconductor宣布推出nRF 云定位服务
MM32F013x——巧用Ozone调试MM32

评论