嵌入式设备自动化测试:MCU与传感器测试策略探讨
简介
在嵌入测试领域,自动化测试一直是一个难点。尤其对于MCU来说,由于外设众多且上位机(PC)无法直接模拟电信号来测试其外设,自动化测试的难度进一步增加。为解决这一问题,本文提供了一种基于上位机和辅助板(AUX BOARD)的测试方案,并以MCU测试为例
理论上该方案灵活变通后也可用于各传感器的自动化测试
上位机与辅助板通信
上位机通过串口将指令发送给辅助板,辅助板通过RTOS接收并解析。这是关键步骤。当MCU集成了RT-thread环境后,串口中会运行一个类似Linux的shell环境。
shell打印示例如下:
用户可以通过代码中的宏函数将特定指令导入到shell中。
MSH_CMD_EXPORT_ALIAS
例如:
MSH_CMD_EXPORT_ALIAS(i2c_test, i2c, cmd is for testing i2c)
此示例代码包含三个参数:
- 函数指针
- shell中的命令
- 提示符
当串口接收到i2c
命令后,将跳转到i2c_test
函数执行。在该函数内,会创建一个线程来运行特定功能代码。
RT-thread的shell指令允许接收参数,函数指针也有两个固定参数:
void i2c_test(int argc, char *argv[]);
这是上文提到的i2c
指令对应的函数。argc
是参数数量,argv
是一个字符串数组。例如,串口接收到如下指令:
i2c --host master
此时
argc=3
,argv[3] = {“i2c”, “--host”, “master”}
在i2c_test
函数中,通过判断接收到的参数,可以将串口中的信息反映到外设配置上。
示例代码
void i2c_test(int argc, char *argv[])
{
rt_thread_t i2c_thread = RT_NULL;
typedef struct {
uint8_t index;
char host[32];
char speed[32];
uint8_t address;
uint8_t sumbus_en;
}thread_i2c_param_t;
thread_i2c_param_t *params;
for (int i = 1; i < argc; i++) {
if (strcmp(argv[i], "--index") == 0 && i + 1 < argc) {
params->index = atoi(argv[i + 1]);
i++;
}
else if (strcmp(argv[i], "--host") == 0 && i + 1 < argc) {
strncpy(params->host, argv[i + 1], sizeof(params->host) - 1);
params->host[sizeof(params->host) - 1] = '\0';
i++;
}
else if (strcmp(argv[i], "--speed") == 0 && i + 1 < argc) {
strncpy(params->speed, argv[i + 1], sizeof(params->speed) - 1);
params->speed[sizeof(params->speed) - 1] = '\0';
i++;
}
else if (strcmp(argv[i], "--address") == 0 && i + 1 < argc) {
params->address = atoi(argv[i + 1]);
i++;
}
else if (strcmp(argv[i], "--sumbus_en") == 0 && i + 1 < argc) {
params->sumbus_en = atoi(argv[i + 1]);
i++;
}
}
i2c_thread = rt_thread_create("i2c", start_i2c, params, 4096, 24, 10);
if (i2c_thread != RT_NULL)
{
rt_thread_startup(i2c_thread);
}
}
在上图所示的示例代码中,允许通过串口指定i2c的地址、主从身份、通信速率等配置,并将这些参数传递给i2c的初始化函数start_i2c
。这样,可以非常灵活地通过串口动态配置辅助板运行的i2c设备。
需要特别提及的是“index”参数。本方案支持一块辅助板挂载多块待测板,只要辅助板的ip数量满足需求,并且树莓派接口中引出的引脚足够多,那么在辅助板内存未被完全占用之前,可以挂载任意数量的待测板。例如,开发板有4个I2C外设,可以将这4个I2C复用到不同的4组引脚上,然后通过index
指定要使用哪个I2C设备,实现一对多的测试。
在start_i2c
函数中,根据RTOS传递的参数,实现相应的驱动逻辑。如果辅助板使用的是STM32,则使用其底层驱动实现I2C初始化,确保初始化后的功能符合需求。
硬件部分的连接情况
对于MCU来说,众多外设往往通过树莓派接口与外部交互。如果通过杜邦线连接辅助板与待测板,不仅可维护性差,而且容易因物理连接问题导致测试失败。因此,可以设计如下转接板来连接辅助板与待测板的树莓派接口。
设计流程大致如下:
- 明确辅助板与待测板树莓派接口的每个引脚功能。
- 连接测试时需要互联的引脚。
简易的原理图以及实物图如下所示
作者:ChenX的打工日记