本节说明如何配置和运行运行时测试。它包含如下部分:
常规配置
默认情况下,假设用于在 Keil uVision 项目上运行测试的 C/C++test 项目创建在与原始 Keil uVision 项目相同的位置。不需要这种方法;但是,它确实大大简化了设置过程,并且在此假设下创建了为在 Keil uVision 项目上运行测试而提供的所有测试配置。
为了能够正确执行单元测试或应用程序监测,您可能需要通过扩展程序堆栈大小和扩展程序堆大小来修改原始项目。通常,添加大约 0x1000 字节的额外堆栈和堆(每个 0x1000)就足够了。所需的额外堆和堆栈的大小取决于测试配置,并且对于不同的项目配置可能会有所不同。
运行时库和通信通道
uVision 项目的所有测试配置都包含一个特殊步骤,该步骤将自动构建运行时库。因此,无需执行运行时库的外部构建并将其产品添加到链接器命令行。
如果您希望在测试过程中使用运行时库的预构建版本,则需要手动构建该库并将其添加到 C/C++test 构建设置>链接器标志中。有关详细信息,请参见使用 C/C++test 运行时库。
如果您不使用自动构建的运行时库...
要为 uVision 工具构建运行时库(假设正确配置了所需的环境):
- 转到
<CPPTEST_INSTALL_DIR>/bin/engine/runtime
。 - 执行
make
TARGET_CFG=ARM_armcc3_1_uV3.mk
(适用于 uVision3) 或make TARGET_CFG=ARM_armcc4_0_uV4.mk
(适用于 uVision4)。
或者,可以使用位于 <CPPTEST_INSTALL_DIR>/bin/engine/runtime/projects/Keil_uV
目录中的项目文件直接在 Keil uVision 中构建运行时库。
Keil uVision 的运行时库已预先配置为使用:
- 具有 ULINK2 调试连接器的开发环境的串行通信通道。
- 具有 ULINKPro 的开发环境的基于 ITM 的通信通道(建议也与模拟器一起使用)。
基于 ITM 的通信通道的实现基于 CMSIS 头文件,并且不依赖于特定的硬件。它应适用于所有支持带有仪器跟踪宏单元的 ARM Core Sight 调试和跟踪技术的 Cortex M3/M4 微控制器。从 C++test 版本 7.3.2.x 开始,这是推荐的解决方案。在大多数情况下,您无需对通信通道实现进行任何修改。
串行通信通道专门针对 STM32F103 芯片实现(默认使用 USART2)。如果要在其他芯片上运行测试或使用其他通讯通道,则可能需要修改通讯通道的定义或添加一个新的通道。STM32F103ZE 芯片的通信通道的默认实现假定将通过您的项目提供的硬件初始化例程来初始化 UART。这样,实现了通信通道 init 函数
int localRsInitInternalSerial(CppTestStreamParameters *par)
留空。如果要在 C/C++test 运行库中执行 UART 的初始化,则需要提供该例程的初始化代码。UART 参数将通过 CppTestStreamParameters 结构提供,作为函数参数传递(CppTestStreamParameters 在 CppTestTransportRS232Common.h 文件中定义)。使用 TestRunnerGenerationStep 执行流程步骤中定义的值进行初始化(请参见 Keil-specific 的测试配置中的测试流程定义)。
指定于硬件的初始化
一些项目要求在调用被测源的测试用例之前,先调用指定于硬件的初始化代码。通过提供 void CppTest_Initialize(void) 函数的定义,可以确保在测试可执行文件的非常早期就调用硬件初始化函数。有关详细信息,请参见 初始化和完成。
半主机和重定向
从 MDK-ARM 4.6 开始,必须将应用程序重新定向以删除所有半主机依赖项(参见 Known Limitations)。被测应用程序的 C++test 插桩及其运行时库会强制从 ARM 库进行半主机调用,因此必须将完整的半主机重定目标应用于测试应用程序才能成功执行。
为了便于应用程序重新定位,ARM 编译器工具提供了 __use_no_semihosting
(或对于较早版本为 __use_no_semihosting_swi
) 导入编译指示和汇编符号。当导入甚至包含在单个应用程序的编译单元中时,ARM链接程序都会报告所有半主机例程/符号的错误。如果经过测试的应用程序已经包含 __use_no_semihosting
则导入也将应用于测试应用程序。测试应用程序中的自定义重定向目标符号也适用于测试应用程序。测试应用程序可能会产生更多的半主机依赖性,因此需要其他重新定向。
为了促进针对非目标代码或部分目标代码的测试应用程序的重新定向,C++test:
- 在运行时库的 armcc-specific 编译器配置标头中,为 uVision 版本 5.0x 或更高版本(MDK-ARM 版本 4.6x 或更高版本)强制
__use_no_semihosting
导入 ARM 编译器。 - 提供自定义 ARM 库重定向目标向导,用于在测试项目的 "factory”文件夹中创建默认的重定向目标实现文件(默认为
cpptest_retgt.c
)。如文中所述,该文件是用于自由修改的。选择新建> 其他> 运行时-自定义 ARM 编译工具 C 库重定向 访问向导。
有关半主机和重定向的更多信息,请参考 ARM 或 Keil 文档。
配置 uVision 进行运行时测试
在模拟器或真实硬件测试模式下,C/C++test 生成的测试可执行文件通过 uVision 调试器脚本自动启动。对于全自动测试会话运行,需要对 uVision 进行配置,以查找由 C/C++test 生成的调试器脚本,该脚本可以自动执行测试可执行文件的加载和运行操作。
如下修改原始 uVision 项目,以使用 C/C++test 生成的调试器脚本启用测试可执行文件的自动运行:
- 转到有效目标的 选项 并打开 调试 选项卡。
- 在 调试 选项卡中,将调试器目标更改为 使用模拟器 (或实际硬件,具体取决于您的需求),然后在 初始化文件下指定
.\cpptest.ini
。将在测试执行期间生成cpptest.ini
(在调用 uVision 之前)。
在模拟器上测试
模拟器上的测试配置使用 uVision 模拟功能来运行准备好的测试可执行文件。测试结果以下列方式之一发送:
- 通过模拟 UART,使用测试配置“运行 Keil uVision 测试-模拟器(UART)”。
- 通过基于 ITM 的通信通道,使用测试配置“运行 Keil uVision 测试 - ULINKPro 或模拟器(ITM)”(强烈推荐,从 MDK-ARM 4.11 开始可用)。
在这两种情况下,uVision IDE 都提供了一个方便的接口,借助 uVision 调试器脚本选项将串行或 ITM 输出重定向到文件,可以将测试结果保存到文件中。该配置将编译并链接必要的测试可执行文件组件,然后使用 uVision 在“即时”生成的调试器脚本的帮助下运行准备好的测试可执行文件。
调试器脚本模板位于 C/C++test 发行版中的 <CPPTEST_INSTALL_DIR>/bin/engine/etc/templates/for_recipes/uvision_sim.tja
,用于带有 UART 通信通道的模拟器和用于基于 ITM 的通信 <CPPTEST_INSTALL_DIR>/bin/engine/etc/templates/for_recipes/uvision_ulinkPro_itm.tja
。
调试器脚本模板可以包括用户特定的调试器脚本,也可以进行自定义以满足特定环境的需要。请参见Customizing Built-in Test Configurations。
使用 ULINKPro/ULINK2 接口在真实硬件上进行测试
在实际目标设备上进行测试的配置使用带有 ULINKPro 或 uLINK2 调试和跟踪适配器的 uVision 来运行准备好的测试可执行文件。测试结果从目标平台通过以下方式之一发送:
- 通过 UART,使用测试配置 "Run Keil uVision 测试 - ULINK2 (UART)"。
- 通过基于 ITM 的通信通道“运行 Keil uVision 测试 - ULINKPro 或模拟器(ITM)”(强烈推荐,从 MDK-ARM 4.11 开始可用)。
该配置将编译并链接必要的测试可执行文件组件,然后使用 uVision 在“即时”生成的调试器脚本的帮助下运行准备好的测试可执行文件。
对于使用 UART 进行结果传输的测试配置,C++test 将使用一个小型实用程序:一个串行端口监听器,它将捕获从测试发送的所有数据并将其保存到文件中。使用基于 ITM 的通信进行结果传输的配置依赖于 uVision 接口,借助 uVision 调试器脚本将测试结果保存到文件中。
调试器脚本模板位于 C/C++test 发行版中的 <CPPTEST_INSTALL_DIR>/bin/engine/etc/templates/for_recipes/uvision_ulink.tja
用于 UART 通信通道和用于基于 ITM 的通信<CPPTEST_INSTALL_DIR>/bin/engine/etc/templates/for_recipes/uvision_ulinkPro_itm.tja
。
调试器脚本模板可以包括用户特定的调试器脚本,也可以进行自定义以满足特定环境的需要。请参见自定义内置测试配置。
自定义内置测试配置
为执行 uVision 项目的运行时测试而提供的测试配置可能需要特指定环境的自定义。请注意,"Builtin> 嵌入式系统> Keil uVision” 测试配置中所有可用的配置都假定 C++test 项目是在原始 uVision 项目位置创建的。但是,不需要此位置。典型的自定义是在为每个测试配置列出的测试流定义属性的帮助下完成的(在 执行> 常规> 执行详细信息)。
下表描述了 MDK-ARM 专用内置测试配置的测试流程属性:
- 使用内存监测运行 Keil uVision 应用程序 - ULINK2(UART)
- 使用内存监测运行 Keil uVision 应用程序 - ULINKPro 或模拟器(ITM)
- 运行 Keil uVision 测试 - ULINK2 (UART)
- 运行 Keil uVision 测试 - ULINKPro 或模拟器 (ITM)
- 运行 Keil uVision 测试 - 模拟器 (UART)
名称 | 默认值 | 说明 |
---|---|---|
uVision 项目可执行文件位置 | ${uvision:project_executable} | 自动扩展到 uVision 项目构建产品的位置——通常是可执行文件。此变量用于用 C/C++test 生成的测试可执行文件替换原始可执行文件。通常不需要修改它。 |
uVision 项目项目文件 | ${uvision:project_file} | 自动扩展到 uVision 项目文件的位置。此变量用于使用生成的调试器脚本启动 uVision 以自动执行测试。通常不需要修改它。 |
uVision IDE 可执行文件 | Uv4.exe | uVision IDE 可执行文件的位置。这是开始自动化测试所必需的。如果 C/C++test 没有自动检测到,则需要手动指定。 |
uVision 项目目录 | ${uvision:project_directory} | 自动扩展到 uVision 项目目录的位置。用作存储 C/C++test 生成的调试器脚本的默认位置。通常不需要修改它。 |
Uvision 调试器初始化脚本 | 空 | 调试器脚本文件的完整路径,该文件将包含在 C/C++test 生成的调试器脚本(可选)的开头。 它可用于处理特定于平台的调试接口初始化。如果不需要指定的初始化,则应将此属性留空 |
uVision 项目的目标 | ${uvision:project_target} | 自动扩展到 uVision 项目的当前目标。如果在 uVision 项目中出于测试目的创建了特殊目标,则应手动将其指定为此属性的值。 |
可执行出口 | _sys_exit | 视为测试执行终点的函数名称或地址。C/C++test 的默认配置假设从测试可执行文件调用的最后一个函数是 _sys_exit。当正在运行的测试程序将到达 _sys_exit 函数(或此处指定的任何其他函数)时,由 C++test 生成的调试器脚本将最终完成测试执行。 |
串行通讯:主机端口 | USART1 | UART 端口标签。可在 C/C++test 运行时库内部使用以实现条件初始化。 |
串行通讯:主机端口 | 1 | 连接到目标设备的主机 COM 端口号。 |
串行通讯:波特率 | 9600 | 串行传输波特率。 |
串行通讯:字节大小 | 8 | 串行传输字节大小。 |
串行通讯:奇偶校验 | E | 串行传输奇偶校验:无(N)、奇数(O)、偶数(E)、标记(M)或空格(S)。 |
串行通讯:停止位 | 停止位的串行传输数。 |
串口监听器
当在真正的硬件设备上执行测试并使用 UART 发出的结果时,借助实用程序串行端口监听器安排主机端的结果接收。有关串行端口监听器的详细信息,请参见RS232 监听器。
单元测试
提供以下测试配置以促进单元测试过程:
- 嵌入式系统>Keil uVision > 运行 Keil uVision 测试 - ULINK2 (UART)
- 嵌入式系统>Keil uVision > 运行 Keil uVision 测试 - ULINKPro 或模拟器 (ITM)
- 嵌入式系统>Keil uVision > 运行 Keil uVision 测试 – 模拟器 (UART)
要在目标或模拟器上运行单元测试:
- 手动创建或自动生成一组测试用例。
- 复制 Keil uVision 测试配置之一。
- 根据需要修改测试配置。有关详细信息,请参见 一般配置。
- 选择所需的测试环境。
- 使用上面创建的自定义测试配置运行测试。
调试器测试用例
使用外部嵌入式调试模式。更多详细信息请参见:
应用程序监测
提供以下测试配置以促进应用程序监测过程:
- 嵌入式系统> Keil uVision>运行带有内存监测功能的 Keil uVision 应用程序 - ULINK2(UART)
- 入式系统> Keil uVision>使用内存监测 - ULINKPro 或模拟器(ITM)运行 Keil uVision 应用程序
要在目标上运行应用程序监视:
- 复制 Keil uVision 应用程序监测测试配置之一。
- 根据需要修改测试配置。有关详细信息,请参见General Configuration。
- 选择所需的测试环境。
- 使用上面创建的自定义测试配置运行测试。
已知局限性
所有受支持的 MDK-ARM 版本
我们建议在测试应用程序执行之前关闭所有正在运行的 uVision 实例,这将在调试模式下启动 uVision。保持实例运行(例如开发)可能会阻止调试器正确执行。
MDK-ARM 4.6x 及更高版本
由于调试器和编译器库(尤其是 Sys I/O lib 模块- sys_io.o
)中的更改,因此在构建测试可执行文件时必须禁用半主机。必须将标准符号(例如 _ttywrch
和_sys_exit
) 以及所有 I/O _sys_
... 和 __std
..._name
符号重新定位。