打开

使用Visual Studio进行嵌入式系统开发

subtitle
漫漫开发路 2021-12-08 17:33

我们很高兴地宣布,在Visual Studio 2022预览版中,我们添加了新的对嵌入式系统的开发支持。通过协同使用vcpkg包管理器,你可以快速地搭建好一个嵌入式开发环境并迅速展开工作。

在这篇文章中,我们将会介绍嵌入式工作负载的安装,如何通过vcpkg获取相关的依赖包,然后我们会展示在Visual Studio中借助外围寄存器和RTOS对象视图来进行代码编辑,构建,部署和调试一个嵌入式项目。我们将会通过一个Azure RTOS ThreadX项目来展示所有这些新特性。

打开网易新闻 查看更多图片

Azure RTOS ThreadX 是一个在MCU上广泛使用的RTOS系统。我们还在Visual Studio的帮助文档中附带了对Azure IoT DevKit, NXP 1060和STMicro STM32L4 L4+等开发模板的使用说明。如果你使用的是其他厂家的开发板,则应该可以通过修改相应的配置来快速适配。

安装过程

首先,你需要下载安装最新版本的Visual Studio 2022,然后选择”Linux and embedded development with C++ workload”。在默认情况下,你所需要的组件都会被选中,如下图所示:

对于嵌入式开发来说,其中一个难点就是配置好需要的工具和组件。通常不同项目有着不同的编译工具链和调试工具。这就是vcpkg包管理器可以派上用场的地方。下面我们会演示下如何通过vcpkg来搭建我们的嵌入式开发环境,后面我们将会把它们整合到Visual Studio中,从而提供一个更加流畅的用户体验。

首先打开PowerShell命令行,然后克隆AZzure RTOS项目代码。它将会作为我们演示的一个例子项目。

然后导航至开发板对应的子目录,我使用的是Azure IoT DevKit,如下图所示:

如果你还没有安装vcpkg,则可以参考下图进行安装:

在项目目录下,有一个vcpkg_configuration.json文件。这个清单文件是由vcpkg创建,主要用来记录编译和调试项目所需要用到的工具。可以参考vcpkg文档来创建你自己的清单文件。执行vcpkg activate命令将会使用这个文件来按需安装这些工具。

通过上面的三条命令,我们就可以完成嵌入式项目的克隆,vcpkg包管理器的安装和依赖工具的安装和激活了。下面开始做正事儿。

使用Visual Studio 进行嵌入式开发

目前vcpkg还没有整合到Visual Studio中,所以当前我们需要在上面已经激活的命令行窗口中启动Visual Studio,这样就可以确保需要使用到的工具对于Visual Studio是可见的。

请注意,如果你的电脑上安装了多个不同版本的Visual Studio,则你可能需要指定需要预览版的全路径,例如:

至此,我们就已经在Visual Studio中打开了例子项目,就和其他CMake项目一样。Visual Studio可以通过预定义好的CMakePresets文件来运行CMake编译过程。
和往常一样,可以使用Visual Studio来编写嵌入式代码。在这个Azure RTOS项目中,我们会展示代码导航,IntelliSense,构建,部署和调试等功能。我们还会演示新的寄存器诊断支持和RTOS对象视图。

代码导航和IntelliSense

通过Ctrl+T可以打开”Go to All and type”按钮,然后选择对应的按钮进行代码导航。请注意,我们可以将光标悬浮在这个函数上,然后它会展开TIM3->CCR1这个寄存器的值,如下图所示:

构建,部署和调试

下面我们演示如何在RGB_LED_SET_R()这个函数上设置断点。
要查看如何控制启动,请选择查看解决方案资源管理器中的所有文件并打开 .vs\launch.vs.json。 你可以看到 miDebuggerPath 设置为使用 arm-none-eabi-gdb,而 debugServerPath 设置为使用 debugServerArgs 中的配置脚本调用 openocd。 用于描述外设寄存器的信息由 MCU 制造商在我们用 svdPath 指向的 SVD 文件中提供。 该项目被配置在入口处中断,具有属性 stopAtConnect。

现在,将你的开发板插入 PC(并安装 ST-LINK 驱动程序),将调试目标设置为 Launch,F5 将使用 vcpkg 获取的 openocd 进行工作,以刷新和调试连接的电路板。 执行在入口函数处停止,所以在这里我们看到了它的汇编代码。 我们还可以通过转到菜单 Debug > Windows > Disassembly 来查看反汇编,如下图所示:

外围寄存器

现在按下开发包板上的 A 按钮。 这触发了我们的断点。 我们现在可以转到菜单 Debug > Windows > Embedded Registers。 这将使用启动配置中指定的 SVD 文件中的信息打开外设寄存器视图。 我们现在可以滚动这个列表来找到我们感兴趣的寄存器,这里是 TIM3->CCR1,当我们跳过 RGB_LED_SET_R 函数时它会更新。

下图是断点触发时的界面:

下图是步进调试:

RTOS 对象视图

我们的例子项目中的应用程序有多个线程,但你不会在现有线程窗口中看到它们。

有关这个的解释请看下面的描述:
“实时操作系统是为应用程序提供服务和管理处理器资源的系统软件。 这些资源包括处理器周期、内存、外设和中端。 实时操作系统的主要目的是在嵌入式软件必须执行的各种任务之间分配处理时间。 这通常涉及将软件分成多个部分,通常称为“任务”或“线程”,并创建一个运行环境,为每个线程提供自己的虚拟微处理器(“多线程”)。 基本上,虚拟微处理器由一组虚拟的微处理器资源组成,例如寄存器组、程序计数器、堆栈存储区和堆栈指针。 线程仅在执行时才使用物理微处理器资源,但每个线程都保留这些资源内容的副本,就好像它们是自己的私有资源(线程的“上下文”)。”

因此,理想情况下,对于嵌入式开发,你将拥有可以向您显示有关这些 RTOS 对象的信息的视图。 要查看新的可用 RTOS 对象视图,请转到菜单 Debug > Windows > RTOS Objects。 在这里你将看到 ThreadX 提供的对象的选项,在这里我们将选择线程。

线程视图一目了然地显示了你在嵌入式开发过程中通常需要的许多信息、线程 ID 和名称、它们运行的次数、堆栈的开始、结束位置、堆栈大小以及最大堆栈使用量。

还有其他 ThreadX 对象的其他视图,如块和字节池、事件、互斥锁、队列和计时器。 我们也有 FreeRTOS 的 RTOS 对象视图,尽管那里的可用对象因其支持的内容而异。

硬件断点限制

最后一个需要调用的调试功能是嵌入式硬件目标通常只有一组有限的可用硬件断点。 设置过多会破坏调试器状态。 因此,我们在 launch.vs.json 中添加了 hardwareBreakpoints。 对于这个设置为它支持的值是 6 的开发板。如果我们设置的更多,我们将看到断点没有设置,我们会收到一个警告,它不会被触发。 这可以防止破坏与电路板的连接,并使我们有机会取消设置其他一些断点并继续不间断地调试。

总结

说了这么多,总的来说,就是:终于可以在VS中搞嵌入式开发了。
遥想当年,在VI里瞅着屏幕鼓捣C代码的热血年代。

最后

Microsoft Visual C++团队的博客是我非常喜欢的博客之一,里面有很多关于Visual C++的知识和最新开发进展。大浪淘沙,如果你对Visual C++这门古老的技术还是那么感兴趣,则可以经常去他们那(或者我这)逛逛。
本文来自:《Embedded Software Development in Visual Studio》

最近我写了个东西

正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

特别声明:本文为网易自媒体平台“网易号”作者上传并发布,仅代表该作者观点。网易仅提供信息发布平台。
23赞
大家都在看打开应用 查看全部
网易热搜每30分钟更新
打开应用 查看全部
打开