日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

嵌入式編程中使用qemu可以做什么?

嵌入式IoT ? 來源:嵌入式IoT ? 作者:嵌入式IoT ? 2021-06-01 08:56 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1.前言嵌入式開發(fā)的過程中,很多時間都是要和硬件設備打交道,通過程序控制硬件的具體行為,這些往往是單片機延續(xù)下來的開發(fā)模式,在目前復雜的嵌入式系統(tǒng)中,很多都需要借助設計模式來進行開發(fā),比如文件系統(tǒng),網絡,圖形,算法等等,這些如果能夠利用軟件模擬器進行開發(fā),可以大大的減少上板調試的時間。減少硬件連接的煩惱,在家也能隨時分析軟件代碼。

在實際項目的開發(fā)過程中,qemu也非常的有用,例如當進行網絡編程時,往往都會直接使用socket編程,其上層接口符合POSIX接口,這樣上層應用的開發(fā)和底層驅動便可以很簡單的分離出來,將工作細節(jié)進行合理的劃分。而當進行嵌入式GUI編程設計時,也可以通過framebuffer,來進行各種界面的設計。同時,如果想新學習一款嵌入式編程語言,或者深入理解一些處理器的架構方面的知識,通過裸機編程,直接到qemu上運行也能夠非常方便的進行探究工作。

下面舉出一些qemu實際好用的應用來進行詳細的描述。

2.嵌入式的裸機或RTOS編程

qemu的是指令翻譯進行的,所以可以根據實際的需求進行相應的裸機開發(fā)和學習,比如語言學習,嵌入式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

然而嵌入式開發(fā)往往會和硬件打交道,qemu也提供了不同類別的硬件,比如flash,網卡,sd卡,中斷,串口等等,這些對于學習不同的體系架構,也有著非常關鍵的作用。

比如學習cortex-m3或者aarch64編程,采用qemu,運行自己寫的裸機代碼,能夠非常方便的進行各種實驗。

在進行rtos的開發(fā)過程中,經常會采用qemu作為調試工具,進行龍芯、樹莓派、riscv相關的開發(fā)和驗證工作。在rtos中,比較關鍵的是上下文的切換,通過對寄存器信息的保存和恢復,另外就是中斷的處理,能夠很好的理解架構的底層編程方式。

以前的時候,也做過aarch64上的qemu編程,也是最開始基于qemu,然后慢慢的移植到樹莓派上面,因為外設一致,代碼層面不用改變,直接可以將qemu運行通過的固件放到樹莓派的sd卡中也一樣能夠正常的運行。

bbad3648-c236-11eb-9e57-12bb97331649.png

上圖是在qemu的rt-thread/bsp/raspberry-pi/raspi3-64中編譯的固件在qemu上的運行效果,基本上完成對aarch64體系架構中的棧幀、中斷、mmu的支持,以及外設部分SD卡、圖形、串口、mbox的支持。該固件也可以直接放到樹莓派硬件的sd卡中運行,其效果和在qemu效果一樣。

除此之外,我也在qemu的支持上做了一些擴展開發(fā),比如在riscv的生態(tài)支持上對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中計算出正確的結果。

bbcda84c-c236-11eb-9e57-12bb97331649.png

由于對riscv的p擴展和v擴展的支持,使得其行為和實際硬件板子無差異。在qemu做算法優(yōu)化和研究也是非常值得去嘗試的。雖然qemu是用軟件去模擬真實計算結果,但是從指令集的優(yōu)化層面上來說,當功能邏輯實現正確后再移植到板子上做性能測試,這才是高效的處理方法。

在支持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, 1118

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, 1145

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, 1145

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版本,可以進行如下的設置。

bbd98f04-c236-11eb-9e57-12bb97331649.png

其中其底層的驅動為e1000,為qemu提供了網絡數據的收發(fā)、以及網絡數據包的接收中斷服務。

借助rt-thread上適配的lwip驅動程序,可以非常容易的實現上層網絡編程應用。

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

bbf29c38-c236-11eb-9e57-12bb97331649.png

使能一些例子

bc0c13ac-c236-11eb-9e57-12bb97331649.png

最后可以測試一下web的通信情況。

bc293504-c236-11eb-9e57-12bb97331649.png

當然,上述這個例子只是一個非常簡單網絡編程的演示,其中socket的編程部分實際上是通用的,無論是arm架構、mips架構或者riscv架構,借助qemu的好處在于可以采用一個架構平臺,進行協議?;蛘呱蠈娱_發(fā)后,可以無縫的移植到自己的真實的板子上,非常方便進行整體業(yè)務的聯調。

對于qemu riscv64 virt平臺,整個系統(tǒng)從底層的virtio或者e1000的網卡設備提供數據的收發(fā)、中斷消息機制之外,rt-thread也通過提供lwip協議棧的支持,這樣整個網絡鏈路才是比較合理的。開發(fā)起來也比較的方便。

物聯網模塊的開發(fā)方面,采用qemu,也可以不用rt-thread,直接裸機驅動virt上的e1000網卡驅動,然后借助對寄存器的讀寫操作,移植其他的網絡協議棧,從而實現網絡數據的收發(fā)工作,網絡編程的上層對接阿里云、騰訊云等云服務器,非常容易的實現業(yè)務的編程,同時調試方面,qemu的gdb調試功能也是非常的強大,也可以dump出內存進行ram parse分析。

4.嵌入式圖形開發(fā)

因為嵌入式編程的實現,也會多少涉及到圖形編程,當接上LCD屏后,其中的顯示驅動對上層應用暴露出來的實際上是一塊顯存,通過對顯存的讀寫,flush進行l(wèi)cd的圖像更新。

在圖像編程方面,qemu也提供了顯示窗口。這種顯示窗口可以為gui相關的開發(fā)工作帶來很多便捷。

關于嵌入式圖像編程,可以參考

rt-threadsp

aspberry-pi

aspi3-64

相關的bsp,只需要完善顯示程序即可。

可以尋找一張bmp的圖片,圖片大小為800x480的圖片。

利用Image2Lcd的工具進行圖像轉換成數組。

最后將數組程序編譯到程序代碼中,將該數組放到顯存中即可。

bd3ef924-c236-11eb-9e57-12bb97331649.png

一切準備就緒后,就能夠進行顯示器的開發(fā)了。

#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(“l(fā)cd”);

rt_kprintf(“l(fā)cd get info:

”);

rt_device_control(lcd, RTGRAPHIC_CTRL_GET_INFO, test_lcd_info);

rt_kprintf(“l(fā)cd width is %d

”, test_lcd_info-》width);

rt_kprintf(“l(fā)cd height is %d

”, test_lcd_info-》height);

rt_kprintf(“l(fā)cd bpp is %d

”, 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也進行了基本的支持,只需移植相關的底層驅動即可進行開發(fā)工作,非常的高效和方便。

5.進行嵌入式Linux的開發(fā)

進行Linux開發(fā)工作,如果深入去學習某一個設備的開發(fā),當然少不了不斷的對Linux的內核部分進行編譯和下載,這是一個十分耗時的工作,如果只是進行應用程序的開發(fā),可能感覺不到許多的差別,但是一旦涉及到Linux內核的分析,頻繁的下載也會浪費大量的時間。

當使用qemu后,這種問題將會得到很好的解決,采用qemu進行內核層面的裁剪,進行內核層面模塊化的驗證工作后,再進行移植,讓其變得更加通用,不僅僅針對這個項目有效,而且也為自己積累了很多經驗。

bd5be6a6-c236-11eb-9e57-12bb97331649.png

從分析linux的loader,分析Linux的驅動框架,內存管理,多核管理等等,都能夠非常方便進行調試工作。

在實際硬件設備沒有穩(wěn)定之前,對軟件項目進行評估,qemu是非常好用的工具。

6.小結

接觸很多軟件開發(fā)工作中,使用qemu確實能夠在一定程度上節(jié)省時間,提高軟件調試與分析的效率。

用軟件模擬硬件的操作行為,本質上來說和實際的硬件操作區(qū)別不大,因為在嵌入式編程中,最底層的指令集的行為已經在qemu中實現的很好了,硬件模擬方面,qemu也大致能夠模擬操作寄存器后,處理器的行為,這些在對qemu的底層支持和學習的過程中已經進行了大量的實驗和研究。

理解qemu的使用,會對嵌入式軟件原理有著更加深刻的理解,從更大的層面上來說,虛擬化的行為本來就是一種很好的解決方案,去設計一個嵌入式軟件方案,去演示一個底層軟件,或者節(jié)約下載調試時間,開發(fā)嵌入式上層業(yè)務系統(tǒng)軟件的功能層面來說,qemu都是值得去研究和使用的工具。

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 顯示器
    +關注

    關注

    22

    文章

    5160

    瀏覽量

    144806
  • 驅動
    +關注

    關注

    12

    文章

    1994

    瀏覽量

    88735
  • 編程
    +關注

    關注

    90

    文章

    3724

    瀏覽量

    97459
  • LCD屏
    +關注

    關注

    0

    文章

    132

    瀏覽量

    16630

原文標題:嵌入式編程中使用qemu能夠做什么?

文章出處:【微信號:Embeded_IoT,微信公眾號:嵌入式IoT】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    嵌入式單片機開發(fā)學習路徑

    編程、任務調度、同步與通信等概念。 4.2 高級編程技巧 掌握嵌入式系統(tǒng)中的高級編程技巧,如低功耗設計、實時控制、硬件驅動編寫等。 5. 項目實戰(zhàn) 通過參與實際項目來提升自己的
    發(fā)表于 02-09 15:42

    嵌入式驅動開發(fā),需要掌握哪些技能?

    有經驗的老司機都知道,做嵌入式驅動開發(fā)需要掌握一系列的技能,包含編程、硬件、操作系統(tǒng)、調試等多個方面。 1、硬件知識熟悉原理圖:能看懂原理圖以及各種元器件的含義,以及PCB布局等。 了解
    發(fā)表于 01-20 16:46

    什么是嵌入式應用開發(fā)?

    包括ARM7、ARM9、ARM11、PowerPC、MIPS等。這些處理器和編程語言的選擇取決于具體的硬件條件和開發(fā)需求?。 綜上所述,嵌入式應用開發(fā)是一個綜合性的技術領域,涉及硬件和軟件的緊密結合,廣泛應用于各種設備和系統(tǒng)中,具有廣泛的應用前景和發(fā)展空間。
    發(fā)表于 01-12 16:13

    arm嵌入式主板優(yōu)缺點

    ,ARM嵌入式主板作為單芯片系統(tǒng),幾乎只需要極少的外圍電路就可以讓功能順利進行。第二,穩(wěn)定的系統(tǒng),除了要有穩(wěn)定的硬件外,還需要有穩(wěn)定的軟件,嵌入式操作系統(tǒng),作為單一功能的操作系統(tǒng),勢必問題出現的少
    發(fā)表于 01-08 07:08

    嵌入式應掌握的幾種能力

    1. 編程語言 基本掌握嵌入式必備的編程語言。C語言為主,C++為輔。在資源有限的情況下,大多數嵌入式產品還是使用C語言為主的,特別是底層驅動開發(fā)。上層應用開發(fā)大多用C,在一些資源比
    發(fā)表于 12-08 06:05

    嵌入式與FPGA的區(qū)別

    ,一是嵌入式軟件開發(fā),主要與嵌入式cao作系統(tǒng)、應用軟件等有關。第二是嵌入式硬件開發(fā),需要掌握硬件設計、模擬仿真、 PCB設計等技能。 ?2、FPGA:它是在PAL、GAL、CPLD等可編程
    發(fā)表于 11-20 07:12

    嵌入式和FPGA的區(qū)別

    ,芯片內部的門電路連接在出廠時就已固定,無法更改,它們的功能是通過軟件編程也就是嵌入式軟件來實現的。 FPGA(現場可編程門陣列) 則是一種可編程邏輯器件,其硬件結構
    發(fā)表于 11-19 06:55

    2025年最佳的嵌入式編程語言有哪些呢?

    嵌入式系統(tǒng)是現代科技不可或缺的一部分。它們存在于家用電器、汽車、住宅、醫(yī)院、商店等各個領域。它們與我們的社會緊密相連。選擇合適的語言來構建嵌入式系統(tǒng)對于成功至關重要。那么,2025年最佳的嵌入式
    的頭像 發(fā)表于 11-14 10:27 ?1815次閱讀
    2025年最佳的<b class='flag-5'>嵌入式</b><b class='flag-5'>編程</b>語言有哪些呢?

    嵌入式開發(fā)的關鍵點介紹

    。 嵌入式系統(tǒng)的應用非常廣泛,例如:智能家居、智能手表、智能手機、智能汽車等等。嵌入式開發(fā)需要開發(fā)人員具備深入的硬件知識和編程經驗,但是也有一些嵌入式開發(fā)工具
    發(fā)表于 11-13 08:12

    盤點嵌入式就業(yè)所需要的技能有哪些?

    ,把握未來的職業(yè)機遇。 1.智能汽車行業(yè): - 熟悉嵌入式編程語言,如C/C++、Python等。 - 掌握嵌入式系統(tǒng)設計與開發(fā)流程,了解汽車電子控制系統(tǒng)的基本原理。 - 具備良好的數據結構和算法
    發(fā)表于 08-11 15:43

    入行嵌入式應該怎么準備?

    知識: 一、C/C++編程C/C++是嵌入式系統(tǒng)開發(fā)中最常用的編程語言。熟練掌握C/C++語言將使你能夠理解和編寫底層驅動程序、操作系統(tǒng)以及與硬件交互的代碼。對于嵌入式系統(tǒng)來說,效率
    發(fā)表于 08-06 10:34

    MicroBlaze處理器嵌入式設計用戶指南

    *本指南內容涵蓋了在嵌入式設計中使用 MicroBlaze 處理器、含存儲器 IP 核的設計、IP integrator 中的復位和時鐘拓撲結構。獲取完整版《 MicroBlaze 處理器嵌入式設計用戶指南》,請至文末掃描二維碼
    的頭像 發(fā)表于 07-28 10:43 ?1325次閱讀

    Linux嵌入式和單片機嵌入式的區(qū)別?

    : 單片機嵌入式 :開發(fā)環(huán)境相對簡單,通常使用C語言或匯編語言進行編程,開發(fā)工具包括Keil、IAR等。 Linux嵌入式 :開發(fā)環(huán)境較為復雜,除了需要掌握C語言,還需要了解Linux操作系統(tǒng)的相關知識
    發(fā)表于 06-20 09:46

    運行在嵌入式系統(tǒng)上的emApps

    在當今快節(jié)奏的嵌入式系統(tǒng)世界中,靈活性和適應性是嵌入式系統(tǒng)實現的關鍵。SEGGER推出了其最新創(chuàng)新:Embedded apps(emApps)應用,類似于手機上的應用程序,可以運行在嵌入式
    的頭像 發(fā)表于 06-18 09:53 ?1083次閱讀
    運行在<b class='flag-5'>嵌入式</b>系統(tǒng)上的emApps

    嵌入式開發(fā)入門指南:從零開始學習嵌入式

    特定功能的計算機系統(tǒng),廣泛應用于智能家居、工業(yè)控制、醫(yī)療設備、車載系統(tǒng)等領域。 2. 學習嵌入式開發(fā)的前置知識熟悉C語言編程掌握基本的數據結構與算法了解數字電路與微控制器原理熟悉Linux操作系統(tǒng)
    發(fā)表于 05-15 09:29
    虞城县| 天祝| 洛南县| 周至县| 宝兴县| 华安县| 怀来县| 金门县| 青龙| 崇明县| 长春市| 普格县| 双城市| 寿光市| 新疆| 砚山县| 赤城县| 彭州市| 壶关县| 临颍县| 德清县| 芜湖市| 乡宁县| 噶尔县| 余干县| 札达县| 淅川县| 广昌县| 桐乡市| 那曲县| 红安县| 广宁县| 原阳县| 达拉特旗| 常山县| 广元市| 太和县| 隆林| 红桥区| 上蔡县| 赣州市|