MSPM0系列MCU工程文件跨平台移植问题及解决方案详解
前言
在KEIL的集成开发环境下,MSPM0系列MCU凭借其SDK和Sysconfig工具的强大支持,极大地简化了开发流程。然而,这种便利也伴随着挑战:当不同开发者间的SDK与Sysconfig安装路径及设置存在差异时,工程文件的移植便成为了一大困难。本文将探讨并解决两大常见问题:Sysconfig配置文件无法识别及头文件路径错误,确保工程文件能够迁移至不同设备。
问题描述
- Sysconfig配置文件无法识别:当尝试使用他人的工程文件时,Sysconfig可能因找不到配置文件而无法正常工作。
- 头文件路径错误:由于路径设置不一致,导致编译器无法找到必要的头文件,从而引发编译错误。
首先,启动一个任意SDK中的示例程序,并进行编译。如图所示,编译过程中,输出窗口清晰地表明初始编译环境配置正确且程序无误。
为了模拟使用从第三方获取的工程文件,我们将此例程复制一份,并转移至一个新的目录,这里我选择为D盘根目录下。
随后,再次执行编译。此时,编译输出窗口显示出两个错误。如图
1.Before Build – User command #1执行错误:
cmd.exe /C "D:\spi_peripheral_register_format\keil\../../../../../../tools/keil/syscfg.bat
'D:\spi_peripheral_register_format\keil\' spi_peripheral_register_format.syscfg"
该命令在执行时报告“系统找不到指定的路径”,这表明在尝试执行编译前的sysconfig相关配置脚本时,系统未能定位到指定的批处理文件(syscfg.bat)。
2.头文件缺失错误:
..\ti_msp_dl_config.h(53): error: 'ti/devices/msp/msp.h' file not found
此错误重复出现,均指出无法找到头文件ti/devices/msp/msp.h
。这表明项目的包含路径(Include Path)未正确设置。
解决步骤
解决Sysconfig配置文件问题
在“Options for Target”(常称为“魔术棒”)的“USER”标签页中,我们观察到“Before Build”部分包含了Sysconfig配置的命令,具体为
cmd.exe /C "$P../../../../../../tools/keil/syscfg.bat '$P' spi_peripheral_register_format.syscfg"。
如图
此命令旨在调用“syscfg.bat”批处理文件,并将“spi_peripheral_register_format.syscfg”作为参数传递以执行Sysconfig配置。这里涉及的路径表示法,如$P
和../
,分别指代当前工程文件路径和向上级目录的遍历。特别地,$P../../../../../../
构成了一个指向当前工程文件路径上六层目录的复杂路径。然而,当工程文件被移动到D盘后,这些相对路径自然失效,导致无法找到指定的批处理文件,这也是使用他人工程文件时可能遭遇的常见问题。
针对系统报告找不到指定批处理文件的错误,解决方案在于重新定位“syscfg.bat”文件的确切位置。在本例中,我采用绝对路径的方式直接指定了“syscfg.bat”在SDK中的位置,即
C:\ti\mspm0_sdk_2_01_00_03\tools\keil\syscfg.bat
通过将此路径替换到“Before Build”选项中的原路径位置(注意保持cmd.exe /C
不变,仅修改后续路径部分),确保批处理文件的正确引用。如图。
随后进行编译,编译输出窗口展示了修改后的命令执行情况:
Before Build - User command #1: cmd.exe /C "C:\ti\mspm0_sdk_2_01_00_03\tools\keil\syscfg.bat 'D:\spi_peripheral_register_format\keil\' spi_peripheral_register_format.syscfg"
Using Sysconfig Tool from "D:\Applications\sysconfig\sysconfig_cli.bat"
此输出表明Sysconfig配置已成功执行,通过“sysconfig_cli.bat”工具完成了配置过程。如图
解决头文件路径问题
接下来,我们将着手解决头文件路径所引发的问题。该问题实质上与先前提及的Sysconfig问题一致,均归结为文件路径配置不当所致。
为纠正此问题,我们需调整KEIL中的文件包含路径设置。具体而言,需打开“Options for Target”界面,并定位至“Include paths”选项。在此处,我们观察到原有的头文件路径设置已不适用,因其沿用了之前的配置,故而导致编译错误。为消除此错误,我们需手动调整这些路径至正确的位置,确保编译器能够准确找到所需的头文件,如图所示。
然而,在修正了包含路径后,编译后会遭遇另一类错误,具体为:
“.\Objects\spi_peripheral_register_format_LP_MSPM0G3507_nortos_keil.axf: error: L6002U: Could not open file
../../../../../../source/ti/driverlib/lib/keil/m0p/mspm0g1x0x_g3x0x/driverlib.a: No such file or directory”
此错误指出,链接器(Linker)在尝试访问特定库文件时,因路径错误而无法找到该文件。
为解决此问题,我们需进一步深入至“Options for Target”中的“Linker”标签页,并特别关注“Misc controls”选项。在此处,我们发现链接器所使用的路径依然是旧的、不再有效的配置。因此,我们需将此处的路径也更新为正确的库文件路径,确保链接器能够顺利访问并链接必要的库文件,如图所示。
完成上述所有路径的更新后,我们再次执行编译操作。此时,应能观察到编译过程顺利进行,不再有任何错误提示。
确保Sysconfig配置环境一致
完成上述操作后,移植工作尚未完成,这从编译输出窗口中的两条关键信息中可见一斑:
“'Couldn't find .metadata\product.json'”
及“Invalid argument '-s': File 'D:.metadata\product.json' does not exist”
首先,审视“ti_msp_dl_config.h”文件,我们注意到宏定义
#define GPIO_LEDS_PORT (GPIOA)
这明确指出了GPIOA通过宏定义GPIO_LEDS_PORT
进行引用。如图
随后,在Sysconfig图形配置工具中,尝试将GPIO_LEDS
修改为GPIO_L
,理论上,这应使得GPIOA的宏定义名相应变更为GPIO_L_PORT
。然而,如图所示,此变更并未发生,GPIOA仍保留其原始宏定义名GPIO_LEDS_PORT
,这意味着Sysconfig工具无法正常使用。
进一步分析编译输出窗口中的信息,“'Couldn't find .metadata\product.json'”,揭示问题根源在于编译器无法找到位于指定路径\.metadata\product.json
的文件。为解决此问题,需确认该文件实际存放位置。通常情况下,此文件位于SDK目录中。
因此,将整个工程文件夹移动至SDK文件夹内,并重新编译项目。
在编译过程中,遇到提示,选择重载设置以应用新的环境配置。
此操作后,编译器反馈了新的错误:“../spi_peripheral_register_format.c(245): error: use of undeclared identifier 'GPIO_LEDS_PORT'”,这表明代码中仍引用了已废弃的宏定义。回查“ti_msp_dl_config.h”文件,确认GPIOA的宏定义名已成功变更为GPIO_L_PORT
,与Sysconfig中的配置一致,说明Sysconfig工具现可正常工作。
接下来,需将引发错误的代码段中的GPIO_LEDS
替换为已在Sysconfig中设置的名称GPIO_L
,并再次编译项目。此时编译过程无报错或警告信息,表明工程文件已成功移植,且Sysconfig工具配置功能正常。如图
总结
综上所述,当在不同计算机上使用他人的工程文件时,鉴于SDK和Sysconfig安装路径的差异性,需执行以下步骤以确保顺利移植:调整“Options for Target”中的Sysconfig命令路径,以及相应.h文件和.a文件的路径;将工程文件置于此计算机SDK目录内,并据此配置环境。
以上是关于在Keil编译器环境下,针对MSPM0系列程序在不同PC间移植时所遇问题的详细分析与解决方案,希望能对各位读者有所裨益,并欢迎批评指正。
作者:kendel1