前言
本教程展示了如何使用VisualGDB使用KeilMDK-ARM编译器构建项目,使用VisualGDB智能感知包括CodeMap,并使用VisualStudio调试它。
步骤
在开始之前,确保您可以使用uVisionIDE构建Keil项目
打开VisualStudio,开始创建一个新的嵌入式VisualGDB项目:
选择“导入项目”和“生成Makefile”选项:
在下一页选择ARM工具链,然后选择“手动指定标志”,现在标志为空:
指定包含Keil项目的目录。如果您没有太多的文件,您可以选择“显示所有源文件在一起”,以平展Keil目录结构:
选择一个调试方法。在本例中,我们将使用STM32FRE核子板中集成了ST-Link的OpenOCD:
不要忘记手动选择设备类型。当您手动指定标志时,VisualGDB将无法检测它。
默认情况下,VisualGDB不会导入程序集启动文件(.s),因此将其复制到新的项目目录中,并通过上下文菜单将其添加到项目中:
现在我们需要从uVision项目导入编译器和链接器标志。打开uVision中的目标属性,复制编译器控制字符串:
指定的选项需要分为3类:
包括目录和预处理器宏。这些选项对于智能感知很重要。Keil-specific选项。这些选项不兼容gcc,并且会产生智能感知错误。“-c”和“-o”等指定文件名的选项。它们是由Makefile自动添加的。下表对示例uVision项目的选项进行了分类:
首先,我们将向项目属性添加与智能感知相关的选项。在第一页打开VisualGDB项目属性,并指定从uVision标志中提取的目录的定义和包含目录:
注意,您可以指定与项目目录相关的路径(例如,RTE表示\RTE)。
转到MakefileSettings页面,除去uVisionflags中除了-g和-O0之外的所有gc特定的标志(也禁用二进制文件生成):
稍后我们将指定特定于keil的标志。如果您在这里输入它们,它将会混淆基于clang的智能感知引擎。
按下OK。VisualGDB将重新检查标志并更新智能感知。打开源文件,确保没有智能感知错误,语法着色工作正常:
现在,我们将更改Makefile,以使用Keil编译器而不是GCC,并提供特定于Keil的标志。打开mcu.mak文件:
mcu.mak文件指定了编译器工具(CC,CXX,LD和AR)和智能感知引擎使用的公共标志。因为我们不想破坏智能感知,所以我们将在不同的地方指定它们,而不是修改这个文件。在此之前,打开Keil目标选项并注意链接器标志:
现在我们将指定特定于keil的标志。创建一个名为keil的文件。mak在项目目录中,放置剩余的C/c++标志和链接器标志,以及CC、CXX和其他工具的覆盖:
以下是keil.mak的样本内容:
KEIL_ROOT:=C:/Keil_v5/ARM/ARMCC
CC:=$(KEIL_ROOT)/bin/armcc.exe
CXX:=$(CC)
LD:=$(KEIL_ROOT)/bin/armlink.exe
AR:=$(KEIL_ROOT)/bin/armar.exe
FROMELF:=$(KEIL_ROOT)/bin/fromelf.exe
COMMONFLAGS+=--cpuCortex-M4.fp--apcs=interwork
LDFLAGS+=--cpuCortex-M4.fp\
--ro-base0x\
--entry0x\
--rw-base0x\
--entryReset_Handler\
--first__Vectors\
--strict\
--summary_stderr\
--infosummarysizes\
--map\
--xref\
--callgraph\
--symbols\
--infosizes\
--infototals\
--infounused\
--infoveneers\
--list$(BINARYDIR)/stm32demo.map
最后,我们需要调整Makefile。首先,指定“ADDITIONAL_MAKE_FILES+=keil”。麦鸿崧说:“两者之间包括以下指示:
include$(CONFIGURATION_FLAGS_FILE)ADDITIONAL_MAKE_FILES+=keil.makinclude$(ADDITIONAL_MAKE_FILES)然后用“–depend”替换所有“-MD-MF”
$(BINARYDIR)/%.o:%.cpp$(all_make_files)
$(BINARYDIR)$(CXX)$(CXXFLAGS)-c$-o$
--depend$(:.o=.dep)如果你现在构建你的项目,你将会得到几个错误关于丢失的HAL符号:要解决这个问题,首先通过uVision找到HAL文件夹:
该文件夹中的源文件实现了各种HAL功能:
在解决方案资源管理器中右键单击,选择Add-现有项并向项目添加HAL源文件。然后构建你的解决方案。双击VisualGDB使用Keil编译器和链接器的构建日志:
现在按F5开始调试程序。一旦你验证了LED是闪烁的,在你的程序循环的某处设置一个断点,并验证你可以计算变量:
右键点击main()函数,打开CodeMap,选择“showcalledfunctions”来验证Clang智能感知:
由Keil链接器生成的ELF文件有一个基本问题。如果用GDB加载它,全局变量的值将是-1,而不是正常的初始值:
这是因为GNU和Keil链接器之间的差异。GNU链接器为数据部分计算两个不同的