本节说明如何配置和执行运行时测试。章节目录:
常规配置
默认情况下,假定用于在 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 头文件,并且不依赖于特定的硬件。它理应适用于所有通过 Instrumentation Trace Macrocell 支持 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 开始,应用程序必须进行重定向以去除所有半主机依赖(请参阅已知局限性)。被测应用程序的 C++test 插桩及其运行时库会强制使用来自 ARM 库的半主机调用,因此必须对测试应用程序进行全面的半主机重定向,以确保成功执行。
为了便于应用程序重定向,ARM 编译器工具提供了 __use_no_semihosting
(或对于早期版本使用 __use_no_semihosting_swi
) 导入编译指示和汇编符号。当在应用程序的任何一个编译单元中包含该导入时,ARM 链接器将针对所有半主机例程/符号报告错误。如果被测应用程序已经包含 __use_no_semihosting
,则导入也将应用于测试应用程序。被测应用程序中的自定义重定向符号也适用于测试应用程序。测试应用程序可能会产生更多的半主机依赖,因此需要额外的重定向。
为了便于针对未重定向或部分重定向代码的测试应用重定向,C++test:
- 在运行库的 armcc 专用编译器配置头文件中,强制对 uVision 5.0x 或更高版本(MDK-ARM 4.6x 或更高版本)的 ARM 编译器导入
__use_no_semihosting
。 - 提供自定义 ARM 库重定向向导,用于在测试项目的“factory”文件夹中创建默认的重定向实现文件(默认为
cpptest_retgt.c
)。该文件可根据文件内的说明自由修改。选择新建> 其他> 运行时 - 自定义重新定位 ARM 编译工具 C 语言库访问向导。
有关半主机和重定向的更多信息,请参阅 ARM 或 Keil 文档。
配置 uVision 进行运行时测试
在模拟器或真实硬件测试模式下,C/C++test 生成的测试可执行文件通过 uVision 调试器脚本自动启动。对于全自动测试会话运行,需要对 uVision 进行配置,以查找由 C/C++test 生成的调试器脚本,该脚本可以自动执行测试可执行文件的加载和运行操作。
按如下方式修改原始 uVision 项目,以通过 C/C++test 生成的调试器脚本自动运行测试可执行文件:
- 前往活动目标的 Options 并打开 Debug 选项卡。
- 在 Debug 选项卡中,将调试器目标更改为 Use Simulator(或实际硬件,具体取决于您的需求),然后在 Initialization file 下指定
.\cpptest.ini
。cpptest.ini
将在测试执行期间生成(在调用 uVision 之前)。
在模拟器上测试
模拟器上的测试配置使用 uVision 模拟功能来运行准备好的测试可执行文件。测试结果以下列方式之一发送:
- 通过模拟 UART,使用测试配置“Run Keil uVision Tests - simulator (UART)”。
- 通过基于 ITM 的通信通道,使用测试配置“Run Keil uVision Tests - ULINKPro or Simulator (ITM)”(强烈推荐,从 MDK-ARM 4.11 开始可用)。
在这两种情况下,uVision IDE 都提供了一个方便的接口,借助 uVision 调试器脚本选项将串行或 ITM 输出重定向到文件,可以将测试结果保存到文件中。该配置将编译并链接必要的测试可执行文件组件,然后使用 uVision 在“即时”生成的调试器脚本的帮助下运行准备好的测试可执行文件。
在 C/C++test 发行版中包含调试器脚本模板,对于带 UART 通信通道的模拟器位于 <CPPTEST_INSTALL_DIR>/bin/engine/etc/templates/for_recipes/uvision_sim.tja
,对于基于 ITM 的通信则位于 <CPPTEST_INSTALL_DIR>/bin/engine/etc/templates/for_recipes/uvision_ulinkPro_itm.tja
。
调试器脚本模板可以包括用户特定的调试器脚本,也可以进行自定义以满足特定环境的需要。请参阅自定义内建测试配置。
使用 ULINKPro/ULINK2 接口在真实硬件上进行测试
在真是目标设备上进行测试的配置使用带有 ULINKPro 或 uLINK2 调试和跟踪适配器的 uVision 来运行准备好的测试可执行文件。测试结果从目标平台通过以下方式之一发送:
- 通过 UART,使用测试配置 "Run Keil uVision Tests - ULINK2 (UART)"。
- 通过基于 ITM 的通信通道,使用“Run Keil uVision Tests - ULINKPro or Simulator (ITM)”(强烈推荐,从 MDK-ARM 4.11 开始可用)。
该配置将编译并链接必要的测试可执行文件组件,然后使用 uVision 在“即时”生成的调试器脚本的帮助下运行准备好的测试可执行文件。
对于使用 UART 进行结果传输的测试配置,C++test 将使用一个小型实用程序:一个串行端口监听器,它将捕获从测试发送的所有数据并将其保存到文件中。使用基于 ITM 的通信进行结果传输的配置依赖于 uVision 接口,借助 uVision 调试器脚本将测试结果保存到文件中。
在 C/C++test 发行版中包含调试器脚本模板,对于UART 通信通道位于 <CPPTEST_INSTALL_DIR>/bin/engine/etc/templates/for_recipes/uvision_ulink.tja
,用于基于 ITM 的通信则位于 <CPPTEST_INSTALL_DIR>/bin/engine/etc/templates/for_recipes/uvision_ulinkPro_itm.tja
。
调试器脚本模板可以包括用户特定的调试器脚本,也可以进行自定义以满足特定环境的需要。请参阅自定义内建测试配置。
自定义内建测试配置
为执行 uVision 项目的运行时测试而提供的测试配置可能需要针对特定环境自定义。请注意,“内建> Embedded Systems> Keil uVision”测试配置中所有可用的配置都假定 C++test 项目在原始 uVision 项目位置创建,但实际上并非必须使用该位置。通常,自定义设置是通过每个测试配置列出的测试流程定义属性完成的(在执行> 常规> 执行细节部分)。
下表描述了 MDK-ARM 专用内建测试配置的测试流程属性:
- Run Keil uVision Application with Memory Monitoring - ULINK2(UART)
- Run Keil uVision Application with Memory Monitoring - ULINKPro or Simulator (ITM)
- Run Keil uVision Tests - ULINK2 (UART)
- Run Keil uVision Tests - ULINKPro or Simulator (ITM)
- Run Keil uVision Tests - simulator (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。C++test 生成的调试器脚本将在测试程序运行至 _sys_exit 函数(或此处指定的其他函数)时终结测试执行。 |
串行通信:目标端口 | USART1 | UART 端口标签。可在 C/C++test 运行时库内部使用以实现条件初始化。 |
串行通信:主机端口 | 1 | 连接到目标设备的主机 COM 端口号。 |
串行通信:波特率 | 9600 | 串行传输波特率。 |
串行通信:字节大小 | 8 | 串行传输字节大小。 |
串行通信:奇偶校验 | E | 串行传输奇偶校验:无(N)、奇(O)、偶(E)、标记(M)或空格(S)。 |
串行通信:停止位 | 串行传输停止位数量。 |
串口监听器
当在真实硬件设备上执行测试并使用 UART 输出结果时,主机端的结果接收由辅助工具串口监听器负责处理。有关串口监听器的详细信息,请参阅 RS232 监听器。
单元测试
为便于单元测试过程,提供以下测试配置:
- Embedded Systems> Keil uVision> Run Keil uVision Tests - ULINK2 (UART)
- Embedded Systems> Keil uVision> Run Keil uVision Tests - ULINKPro or Simulator (ITM)
- Embedded Systems> Keil uVision> Run Keil uVision Tests – simulator (UART)
在目标设备或模拟器上运行单元测试的步骤:
- 手动创建或自动生成一组测试用例。
- 复制一个 Keil uVision 测试配置。
- 根据需要修改测试配置。详细信息,请参阅常规配置。
- 选择所需的测试环境。
- 使用上面创建的自定义测试配置运行测试。
调试测试用例
使用外部嵌入式调试模式。更多详细信息请参阅:
应用程序监控
为便于应用程序监控过程,提供以下测试配置:
- Embedded Systems> Keil uVision> Run Keil uVision Application with Memory Monitoring -ULINK2(UART)
- Embedded Systems> Keil uVision> Run Keil uVision Application with Memory Monitoring -ULINKPro or Simulator (ITM)
在目标设备上运行应用程序监控:
- 复制一个 Keil uVision 应用程序监控测试配置。
- 根据需要修改测试配置。详细信息,请参阅常规配置。
- 选择所需的测试环境。
- 使用上面创建的自定义测试配置运行测试。
已知局限性
支持的所有 MDK-ARM 版本
我们建议在测试应用程序执行之前关闭所有正在运行的 uVision 实例,这将在调试模式下启动 uVision。保持实例运行(例如开发)可能会阻止调试器正确执行。
MDK-ARM 4.6x 及更高版本
由于调试器和编译器库(尤其是系统 I/O 库模块 - sys_io.o
)的变化,因此在构建测试可执行文件时必须禁用半主机。必须将标准符号(例如 _ttywrch
和 _sys_exit
)以及所有 I/O _sys_
... 和 __std
..._name
符号重定向。