qemu单元测试二

zephyr + qemu单元测试 utest/qemu 阅读详情

qemu单元测试glib的测试框架,其使用可以参考:https://developer.gnome.org/glib/2.37/glib-Testing.html

对于一个用户来说使用这个框架比较简单,下面是一个arm下的tmp105的测试用例:

int main(int argc, char **argv)
{
    QTestState *s = NULL;
    int ret;


    g_test_init(&argc, &argv, NULL);


    s = qtest_start("-display none -machine n800");
    i2c = omap_i2c_create(OMAP2_I2C_1_BASE);
    addr = N8X0_ADDR;


    qtest_add_func("/tmp105/tx-rx", send_and_receive);


    ret = g_test_run();


    if (s) {
        qtest_quit(s);
    }
    g_free(i2c);


    return ret;
}

主要步骤是: 调用g_test_init初始化测试框架, 调用qtest_start启动测试的单板, 创建测试用例并添加到测试框架中,执行测试用例, 退出测试等。

这里面主要的函数是qtest _start,它主要功能是创建qemu的测试环境。这里qemu的执行和测试用例是分开的,两个进程通过socket进行通信。测试进程是客户端,qemu进程是服务器端。在tests/libtest.c:

QTestState *qtest_init(const char *extra_args)
{
    QTestState *s;
    int sock, qmpsock, i;
    gchar *pid_file;
    gchar *command;
    const char *qemu_binary;
    pid_t pid;


    qemu_binary = getenv("QTEST_QEMU_BINARY");
    g_assert(qemu_binary != NULL);


    s = g_malloc(sizeof(*s));


    s->socket_path = g_strdup_printf("/tmp/qtest-%d.sock", getpid());
    s->qmp_socket_path = g_strdup_printf("/tmp/qtest-%d.qmp", getpid());
    pid_file = g_strdup_printf("/tmp/qtest-%d.pid", getpid());


    sock = init_socket(s->socket_path);
    qmpsock = init_socket(s->qmp_socket_path);


    pid = fork();
    if (pid == 0) {
        command = g_strdup_printf("%s "
                                  "-qtest unix:%s,nowait "
                                  "-qtest-log /dev/null "
                                  "-qmp unix:%s,nowait "
                                  "-pidfile %s "
                                  "-machine accel=qtest "
                                  "%s", qemu_binary, s->socket_path,
                                  s->qmp_socket_path, pid_file,
                                  extra_args ?: "");
        execlp("/bin/sh", "sh", "-c", command, NULL);
        exit(1);
    }

    s->fd = socket_accept(sock);
    s->qmp_fd = socket_accept(qmpsock);

    s->rx = g_string_new("");
    s->pid_file = pid_file;
    s->child_pid = pid;
    for (i = 0; i < MAX_IRQ; i++) {
        s->irq_level[i] = false;
    }

    /* Read the QMP greeting and then do the handshake */
    qtest_qmp(s, "");
    qtest_qmp(s, "{ 'execute': 'qmp_capabilities' }");

    if (getenv("QTEST_STOP")) {
        kill(qtest_qemu_pid(s), SIGSTOP);
    }

    return s;
}
这个函数创建了qemu的执行进程,在qemu单元测试的情况下使用的的accel是qtest方式,因为在这个模式下quest并不需要执行指令,但是需要创建整个单板以方便测试。
以一个最简单的writew为例,执行流程如下: 首先测试单元执行这个指令:

static void omap_i2c_set_slave_addr(OMAPI2C *s, uint8_t addr)
{
    uint16_t data = addr;


    writew(s->addr + OMAP_I2C_SA, data);
    data = readw(s->addr + OMAP_I2C_SA);
    g_assert_cmphex(data, ==, addr);
}

writew最终会调用qtest_writew:

void qtest_writew(QTestState *s, uint64_t addr, uint16_t value)
{
    qtest_write(s, "writew", addr, value);
}
static void GCC_FMT_ATTR(2, 3) qtest_sendf(QTestState *s, const char *fmt, ...)
{
    va_list ap;

    va_start(ap, fmt);
    socket_sendf(s->fd, fmt, ap);
    va_end(ap);
}
qtest_sendf通过socket.c将cmd以及相关的参数传送给qemu进程

    } else if (strcmp(words[0], "writeb") == 0 ||
               strcmp(words[0], "writew") == 0 ||
               strcmp(words[0], "writel") == 0 ||
               strcmp(words[0], "writeq") == 0) {
        uint64_t addr;
        uint64_t value;

        g_assert(words[1] && words[2]);
        addr = strtoull(words[1], NULL, 0);
        value = strtoull(words[2], NULL, 0);

        if (words[0][5] == 'b') {
            uint8_t data = value;
            cpu_physical_memory_write(addr, &data, 1);
        } else if (words[0][5] == 'w') {
            uint16_t data = value;
            tswap16s(&data);
            cpu_physical_memory_write(addr, &data, 2);
        } else if (words[0][5] == 'l') {
            uint32_t data = value;
            tswap32s(&data);
            cpu_physical_memory_write(addr, &data, 4);
        } else if (words[0][5] == 'q') {
            uint64_t data = value;
            tswap64s(&data);
            cpu_physical_memory_write(addr, &data, 8);
        }
        qtest_send_prefix(chr);
        qtest_send(chr, "OK\n");

对write的处理是解析出addr,data,len的参数,然后调用cpu_phsical_memory_write完成这个操作

int qtest_init(void)
{
    CharDriverState *chr;


    g_assert(qtest_chrdev != NULL);
    
    configure_icount("0");
    chr = qemu_chr_new("qtest", qtest_chrdev, NULL);
    
    qemu_chr_add_handlers(chr, qtest_can_read, qtest_read, qtest_event, chr);
    qemu_chr_fe_set_echo(chr, true);
    
    inbuf = g_string_new("");
        
    if (qtest_log) {
        if (strcmp(qtest_log, "none") != 0) {
            qtest_log_fp = fopen(qtest_log, "w+");
        }
    } else {
        qtest_log_fp = stderr;
    }


    qtest_chr = chr;


    return 0;
}

在测试模式下qemu不会执行任何指令, 只会进行简单的处理。在cpus.c里面qemu初始化的时候选择qemu_dummy_cpu_thread_fn

static void *qemu_dummy_cpu_thread_fn(void *arg)
{
#ifdef _WIN32
    fprintf(stderr, "qtest is not supported under Windows\n");
    exit(1);
#else
    CPUState *cpu = arg; 
    sigset_t waitset;
    int r;

    qemu_mutex_lock_iothread();
    qemu_thread_get_self(cpu->thread);
    cpu->thread_id = qemu_get_thread_id();

    sigemptyset(&waitset);
    sigaddset(&waitset, SIG_IPI);

    /* signal CPU creation */
    cpu->created = true;
    qemu_cond_signal(&qemu_cpu_cond);

    cpu_single_env = cpu->env_ptr;
    while (1) {
        cpu_single_env = NULL;
        qemu_mutex_unlock_iothread();
        do { 
            int sig; 
            r = sigwait(&waitset, &sig);
        } while (r == -1 && (errno == EAGAIN || errno == EINTR));
        if (r == -1) {
            perror("sigwait");
            exit(1);
        }    
        qemu_mutex_lock_iothread();
        cpu_single_env = cpu->env_ptr;
        qemu_wait_io_event_common(cpu);
    }




        
QEMU学习笔记01-QEMU模拟器简介 QEMU(Quick Emulator的缩写)是一个免费开源模拟器。可以模拟x86,也可以模拟各种ARM板子。 安装kvm加速qemu运行,在终端上执行如下命令 sudo apt update sudo apt install qemu qemu-kvm libvirt-bin bridge-utils virt-manager ... 阅读详情

相关推荐

深入QEMU设备模拟:如何为你的自定义PCI设备编写单元测试(以watchdog为例)

本文深入探讨了在QEMU中为自定义PCI设备编写单元测试的方法,以看门狗设备为例详细介绍了qtest框架的使用。内容涵盖测试环境搭建、寄存器测试、中断验证以及高级测试场景设计,帮助开发者确保PCI设备模拟的稳定性和正确性。

weixin_30291791的博客 374

深入QEMU设备模型:手把手教你为自定义PCI设备编写单元测试(qtest实战)

本文深入探讨了QEMU设备模型中为自定义PCI设备编写单元测试的实战方法,重点介绍了qtest框架的核心原理、测试环境搭建、PCI设备测试用例设计以及高级调试技巧。通过详细的代码示例和步骤说明,帮助开发者快速掌握如何为自定义PCI设备构建完整的测试体系,确保设备行为的稳定性和可靠性。

weixin_30896511的博客 363

芯片开发验证之Spike+Pk和Qemu:为芯片RTL验证提供参照系

本文探讨了RISC-V CPU开发验证中QEMU、Spike和ProxyKernel三个关键工具的作用。QEMU作为全系统模拟器,能快速模拟完整计算机系统,支持操作系统运行;Spike是RISC-V ISA功能级参考模型,作为黄金标准验证指令正确性;ProxyKernel则提供基础系统调用支持,连接裸机程序与Spike。三者各司其职:QEMU用于系统级开发验证,Spike确保ISA兼容性,PK支持单元测试运行。在验证流程中,先通过Spike+PK生成预期结果,再与RTL仿真结果对比,形成完整的验证参照系,共

ChipCamp的博客---https://chipcamp.blog.youkuaiyun.com/ 758

QEMU学习(八):QEMU系统测试

qemu系统测试

qq_40139527的博客 2419

QEMU中指令添加相关(1):测试程序

on the first hardware thread (hartid == 0), halt all the other threads,判断t0值是否为0,为0则向下执行,否则跳转到halt。stack pointer //将栈顶的地址加载到sp寄存器中。),将线程id放到t0寄存器。

swh547的博客 237

Windows版Vitis2023.1,使用unity做单元测试后,生成的elf文件如何运行在仿真环境中呢?

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 797

QEMU内存迁移压测工具简介

对QEMU内存迁移压力测试工具的使用和原理进行简单介绍

Take Easy,Work Hard! 2216

X86 Ubuntu上运行ARM代码的QEMU、GDB和GTest全攻略

QEMU是一个开源的机器模拟器和虚拟化器。它支持不同架构的处理器模拟,可以在一台主机上模拟多台不同架构的机器。QEMU的虚拟化能力使得它在开发和测试环境中特别有用,尤其是在跨平台应用开发和嵌入式系统开发中。Google Test(GTest)是Google推出的一套用于C++测试的框架,它基于xUnit思想,是目前最流行的C++单元测试框架之一。其特点主要包括:易于使用:GTest提供了丰富的宏定义,可以轻松编写测试用例,无需复杂的测试框架设计。丰富的测试用例结构。

weixin_42561464的博客 1551

qemu 单元测试一

qemu使用glib的test框架对io, cpu等进行单元测试。测试用例放在tests目录下。 测试的项目包括: qobject模型测试用例;qemu的基本函数实现;主机实现的函数等; qapi相关的测试用例; qmp测试用例; 架构有关的测试用例;外设测试用例等等。 以arm为例测试用例的使用方法: 1.编译qemu ./configure --target-list=arm-softm

alloc_young的专栏 3181

OpenWrt国内镜像源一键切换脚本:清华/阿里/中科大源全搞定

本文介绍了OpenWrt国内镜像源一键切换脚本,支持清华、阿里和中科大三大源,自动识别设备架构和系统版本,显著提升软件包安装速度和成功率。脚本包含架构自动识别、版本适配、多源选择和配置备份等功能,适用于x86_64、ramips/mt7621等常见架构,帮助用户解决海外源访问缓慢的问题。

g5h6i的博客 1175

【影像组学】用3Dslicer或Python提取影像组学特征

用3Dslicer或Python提取影像组学特征

abdslfwoeugp 1万+

QEMU STM32:嵌入式开发者的虚拟硬件实验室

QEMU STM32 是一个基于开源 QEMU 项目的 STM32 微控制器仿真器,为嵌入式开发者提供了一个完整的虚拟硬件环境。这个强大的工具让您无需购买昂贵的开发板,就能在计算机上运行和调试 STM32 应用程序,大大降低了学习和开发的门槛。无论您是嵌入式新手还是经验丰富的工程师,QEMU STM32 都能帮助您更高效地进行固件开发和测试。 ## 快速上手指南 ### 环境准备与项目获取

gitblog_01058的博客 799

ArcGIS中地理坐标系与投影坐标系以及投影转换

简单介绍arcgis软件中坐标系定义、设置和常见问题。

weixin_41399650的博客 8万+

QEMU Arm xPack 开源项目教程

QEMU Arm xPack 开源项目教程 1. 项目介绍 QEMU Arm xPack 是一个基于QEMU的二进制发行版,由Liviu Ionescu维护。它专为Arm架构设计,旨在提供一个易于安装和使用的QEMU版本,用于执行测试,特别是单元测试。xPack QEMU Arm与原始的qemu-system-arm和qemu-system-aarch64兼容,同时也支持Semihosting和I...

gitblog_00658的博客 677

从JT808/JT1078协议到多端协同:构建高并发北斗车辆监控平台的技术实践

本文详细介绍了基于JT808/JT1078协议构建高并发北斗车辆监控平台的技术实践,包括协议解析、高并发架构设计、多端协同实现及数据持久化策略。通过Netty、Kafka等技术优化,系统成功支撑日均2000万条消息处理,为GPS车辆动态监控系统提供了可靠解决方案。

weixin_28358083的博客 224

Python 实现 傅里叶级数 对 函数拟合 并绘图

好记性不如烂笔头 目录傅里叶级数变换原理代码实现效果图 傅里叶级数变换原理 原理:待续… 傅里叶级数变换公式: 代码实现 本次实现的是符号函数的拟合: 注:若要实现其他函数的拟合,修改程序中 fx 的表达式即可 """ 傅里叶级数""" import sympy as sym import numpy as np import matplotlib.pyplot as plt N = 8 # 拟合的阶数 L = sym.pi # 周期的一半 n, x = sym.symbols('n x')

qq_41676952的博客 1万+

QEMU测试框架使用指南:如何编写和运行QEMU测试用例

前往项目官网免费下载:[https://ar.openeuler.org/ar/](https://ar.openeuler.org/ar/?utm_source=csdn_blog) QEMU作为一款功能强大的开源机器模拟器和虚拟化工具,拥有完善的测试框架来确保代码质量和功能稳定性。本文将为您详细介绍QEMU测试框架的完整使用指南,帮助您快速掌握如何编写和运行各种类型的QEMU测试用例。无论您

gitblog_06861的博客 266

YOLOv13改进策略【Neck篇】| GSConv 轻量卷积,Slim-Neck 减参数还不掉点

Neck 篇的第二篇继续"替换式"改进,这次的对象是 Neck 里的下采样卷积。GSConv 出自《Slim-neck by GSConv: a better design of lightweight detector》(2022),它的出发点:DWSConv(深度可分离)轻但"信息混不进通道",标准卷积重但表达好——GSConv 用GConv(分组卷积)混通道 + DWConv 补空间 + Channel Shuffle 打散,两全其美。

qq_53329130的博客 30

Qemu添加自定义PCI设备

QEMU中添加新设备的核心是将设备描述TypeInfo对象注册进QEMU,将注册函数本身作为QEMU系统设备初始化链表中的一个接点注册进QEMU设备链表,而后者代表的注册函数则通过gcc attribute constructor注册进QEMU应用,在启动过程中执行。设备本身的注册函数将在QEMU启动过程中执行设备链表中的初始化会调完成。

tugouxp的专栏 2604

C#串口通信从入门到精通(7)——整数/浮点数与二进制、八进制、十六进制之间的转换与C#实现

本文详细介绍由博主开发的DataConvert串口通信帮助类的用法,该帮助类涵盖了串口通信领域所有的数据转换方法,帮助大家快速编写串口通信程序!

qq_34059233的博客 2879

使用亚组分析进行子组分析并可视化森林图 - R语言

通过亚组分析和森林图的结合,我们可以更好地理解不同子组之间的差异和效果大小。当然,在实际应用中,还需要考虑多种因素,如样本量、异质性等,以得到更准确的结果和结论。每个森林图中的水平线代表了每个子组的效应估计,线的长度表示了该效应估计的置信区间。假设我们有一个包含研究对象的数据框(data frame),其中包括了治疗组和对照组的结果数据,以及一些可能的影响因素作为调整变量。在本例中,我们将比较两种不同的治疗方法(A和B)对结果变量的影响,并调整了一个额外的变量。是结果变量和对照组变量的列名。

2301_79326857的博客 1234

TrustZone——运行环境—QEMU—OP-TEE (新办法)

最新OPTEE更新很快,整个系统编译方式为了兼容Android,提供了Android.mk。不过整体还是挺简单的。我们看一下,还是使用QEMU。 准备工具repo。 mkdir ~/bin PATH=~/bin:$PATH 也可以将 export PATH=~/bin:$PATH 加到 ~/.bashrc可永久保存PATH环境变量。 获取repo,repo是一个python脚本。

TrustZone领域先行者 6294

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

QEMU STM32 项目使用教程

QEMU STM32 是一个基于 QEMU 的开源项目,专门为 STM32 微控制器提供仿真支持。该项目允许开发者在不使用实际硬件的情况下,对 STM32 微控制器进行开发和测试。QEMU STM32 不仅实现了 STM32 微控制器的核心功能,还支持 Olimex STM32_P103 开发板,使得开发者可以在虚拟环境中运行和调试 STM32 应用程序。 ## 2. 项目快速启动 ### 2...

gitblog_00178的博客 1110

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【亲测免费】 QEMU Manager 使用与安装指南

QEMU Manager 使用与安装指南 项目目录结构及介绍 由于提供的链接指向的是一个假设的GitHub仓库(实际上该仓库不存在,这里基于通用规范构建说明),我们通常可以预期一个开源软件如QEMU Manager在GitHub上的目录结构是组织有序的。以下是一个典型的结构示例: QEMU-Manager/ │ ├── README.md # 项目简介和快速入门指南 ├── LIC...

gitblog_00558的博客 1212

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

qemu 跑 kvm-unit-test

Compling process: git clone https://github.com/rhdrjones/kvm-unit-tests.git ./configure make After compiling successful, you will find there has a lot of *.elf file in the x86/ directory, each fil...

sfz200809242719的专栏 1091

STM32虚拟开发环境终极指南:QEMU仿真器深度解析与实战教程

想要进行STM32开发却苦于没有硬件设备?🤔 别担心!QEMU STM32虚拟开发环境让你在电脑上就能运行和调试STM32程序!🚀 这个强大的开源工具能够完美模拟STM32微控制器和Olimex STM32_P103开发板,为嵌入式开发者提供无与伦比的便利性。 ## 什么是QEMU STM32虚拟开发环境? QEMU STM32是一个专门针对STM32微控制器优化的**QEMU仿真器**,

gitblog_00496的博客 550
上一篇: qemu 单元测试一
下一篇: extract initrd on ubuntu
Xalloc
博客等级 码龄16年 25粉丝 55原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值