首页 » 互联网 » 运用VisualGDB开拓Keil MDK-ARM项目_文件_项目

运用VisualGDB开拓Keil MDK-ARM项目_文件_项目

神尊大人 2024-11-24 12:35:37 0

扫一扫用手机浏览

文章目录 [+]

打开Visual Studio,开始创建一个新的嵌入式VisualGDB项目:

选择“导入项目”和“天生Makefile”选项:

运用VisualGDB开拓Keil MDK-ARM项目_文件_项目 运用VisualGDB开拓Keil MDK-ARM项目_文件_项目 互联网

不才一页选择ARM工具链,然后选择“手动指定标志”,现在标志为空:

运用VisualGDB开拓Keil MDK-ARM项目_文件_项目 运用VisualGDB开拓Keil MDK-ARM项目_文件_项目 互联网
(图片来自网络侵删)

指定包含Keil项目的目录。
如果您没有太多的文件,您可以选择“显示所有源文件在一起”,以平展Keil目录构造:

选择一个调试方法。
在本例中,我们将利用STM32F411RE核子板中集成了ST-Link的OpenOCD:

不要忘却手动选择设备类型。
当您手动指定标志时,VisualGDB将无法检测它。

默认情形下,VisualGDB不会导入程序集启动文件(.s),因此将其复制到新的项目目录中,并通过高下文菜单将其添加到项目中:

现在我们须要从uVision项目导入编译器和链接器标志。
打开uVision中的目标属性,复制编译器掌握字符串:

指定的选项须要分为3类:

包括目录和预处理器宏。
这些选项对付智能感知很主要。
Keil-specific选项。
这些选项不兼容gcc,并且会产生智能感知缺点。
“-c”和“-o”等指定文件名的选项。
它们是由Makefile自动添加的。

下表对示例uVision项目的选项进行了分类:

首先,我们将向项目属性添加与智能感知干系的选项。
在第一页打开VisualGDB项目属性,并指定从uVision标志中提取的目录的定义和包含目录:

把稳,您可以指定与项目目录干系的路径(例如,RTE表示\RTE)。

转到Makefile Settings页面,撤除uVision flags中除了-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 += --cpu Cortex-M4.fp --apcs=interwork

LDFLAGS += --cpu Cortex-M4.fp \

--ro-base 0x08000000 \

--entry 0x08000000 \

--rw-base 0x20000000 \

--entry Reset_Handler \

--first __Vectors \

--strict \

--summary_stderr \

--info summarysizes \

--map \

--xref \

--callgraph \

--symbols \

--info sizes \

--info totals \

--info unused \

--info veneers \

--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,选择“show called functions”来验证Clang智能感知:

由Keil链接器天生的ELF文件有一个基本问题。
如果用GDB加载它,全局变量的值将是-1,而不是正常的初始值:

这是由于GNU和Keil链接器之间的差异。
GNU链接器为数据部分打算两个不同的地址:加载它的地址(VMA)和存储其内容的闪存地址(LMA)。
然后,GDB将节内容放在LMA地址,启动代码将其复制到VMA。
Keil链接器设置了LMA = VMA,因此GDB没有将数据部分写入FLASH中,而是直接将其放入RAM中,在RAM中会被Keil statup代码覆盖,该代码希望它在FLASH中。
为理解决这个问题,我们首先须要找到节名。
arm-eabi-objdump运行。
exe -x (objdump工具是GCC工具链的一部分):

我们将通过两个步骤来办理这个问题:首先,我们将运行名为fromelf的Keil工具。
exe将ELF文件转换为.bin文件,以反响Keil工具所期望的FLASH内存内容:

然后,我们将利用objcopy工具编辑.elf文件,用.bin文件的内容更换复制到闪存中的数据。
这将确保GDB将初始化数据以Keil期望的办法放入FLASH中:

经由修正的Makefile片段如下所示(片段名称和地址取决于设备,该当从原始elf文件转储中取出):

下图阐明了.axf (KEIL ELF)、.bin和终极.elf文件之间的依赖关系:

现在构建项目并验证变量是否精确初始化:

如果它们仍旧被毁坏,通过检讨arm-eabi-objdump工具天生的转储文件,再次检讨ROM部分是否被放置在精确的地址,其大小是否与bin文件的大小匹配:

由于我们已经手动创建了这个项目,VisualGDB不会显示设备的外围寄存器。
要办理这个问题,请为您的设备创建一个普通的VisualGDB项目,并搜索。
MCUDefinitionFile元素项目目录中的xml文件,例如:

在%LOCALAPPDATA%\VisualGDB\EmbeddedBSPs中查找文件(它将具有.gz扩展名),并将其复制到包含mcu的目录中。
导入Keil项目的xml文件。
然后修正mcu。
xml文件引用设备定义文件:

重新开始调试您的项目,并验证硬件寄存器现在显示:

末了,我们将修复Keil缺点的解析。
由于它们利用的语法与GCC不同,VisualGDB默认不会识别它们。
您可以通过添加一个大略的函数来重现这个问题,该函数将产生警告和缺点,并考试测验构建您的文件:

为了支持“, line ”格式,下载BuildMessageRegexes。
xml文件,将其保存到您的项目目录(或附近的任何其他目录),并在.vgdbsettings文件中指定它的相对路径,如下所示:

如果您现在构建项目,Visual Studio将精确显示缺点和警告:

如果您正在利用VisualGDB和Keil编译器,请在论坛中见告我们。
一旦我们网络了足够的反馈,我们将不才一个VisualGDB版本中简化与Keil工具的集成。

标签:

相关文章