嵌入式编程中使用qemu能够做什么?

嵌入式资讯精选 2021-06-01 11:35

1.前言

嵌入式开发的过程中,很多时间都是要和硬件设备打交道,通过程序控制硬件的具体行为,这些往往是单片机延续下来的开发模式,在目前复杂的嵌入式系统中,很多都需要借助设计模式来进行开发,比如文件系统,网络,图形,算法等等,这些如果能够利用软件模拟器进行开发,可以大大的减少上板调试的时间。减少硬件连接的烦恼,在家也能随时分析软件代码。

在实际项目的开发过程中,qemu也非常的有用,例如当进行网络编程时,往往都会直接使用socket编程,其上层接口符合POSIX接口,这样上层应用的开发和底层驱动便可以很简单的分离出来,将工作细节进行合理的划分。而当进行嵌入式GUI编程设计时,也可以通过framebuffer,来进行各种界面的设计。同时,如果想新学习一款嵌入式编程语言,或者深入理解一些处理器的架构方面的知识,通过裸机编程,直接到qemu上运行也能够非常方便的进行探究工作。

下面举出一些qemu实际好用的应用来进行详细的描述。

2.嵌入式的裸机或RTOS编程

qemu的是指令翻译进行的,所以可以根据实际的需求进行相应的裸机开发和学习,比如语言学习,嵌入式C语言,嵌入式RUST语言,等等项目。一些github上的好用学习型的项目也会对qemu进行支持,用RUST语言在arm上的编程,即使手上没有很好的硬件的条件,也能够去学习RUST语言在嵌入式编程上的使用。

针对arm的编程,qemu也可以模拟出许多的架构出来,通过对这些架构的学习和掌握,可以加快对架构编程的理解。

./qemu-system-arm -M virt -cpu ?
Available CPUs:
  arm1026
  arm1136
  arm1136-r2
  arm1176
  arm11mpcore
  arm926
  arm946
  cortex-a15
  cortex-a7
  cortex-a8
  cortex-a9
  cortex-m0
  cortex-m3
  cortex-m33
  cortex-m4
  cortex-m55
  cortex-m7
  cortex-r5
  cortex-r5f
  max
  pxa250
  pxa255
  pxa260
  pxa261
  pxa262
  pxa270-a0
  pxa270-a1
  pxa270
  pxa270-b0
  pxa270-b1
  pxa270-c0
  pxa270-c5
  sa1100
  sa1110
  ti925t

然而嵌入式开发往往会和硬件打交道,qemu也提供了不同类别的硬件,比如flash,网卡,sd卡,中断,串口等等,这些对于学习不同的体系架构,也有着非常关键的作用。

比如学习cortex-m3或者aarch64编程,采用qemu,运行自己写的裸机代码,能够非常方便的进行各种实验。

在进行rtos的开发过程中,经常会采用qemu作为调试工具,进行龙芯、树莓派、riscv相关的开发和验证工作。在rtos中,比较关键的是上下文的切换,通过对寄存器信息的保存和恢复,另外就是中断的处理,能够很好的理解架构的底层编程方式。

以前的时候,也做过aarch64上的qemu编程,也是最开始基于qemu,然后慢慢的移植到树莓派上面,因为外设一致,代码层面不用改变,直接可以将qemu运行通过的固件放到树莓派的sd卡中也一样能够正常的运行。

上图是在qemu的rt-thread/bsp/raspberry-pi/raspi3-64中编译的固件在qemu上的运行效果,基本上完成对aarch64体系架构中的栈帧、中断、mmu的支持,以及外设部分SD卡、图形、串口、mbox的支持。该固件也可以直接放到树莓派硬件的sd卡中运行,其效果和在qemu效果一样。

除此之外,我也在qemu的支持上做了一些扩展开发,比如在riscv的生态支持上对gd32的rv-star在中科院软件研究所的基础上做了一些研究,同时对nuclei的各种处理器系列做了适配。这样对于软件层面的验证更加有用,比如去运行一下nuclei-sdk,或者对于RISCV的V扩展的支持的nmsis的支持。

qemu-system-riscv64 -M nuclei_n,download=ilm -cpu nuclei-nx600fdp -nodefaults -nographic -serial stdio -kernel CMSIS/nmsis_release/NMSIS/DSP/Examples/RISCV/riscv_matrix_example/dsp_example.elf

这样可以进行相关的dsp的验证工作。因为nmsis是基于arm的cmsis在riscv上的一份移植,其中实现了许多的加速运算的demo,比如矩阵运算,卷积,图像处理等等,这些指令同样也可以在nuclei qemu中计算出正确的结果。

由于对riscv的p扩展和v扩展的支持,使得其行为和实际硬件板子无差异。在qemu做算法优化和研究也是非常值得去尝试的。虽然qemu是用软件去模拟真实计算结果,但是从指令集的优化层面上来说,当功能逻辑实现正确后再移植到板子上做性能测试,这才是高效的处理方法。

在支持baremetal编程和rtos编程方面,nuclei-sdk也做了一些工作,可以更加好的观察分析软件的具体行为。

qemu-system-riscv32 -M nuclei_n,download=ilm -cpu nuclei-n201 -nodefaults -nographic -serial stdio -kernel application/rtthread/msh/msh.elf
Nuclei SDK Build Time: May 31 2021, 11:48:18
Download Mode: ILM
CPU Frequency 168290222 Hz

 \ | /
- RT -     Thread Operating System
 / | \     3.1.3 build May 31 2021
 2006 - 2019 Copyright by rt-thread team
Hello RT-Thread!
msh >
msh >ps
thread   pri  status      sp     stack size max used left tick  error
-------- ---  ------- ---------- ----------  ------  ---------- ---
tshell     6  ready   0x000000d8 0x00001000    10%   0x0000000a 000
tidle      7  ready   0x00000078 0x00000200    23%   0x00000020 000
main       2  suspend 0x000000b8 0x00000400    17%   0x00000013 000
msh >

也可以支持其他的rtos,例如下面的ucosii和freertos等等。

ucosii的运行效果如下:

qemu-system-riscv32 -M nuclei_n,download=ilm -cpu nuclei-n201 -nodefaults -nographic -serial stdio -kernel application/ucosii/demo/demo.elf
Nuclei SDK Build Time: May 31 2021, 11:49:45
Download Mode: ILM
CPU Frequency 182521692 Hz
Start ucosii...
create start task success
start all task...
task3 is running... 1
task2 is running... 1
task1 is running... 1
task3 is running... 2
task2 is running... 2
task3 is running... 3
task2 is running... 3
task1 is running... 2
task3 is running... 4
task2 is running... 4
task3 is running... 5
task2 is running... 5

freertos的运行效果如下:

qemu-system-riscv32 -M nuclei_n,download=ilm -cpu nuclei-n201 -nodefaults -nographic -serial stdio -kernel application/freertos/demo/demo.elf
Nuclei SDK Build Time: May 31 2021, 11:49:45
Download Mode: ILM
CPU Frequency 232205516 Hz
Before StartScheduler
Enter to task_1
task1 is running 0.....
Enter to task_2
task2 is running 0.....
timers Callback 0
timers Callback 1
task1 is running 1.....
task2 is running 1.....
timers Callback 2
timers Callback 3
task1 is running 2.....
task2 is running 2.....

利用qemu作为底层研究将会非常的高效。同时,善于借助gdb等调试工具,将能够非常容易的找到问题出现的点。

3.利用qemu网络编程研究

由于qemu的网络可以直接连接主机的网络,对这方面的研究可以从网络协议栈,网络的上层应用编程等等进行研究。例如去研究lwip协议栈的实现等等。

我写过一个qemu上的e1000网卡设备的驱动,针对于qemu riscv64的virt版本。

https://github.com/bigmagic123/rt-thread/tree/riscv_virt_network

针对rt-thread的qemu riscv的virt64版本,可以进行如下的设置。

其中其底层的驱动为e1000,为qemu提供了网络数据的收发、以及网络数据包的接收中断服务。

借助rt-thread上适配的lwip驱动程序,可以非常容易的实现上层网络编程应用。

比如借助rt-thread的IOT软件包

使能一些例子

最后可以测试一下web的通信情况。

当然,上述这个例子只是一个非常简单网络编程的演示,其中socket的编程部分实际上是通用的,无论是arm架构、mips架构或者riscv架构,借助qemu的好处在于可以采用一个架构平台,进行协议栈或者上层开发后,可以无缝的移植到自己的真实的板子上,非常方便进行整体业务的联调。

对于qemu riscv64 virt平台,整个系统从底层的virtio或者e1000的网卡设备提供数据的收发、中断消息机制之外,rt-thread也通过提供lwip协议栈的支持,这样整个网络链路才是比较合理的。开发起来也比较的方便。

在物联网模块的开发方面,采用qemu,也可以不用rt-thread,直接裸机驱动virt上的e1000网卡驱动,然后借助对寄存器的读写操作,移植其他的网络协议栈,从而实现网络数据的收发工作,网络编程的上层对接阿里云、腾讯云等云服务器,非常容易的实现业务的编程,同时调试方面,qemu的gdb调试功能也是非常的强大,也可以dump出内存进行ram parse分析。

4.嵌入式图形开发

因为嵌入式编程的实现,也会多少涉及到图形编程,当接上LCD屏后,其中的显示驱动对上层应用暴露出来的实际上是一块显存,通过对显存的读写,flush进行lcd的图像更新。

在图像编程方面,qemu也提供了显示窗口。这种显示窗口可以为gui相关的开发工作带来很多便捷。

关于嵌入式图像编程,可以参考

rt-thread\bsp\raspberry-pi\raspi3-64

相关的bsp,只需要完善显示程序即可。

可以寻找一张bmp的图片,图片大小为800x480的图片。

利用Image2Lcd的工具进行图像转换成数组。

最后将数组程序编译到程序代码中,将该数组放到显存中即可。

一切准备就绪后,就能够进行显示器的开发了。

#define LCD_BUF_SIZE  (800 * 480)
extern unsigned char gImage_1[];

void lcd_test()
{
    struct rt_device *lcd;
    struct rt_device_graphic_info *test_lcd_info;

    test_lcd_info = rt_malloc(sizeof( struct rt_device_graphic_info));
 //找到lcd
lcd = (struct rt_device *)rt_device_find("lcd");
    rt_kprintf("lcd get info:\n");
    rt_device_control(lcd, RTGRAPHIC_CTRL_GET_INFO, test_lcd_info);
    rt_kprintf("lcd width is %d\n", test_lcd_info->width);
    rt_kprintf("lcd height is %d\n", test_lcd_info->height);
    rt_kprintf("lcd bpp is %d\n", test_lcd_info->bits_per_pixel);

    rt_memcpy(test_lcd_info->framebuffer, &gImage_1[0], LCD_BUF_SIZE*4);
    //刷新图片
    rt_device_control(lcd, RTGRAPHIC_CTRL_RECT_UPDATE, NULL);
    rt_thread_delay(20);
}

如果要进行触摸操作,qemu也进行了基本的支持,只需移植相关的底层驱动即可进行开发工作,非常的高效和方便。

5.进行嵌入式Linux的开发

进行Linux开发工作,如果深入去学习某一个设备的开发,当然少不了不断的对Linux的内核部分进行编译和下载,这是一个十分耗时的工作,如果只是进行应用程序的开发,可能感觉不到许多的差别,但是一旦涉及到Linux内核的分析,频繁的下载也会浪费大量的时间。

当使用qemu后,这种问题将会得到很好的解决,采用qemu进行内核层面的裁剪,进行内核层面模块化的验证工作后,再进行移植,让其变得更加通用,不仅仅针对这个项目有效,而且也为自己积累了很多经验。

从分析linux的loader,分析Linux的驱动框架,内存管理,多核管理等等,都能够非常方便进行调试工作。

在实际硬件设备没有稳定之前,对软件项目进行评估,qemu是非常好用的工具。

6.小结

接触很多软件开发工作中,使用qemu确实能够在一定程度上节省时间,提高软件调试与分析的效率。

用软件模拟硬件的操作行为,本质上来说和实际的硬件操作区别不大,因为在嵌入式编程中,最底层的指令集的行为已经在qemu中实现的很好了,硬件模拟方面,qemu也大致能够模拟操作寄存器后,处理器的行为,这些在对qemu的底层支持和学习的过程中已经进行了大量的实验和研究。

理解qemu的使用,会对嵌入式软件原理有着更加深刻的理解,从更大的层面上来说,虚拟化的行为本来就是一种很好的解决方案,去设计一个嵌入式软件方案,去演示一个底层软件,或者节约下载调试时间,开发嵌入式上层业务系统软件的功能层面来说,qemu都是值得去研究和使用的工具。

1.对国产嵌入式操作系统,你了解多少?

2.“构建安全的嵌入式系统”线上课程,6月1日正式报名!

3.Arm亮出多款大小核CPU!

4.在51单片机上跑RTOS有没有意义?

5.国产芯片创业的战略思考

6.嵌入式开发中,数值常量如何转化为内存地址?

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

嵌入式资讯精选 掌握最鲜资讯,尽领行业新风
评论 (0)
  • 随着智能家居的普及,扫地机器人、擦窗机器人、洗地机等清洁设备正从“功能型”向“智能交互型”跃迁。用户不仅需要高效的清洁能力,更期待直观的语音提示、多传感器协同以及稳定可靠的性能。WTV380-8S语音芯片凭借SOP8超小封装(5mm×6mm)、380秒语音容量、强大扩展性及超高性价比,成为清洁设备语音交互与智能控制的核心解决方案,助力厂商打造差异化产品。一、微型封装,极致节省PCB空间WTV380-8S采用SOP8封装设计(5mm×6mm),体积小巧,可无缝嵌入清洁设备紧凑的电路板中,为电池、电
    广州唯创电子 2025-03-14 09:14 48浏览
  • esp32s3使用platformio 点亮1.69寸TFT历程之LVGL移植 继上一篇我历经很久的时间点亮了1.69寸TFT之后。我开始进行LVGL的移植。开始LVGL的学习。用platformio 开发esp32s3真的好方便。按照上一节的环境。本次由于需要使用LVGL。打开platformio lib界面搜索LVGL。目前里面的版本是9.2.2。我使用的8.3.6。然后按照下图加载到自己的工程项目。待加载完毕后。我们会看到libdeps下面会出现LVGL库好了,这一步完成后。我们就开始移植
    zhusx123 2025-03-15 20:58 104浏览
  • 失效模式与影响分析(FMEA)失效模式与影响分析(FMEA)是一种系统方法,用于识别和分析系统或过程中的潜在失效,广泛应用于工程和制造领域,以提高产品可靠性和安全性。最新标准由 2019 年发布的 AIAG-VDA FMEA 手册(第一版) 定义,该手册结合了美国和欧洲汽车行业的最佳实践,并引入了 七步法,确保分析全面且结构化。图:优思学院六西格玛新版 FMEA 失效分析的七个步骤1. 规划与准备确定 FMEA 研究的 范围、边界和目标。组建跨职能团队(设
    优思学院 2025-03-17 14:43 77浏览
  • 宠物饮水机是专为宠物设计的自动供水设备,它能够持续提供新鲜流动的水,刺激宠物饮水欲望,保持宠物健康。智能水位监测功能可确保宠物始终有水可饮,同时避免溢水和干烧,是现代宠物家庭的理想选择。那么,宠物饮水机水箱是如何实现低水位提醒功能的呢?ICMAN液位检测芯片轻松实现宠物饮水机的水箱低液位提醒功能!工作原理 :基于双通道电容式单点液位检测原理方案特点:液位检测精度高达±1mm,超强抗干扰,动态CS 10V 为家用电器水位提醒的应用提供了一种简单而又有效的实现方式<iframe height=
    ICMAN 2025-03-14 16:46 72浏览
  • 一、问题现象:语音播放异常的典型表现在使用WT588F(E)系列语音芯片的开发过程中,工程师常会遇到以下两类典型异常现象:播放不全:语音仅播放前段内容后突然中断,或特定段落无法触发播放断续:音频输出存在明显卡顿、爆音或波形畸变某智能门锁项目实测数据显示,在首批样机中有2%的设备出现语音提示突然中断的情况,经排查发现电源电压在播放瞬间跌落至2.0V(低于芯片工作阈值)。这类问题的根源往往隐藏于硬件设计与系统协同的细节之中。二、核心机理:电压稳定性对语音芯片的影响2.1 电源系统的动态响应特性WT5
    广州唯创电子 2025-03-17 09:18 108浏览
  • 在现代机械传动系统中,电机与传动轴的连接至关重要。正确的连接方式不仅能提高传动效率,还能延长设备的使用寿命。本文将探讨电机传动轴的几种常见连接方式及其优缺点。1.直接连接直接连接是将电机的输出轴与传动轴直接相连,通常采用联轴器进行连接。这种方式的优点是结构简单,传动效率高,适合于高转速和高精度的应用场合。然而,直接连接对对中精度要求较高,稍有偏差就可能导致振动和磨损。2.齿轮连接齿轮连接通过齿轮传动将电机的动力传递到传动轴。该方式的优点在于能够实现较大的转速变化和扭矩增益,适合于需要大功率和高扭
    博扬智能 2025-03-14 16:32 65浏览
  • 在安防监控领域,图像信号处理芯片的性能直接决定了摄像机的成像质量与应用效果。今天,为大家重磅介绍一款专为专业安防摄像机精心打造的图像信号处理芯片——XS5037C,它以全方位的卓越性能与显著优势,成为安防监控领域的得力之选,尤其是其出色的低功耗特性,更为产品增色不少。低功耗设计 节能典范在能耗方面,XS5037C 展现出了卓越的优势。其内核电压仅为 1.1V,普通 IO 电压设定为 3.3V,PSRAM IO 和 PSRAM 电压为 1.8V,Sensor DVP IO 电压同样为 1.8V,D
    芯片徐15652902508 2025-03-14 09:49 44浏览
  • 工艺工程师(Process Engineer)在工业生产中扮演着重要的角色,负责设计、优化和管理各种工业流程。这些流程通常涉及化学、物理或生物转化,旨在将原材料和能源转化为有用的产品。以下是关于工艺工程师角色、职责、技能和行业应用的详细分析,旨在为读者提供全面的理解。定义与范围根据 Wikipedia 的定义,工艺工程(Process Engineering)是理解和应用自然基本原理和定律,将原材料和能源在工业层面转化为有用产品的过程。它涵盖了化学、物理和生物流程的设计、操作
    优思学院 2025-03-14 12:26 50浏览
  •        在工业物联网的世界里,设备之间的“语言不通”曾让无数工厂陷入效率泥潭。想象一个汽车制造车间:1980年代的老式PLC控制器用Modbus RTU协议“说话”,2020年的智能机械臂支持OPC UA协议,而散布在角落的电表和传感器则操着DLT645等不同“方言”。这种协议碎片化让数据互通成为奢望,直到广和通4G模块化身“工业翻译官”,用多协议兼容和边缘计算能力打破僵局。一、从“铁皮盒子”到“边缘大脑”的技术蜕变    &nb
    中科领创 2025-03-14 14:14 50浏览
  • 一、引言:语音芯片的智能化浪潮在万物互联的智能化时代,语音交互技术已成为人机交互的重要纽带。从智能家电的提示音到儿童玩具的趣味互动,从工业设备的语音告警到公共服务设施的自动播报,语音播放芯片IC作为核心硬件支撑,正在重塑各行各业的用户体验。在众多解决方案中,WTN6、WT588、WT2003H、WTV四大系列产品,凭借差异化的技术特性构建了完整的语音芯片产品矩阵。本文将深度解析这四大主流芯片的技术特点与应用场景,为开发者提供选型参考。二、主流语音芯片技术特性全解析2.1 WTN6系列:高性价比的
    广州唯创电子 2025-03-17 09:04 122浏览
  • 在求职路上,一直没能拿到理想的录用通知,真的要放低要求吗?对很多人来说,这个问题往往让人进退两难。期待中那个能够激发自我潜能又能带来丰厚回报的职位,似乎离自己遥不可及。可是眼看着账单越压越重,生活在缓缓拖累前行。在这种局面下,究竟该不该向现实妥协,先找一份工作再说?有些人会觉得,先就业意味着放弃理想,觉得一旦走上这条路,就难以回到最初的目标。但事实上,这种担忧常常让人陷入犹豫与停滞。路走不通时,不代表必须原地不动。有时选择一份尚可接受的工作,也能带来意想不到的机会。公司内部的人脉、行业的历练,乃
    优思学院 2025-03-14 17:12 64浏览
  • 随着健康消费需求的升级,颈部按摩仪市场正朝着智能化、便携化方向快速发展。用户不仅追求舒适高效的按摩体验,还对产品交互友好性、功能多样性及续航能力提出了更高要求。WTV380-P(QFN32)语音芯片凭借其微型化设计、高集成度、可扩展性强及超高性价比,成为颈部按摩仪语音交互与智能控制的核心解决方案,助力产品在竞争中脱颖而出。一、超小体积,释放PCB空间潜能WTV380-P采用QFN32封装(仅4mm×4mm),体积比传统语音芯片缩小50%以上,可轻松嵌入颈部按摩仪内部狭小的电路板空间,为电池扩容、
    广州唯创电子 2025-03-14 08:57 45浏览
  • 近日,2025年GTI国际产业大会成功举办,活动上GTI Awards 2025获奖名单正式揭晓,紫光展锐连续三年斩获国际权威机构GTI颁发的大奖。此次,T8300凭借在5G技术创新和娱乐体验方面的卓越表现,荣获GTI“移动技术创新突破奖”(Innovative Breakthrough in Mobile Technology Award)。GTI是由中国移动、软银、沃达丰等运营商于2011年发起成立的国际产业合作平台。GTI Awards作为全球通信行业最具影响力的奖项之一,旨在表彰为行业
    紫光展锐 2025-03-14 17:35 66浏览
  • 万物互联时代,全屋智能正从概念走向现实,而蓝牙低功耗(BLE)技术凭借独特优势,已成为构建智慧家庭生态的核心驱动力之一。作为一项成熟且持续创新的无线通信协议,BLE技术不仅以“低功耗”定义行业标准,更凭借Mesh组网能力打破场景疆界,为智能家居设备提供了灵活、可靠、可扩展的解决方案,有力推动了全屋智能的落地应用。据中商产业研究院整理数据显示,2023年我国智能家居市场规模为7257亿元,预计到2024年将达7848亿元,到2025年将达到8526亿元,同比增长率约为10%。随着未来新房建设和老房
    华普微HOPERF 2025-03-14 17:08 60浏览
  • 文/Leon编辑/cc孙聪颖‍蛇年春晚最有意思的节目,一定非机器人跳舞莫属。就算是遥控或预编程,机器人能够做出如此复杂的动作,在五年前都是不敢想象的事情,其制造商宇树科技也因此火爆全网。就在春节过后不到一个月,会骑自行车的人形机器人诞生了。这背后,是近年来“具身智能”概念的迅猛发展。“我们造了一个跟人一样灵动的机器人!”3月11日,智元机器人联合创始人兼首席技术官彭志辉在微博上说道。在视频中,灵犀X2会骑自行车、能跳《科目三》,还可以与人促膝长谈,甚至拿起葡萄“穿针引线”。在全球人形机器人领域,
    华尔街科技眼 2025-03-17 12:38 78浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦