999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

一種基于S3C6410的BootLoader的設計與實現

2016-11-09 01:11:41袁宗勝
計算機應用與軟件 2016年9期
關鍵詞:嵌入式設置系統

吳 磊 皮 智 袁宗勝

(北方工業大學計算機學院 北京 100144)

?

一種基于S3C6410的BootLoader的設計與實現

吳磊皮智袁宗勝

(北方工業大學計算機學院北京 100144)

引導加載程序(BootLoader)是嵌入式系統開發的關鍵技術之一,主要用于建立操作系統的運行環境。針對BootLoader嚴重依賴于硬件實現的問題,提出一種基于“NAND Flash+TFTP”存儲下載方式的BootLoader設計方法,并采用OK6410開發板對該BootLoader進行實驗驗證。實驗結果表明該BootLoader運行良好且穩定。該設計方法可以廣泛地應用到嵌入式系統和其他的處理器中。

引導加載程序嵌入式系統S3C6410

0 引 言

嵌入式系統是以應用為中心,以計算機技術為基礎,軟硬件可裁剪,適應于對功能、可靠性、成本、體積和功耗等嚴格要求的專用計算機系統[1]。在工業控制、智能儀器、醫療設備和機器人等方面得到廣泛的應用,而在嵌入式系統開發設計當中,尤為重要的就是引導加載程序的設計。

嵌入式系統從軟件操作方面分析,一般分為四個層次: 引導加載程序、系統內核、文件系統和應用程序。其中引導加載程序就是BootLoader,它是嵌入式系統開發的難點之一,同時也是嵌入式系統運行的一個基本前提,沒有這段與硬件緊密相連的代碼,再強大的內核也發揮不了作用[3]。

1 BootLoader開發環境介紹

1.1硬件結構簡介

本BootLoader硬件實驗環境采用飛凌公司的OK6410開發板,它采用了三星公司的ARM11處理器S3C6410。S3C6410是一款高性價比和低功耗的RSIC處理器,具備視頻圖像處理能力。并且能夠穩定地運行于667MHz的主頻以上,支持Mobile DDR和多種NAND Flash。OK6410開發板上集成了多種高端接口,如USB、SD卡、液晶屏和以太網等,主要硬件構成如圖1所示。

圖1 主要硬件構成

1.2BootLoader開發方法與工具

采用交叉開發模式,即程序的編寫和編譯在裝有Red Hat Enterprise Linux6.3的PC宿主機上完成,而交叉編譯產生的bin文件在OK6410目標板上運行。其中選用arm-linux-gcc-4.3.2工具鏈作為開發工具,它包括了編譯器、鏈接器和匯編器等開發工具[5-7],使用Makefile文件來管理整個工程,并選用JTAG進行下載并調試BootLoader,另外選用交叉網線來下載嵌入式linux內核映像文件(zImage),系統開發框圖如圖2所示。

圖2 系統開發框圖

2 BootLoader總體分析

2.1S3C6410啟動流程

S3C6410的啟動流程如圖3所示。

圖3 S3C6410啟動流程

S3C6410的啟動流程是IROM初始化,IROM中固化了軟件,稱為BootLoader0,是0階段的BootLoader,該BL0 執行初始化時鐘,D-TCM,設備特殊控制器,引導設備;加載BL1到Stepping Stone(墊腳石),將放在nandflash中的BootLoader1(即 BootLoader最前面的8K)拷貝到Stepping Stone中;執行BL1:BL1初始化系統時鐘,UART,SDRAM,Stepping Stone執行完8K BootLoader后,將剩余的BootLoader(BL2)拷貝到SDRAM中運行;執行BL2:跳轉到SDRAM中執行BL2,加載內核。

2.2BootLoader的總體設計

在嵌入式操作系統中,BootLoader運行在操作系統內核之前。主要可以初始化一些相關的硬件設備、建立內存空間的映射圖,將系統的軟硬件環境帶到一個合適狀態,為最終調用操作系統內核準備好正確的環境[2-4]。

BootLoader的啟動通??梢苑譃榈谝浑A段和第二階段,第一個階段主要包含依賴于CPU的系統結構,比如設備初始化代碼等,通常都用匯編語言來實現。第二階段通常用C語言來實現,以便實現更復雜的功能,也能使程序有更好的可讀性和可移植性,主要任務有一些相關硬件初始化,檢測系統的內存映射和加載linux內核等工作。BootLoader的總體設計流程如圖4所示。

圖4 BootLoader的總體設計流程圖

3 BootLoader第一階段設計

3.1核心初始化

核心初始化階段的任務主要包括異常向量表,設置svc模式,關閉看門狗,關閉中斷和外設基地址初始化。在ARM體系結構中,異常向量表放在上電后映射在從0x00000000開始的32個字節的連續物理地址上,它的作用是指定了各種異常處理程序的入口地址[2]。因為每個異常只對應4個字節,不能放下整個處理程序,用來跳轉到相應程序。具體代碼如下:

b reset

//復位異常向量,地址為0x00000000

ldr pc,_undefined_instruction

//未定義指令異常,跳轉至未定義異常服務程序

ldr pc,_software_interrupt

//軟中斷異常,跳轉至軟中斷異常服務程序

ldr pc,_prefetch_interrupt

//指令預取中止異常,跳轉至指令異常預取中止異常服務程序

ldr pc,_data_abort

//數據訪問中止異常,跳轉至數據訪問中止異常服務程序

ldr pc,_not_used

//保留,占用4個字節

ldr pc,_irq

//IRQ異常,跳轉至普通中斷服務程序

ldr pc,_fiq

//FIQ異常,跳轉至快速中斷異常服務程序

svc模式屬于特權模式,可以訪問一些受控資源,并且比sys模式還多了些自己模式下的影子寄存器。相對sys模式來說,可以訪問資源的能力相同,但是擁有更多的硬件資源。從BootLoader方面考慮,設置svv模式為了初始化系統相關硬件資源和獲取盡量多的權限。具體代碼如下:

set_svc:

//設置svc模式

mrs r0,cpsr

bic r0,r0,#0x1f

//清除低5位

orr r0,r0,#0xd3

//設置為svc模式,并且屏蔽irq和fiq中斷

msr cpsr,r0

mov pc,lr

//關閉看門狗

#define pwatchdog 0x7e004000

disable_watchdog:

ldr r0,=pwatchdog

//ldr這里是偽指令,將地址保存到r0中

mov r1,#0x0

str r1,[r0]

mov pc,lr

//關閉中斷,將以下2個地址全部置1

disable_interrupt:

mvn r1,#0x0

ldr r0,=0x71200014

str r1,[r0]

ldr r0,=0x71300014

str r1,[r0]

mov pc,lr

//關閉mmu和cache

disable_mmu:

mcr p15,0,r0,c7,c7,0

//使Icache和Dcache失效

mrc p15,0,r0,c1,c0,0

//關閉Icache,Dcache和mmu

bic r0,r0,#0x00000007

mcr p15,0,r0,c1,c0,0

mov pc,lr

//外設基地址初始化

set_peri_port:

ldr r0, =0x70000000

orr r0, r0, #0x13

mcr p15,0,r0,c15,c2,4

mov pc, lr

3.2點亮LED

點亮LED是為了調試代碼用。具體代碼如下:

#define GPMCON 0x7F008820

//這里的地址根據開發板硬件資源的不同而設置不同

#define GPMDAT 0x7F008824

light_led:

ldr r1,=GPMCON

//控制寄存器

ldr r0,=0x1111

str r0,[r1]

ldr r1,=GPMDAT

//數據寄存器

ldr r0,=0xe

//點亮一個led燈,觀察調試使用

str r0,[r1]

mov pc,lr

3.3時鐘初始化

S3C6410可以使用外部晶振和外部時鐘兩種方式輸入時鐘信號,默認的工作主頻為12 MHz(晶振頻率),S3C6410有三個PLL,分別為APLL、MPLL和EPLL。其中APLL產生ACLK,給ARM core使用。MPLL產生HCLK和PCLK。EPLL產生特殊的時鐘,比如為USB提供48MHz時鐘。時鐘初始化流程:(1)設置lock time(不需要設置,保持默認值即可);(2)設置分頻系數;(3)設置CPU到異步工作模式;(4)設置FCLK。具體代碼如下:

//設置分頻系數

#define CLK_DIV 0 0x7e00f020

#define DIV_VAL (0x1<<0)|(0x1<<9)|(0x1<<8)|(0x3<<12)

//設置為66MHz

clock_init:

ldr r0,=CLK_DIV0

ldr r1,= DIV_VAL

str r1,[r0]

mov pc,lr

//設置CPU為異步模式

//這里可以直接設置OTHERS寄存器來完成設置異步模式

#define OTHERS 0x7e00f900

ldr r0,=OTHERS

ldr r1,[r0]

bic r1,r1,#0xc0 //這里將第六位也設置為0的主要目的是當

//選擇為異步模式的時候,應選取MPLL的輸出

str r1,[r0]

//設置FCL

#define APLL_CON 0x7e00f00c

#define MPLL_CON 0x7e00f010

#define PLL_VAL ((1<<31)|(266<<16)|(3<<8)|(1<<0))

ldr r0,=APLL_CON

ldr r1,=PLL_VAL

str r1,[r0]

ldr r0,=MPLL_CON

ldr r1,=PLL_VAL

str r1,[r0]

//為了必須保證設置APLL和MPLL作為輸出,這里還需要設置

//CLK_SRC的低2位為1

#define CLK_SRC 0x7e00f01c

ldr r0,=CLK_SRC

mov r1,#0x3

str r1,[r0]

3.4內存初始化

S3C6410處理器擁有32位地址總線,其尋址空間為4 GB。其中高2 GB為保留區,低2 GB區域又可劃分為2部分:主存儲區和外設區。其地址空間和主存儲區如圖5所示。

圖5 地址空間和主存儲區

內存初始化的這一過程主要是指對 DRAM、FLASH 的存儲設備的地址范圍、數據寬度以及 DRAM 的刷新率進行設備,芯片不同,設置也不同[8-10]。

3.5將nandflash中的BootLoader復制至內存

OK6410開發板上電之后,會運行SROM中的BootLoader0(由三星公司出廠設置),由S3C6410啟動流程圖3可以看出,S3C6410的Stepping Stone(墊腳石)只有8 KB,由于8 KB容量太小,不足以完成第二階段的任務,因此需要借助這8 KB的BootLoader1將nandflash中的所有的BootLoader復制到內存運行。將nandflash中的BootLoader復制至內存的具體代碼如下:

copy_to_ram:

ldr r0,=0x0c000000

//起點

ldr r1,=0x50008000

//終點

add r3,r0,#1024*8

//復制8KB

copy_loop:

//循環復制至0x50008000

ldr r2,[r0],#4

str r2,[r1],#4

cmp r0,r3

bne copy_loop

mov pc,lr

3.6C語言環境初始化

OK6410的內存大小是256 MB,64 MB的內存對于一個精簡通用的BootLoader足夠使用,即設置堆棧寄存器(SP)的地址為0x50000000+64 MB = 0x54000000,棧初始化的代碼如下:

init_stack:

ldr sp,=0x54000000

mov pc,lr

BSS(Block Started by Symbol)通常是指用來存放程序的未初始化的全局變量和靜態變量的一塊內存區域。BSS段初始化就是給該段清零,方便以后使用BSS段的數據,當定義變量時,就會初始化該變量為零。具體代碼如下:

//初始化BSS段

clear_bss:

ldr r0,=bss_start

//BSS起始地址

ldr r1,=bss_end

//BSS終止地址

cmp r0,r1

moveq pc,lr

clean_loop:

//循環清除

mov r2,#0;

str r2,[r0],#4

cmp r0,r1

bne clean_loop

mov pc,lr

//跳轉至C代碼

從SRAM調到內存中,直接使用絕對跳轉方式。需要在myboot工程下面新建一個main.c文件,具體代碼如下:

int myboot_main()

//main函數

{

return 0;

}

修改匯編start.S和Makefile文件,在原start.S里面的reset下添加ldr pc,=mymain 用來跳轉至C語言環境,myboot_main是一個函數地址,在原Makefile文件的依賴文件里面添加main.o即可,通過在myboot_main中添加點亮LED的代碼,測試LED點亮,說明程序已經跳轉至myboot_main。

4 BootLoader第二階段設計

4.1MMU初始化

在BootLoader第一階段的設計中關閉了MMU,因此物理地址和虛擬地址是相等的,在Linux系統中不管是內核還是應用程序,都是使用的虛擬地址,而MMU的作用是自動進行虛擬地址到物理地址的轉化,需要找到一級頁表,而一級頁表的基地址保存在CP15的C2寄存器中。本BootLoader按照段式方式來進行映射,即一級頁表項中最后兩位為‘10’。段式方式轉換如圖6所示,由高12位的段基址和低20位的偏移地址組成。

圖6 段式方式轉換

MMU的初始化具體代碼如下:

void enable_mmu()

//使能MMU

void creat_page_table()

//創建頁表和內存映射

{

unsigned long* ttb = (unsigned long*)0x50000000;

//頁表存放在內存起始地址

unsigned long vaddr,paddr;

vaddr = 0xA0000000;

//虛擬地址

paddr = 0x7F000000;

//物理地址

*(ttb + (vaddr>>20)) = (paddr&0xfff00000) | (MMU_SECDESC);

vaddr = 0x50000000;

paddr = 0x50000000;

while(vaddr < 0x54000000) //內存映射64MB,地址范圍是

//(0x50000000-0x54000000)

{

*(ttb + (vaddr>>20)) = (paddr&0xfff00000) | (MMU_SECDESC_WB);

vaddr += 0x100000;

paddr += 0x100000;

}

}

由于MMU初始化后,對應需要修改LED的控制寄存器和數據寄存器的地址,具體代碼如下:

#define GPKCON (volatile unsigned long*)0xA0008820

//使用的虛擬地址

#define GPKDAT (volatile unsigned long*)0xA0008824

//使用的虛擬地址

*(GPKCON) = 0x1111;

*(GPKDAT) = 0xe;

通過觀察LED來驗證MMU初始化的代碼。如果LED能亮起來,說明MMU這部分代碼沒有問題;否則,MMU不起作用。

4.2相關硬件初始化

在BootLoader第一階段中,ARM設置在svc的模式下,如果在相關硬件初始化的過程中需要用到中斷的時候,須將ARM設置為irq模式,因此需要重新設置堆棧。具體代碼如下:

//設置堆棧

init_stack:

msr cpsr_c, #0xd2

ldr sp, =0x53000000

//初始化r13_irq 中斷響應的地址

msr cpsr_c, #0xd3

ldr sp, =0x54000000

//初始化r13_svc

mov pc,lr

針對硬件資源不同的開發板,針對性地做一些硬件的初始化,這里主要包括以下幾點。

(1) 串口控制臺建立,在本BootLoader中,需要用戶自己手動在串口控制臺輸入選擇項來下載Linux內核,通過串口來交互,移植printf和scanf函數等。

(2) DMA解決了CPU每次從內存當中拷貝很大的數據到串口,提高CPU的效率,可以初始化DMA。

(3) 硬件資源還包括有LCD(OK6410用的TFT液晶屏)和觸摸屏(OK6410用的電阻屏),根據不同的硬件資源做一些適當的修改。

4.3網卡搭建

根據硬件資源的不同,初始化DM9000的代碼也有所不同,本BootLoader需要通過交叉網線來下載Linux內核,通過ARP協議的實現來測試DM9000是否正常工作。

聲明以太網包和ARP包的結構體代碼如下:

typedef struct eth_hdr

//以太網包

{

u8 d_mac[6];

//目的MAC地址

u8 s_mac[6];

//源MAC地址

u16 type;

//類型

}ETH_HDR;

typedef struct arp_hdr

//ARP包

{

ETH_HDR ethhdr;

//以太網包

u16 hwtype;

//硬件類型

u16 protocol;

//協議類型

u8 hwlen;

//硬件地址長度

u8 protolen;

//協議地址長度

u16 opcode;

//OP=1 表示ARP請求 OP=2 表示ARP應答

u8 smac[6];

//發送端以太網地址

u8 sipaddr[4];

//發送端IP地址

u8 dmac[6];

//目的以太網地址

u8 dipaddr[4];

//目的IP地址

}ARP_HDR;

主要的函數有2個如下:

void arp_request(); //發送ARP請求包,注意網絡中的字節序問

//題,網絡字節序是大端傳輸

u8 arp_process(u8 *buf, u32 len);

//解析ARP應答包,提取MAC地址

測試網卡的搭建如下,開發板OK6410通過向宿主機發送ARP請求,宿主機回復一個ARP應答包,開發板即能知道宿主機的MAC地址,流程如圖7所示。

圖7 ARP通信流程

開發板OK6410的IP地址設置為10.5.114.107,MAC地址設置為09:08:07:06:05:04,宿主機的IP地址和物理地址通過ifconfig命令可以查看如圖8所示:IP地址為10.5.114.109,MAC地址為00:0C:29:45:FC:6A。

圖8 宿主機PC的IP地址和MAC地址

實驗下載該BootLoader,從nandflash啟動,OK6410循環發送ARP請求,顯示數據如圖9所示:MAC地址的顯示和圖7中SecureCRT打印的結果一致,實驗說明OK6410開發板可以正確獲取到宿主機的MAC地址。

圖9 SecureCRT串口顯示宿主機PC的IP和MAC

通過Wireshark抓包如圖10所示:Wireshark正確抓到ARP的包正確,說明OK6410能正確獲取到宿主機PC的MAC地址,驗證了網卡搭建的正確性。

圖10 Wireshark抓取的ARP包

4.4移植TFTP客戶端

通過TFTP客戶端下載linux內核至開發板OK6410,在開發板下載之前發送一個ARP請求來獲取宿主機PC的MAC地址。TFTP的通信流程如圖11所示。

圖11 TFTP通信流程

聲明IP報文、UDP包以及TFTP包的結構體代碼如下:

typedef struct ip_hdr

//IP報文

{

ETH_HDR ethhdr;

//以太網包

u8 vhl;

//版本和首部長度

u8 tos;

//服務級別

u16 len;

//報文長度

u16 ipid;

//標識

u16 ipoffset;

//片位移

u8 ttl;

//生存時間

u8 proto;

//上一層協議類型

u16 ipchksum;

//校驗和

u8 srcipaddr[4];

//源IP地址

u8 destipaddr[4];

//目的IP地址

}IP_HDR;

typedef struct udp_hdr

//UDP包

{

IP_HDR iphdr;

//IP報文

u16 sport;

//源端口號

u16 dport;

//目的端口號

u16 len;

//長度

u16 udpchksum;

//校驗和

}UDP_HDR;

typedef struct tftp_package

{

u16 opcode;

//操作碼

u16 blocknum;

//塊編號

u8 data[0];

//數據

}TFTP_PAK;

主要的函數有:

void tftp_send_request(const char *filename);

//用來發送TFTP請求

void tftp_send_ack(u16 blocknum);

//用來發送TFTP ACK

void tftp_process(u8 *buf, u32 len, u16 port);

//處理TFTP請求

TFTP測試結果如下:在Linux宿主機上面配置好TFTP服務器,OK6410開發板通過交叉網線下載zImage(zImage存放在linux宿主機上面配置好的TFTP服務器的目錄下)文件,SecureCRT串口顯示如圖12所示和 Wireshark抓包如圖13所示。

圖12 SecureCRT串口顯示TFTP下載完成

圖13 Wireshark抓取的TFTP包

通過SecureCRT串口顯示和wireshark抓包顯示可以看出OK6410開發板能正確發送TFTP請求,并且能正確解析和下載zImage文件,實驗說明OK6410的TFTP客戶端正確將Linux內核下載至nandflash。

4.5移植bootm命令

TFTP客戶端下載完Linux內核后,需要啟動該內核,實現一個命令來啟動該Linux內核。這個bootm命令用于啟動一個操作系統映像。它會從映像文件的頭部取得一些信息,這些信息包括:映像文件的基于的CPU架構、其操作系統類型、映像的類型、壓縮方式、映像文件在內存中的加載地址、映像文件運行的入口地址、映像文件名等。緊接著bootm將映像加載到指定的地址,跳轉至入口地址進入Linux內核。主要的函數實現如下:

#define SDRAM_KERNEL_START 0x51000000 //linux內核起始地址

theKernel = (void (*)(int, int, unsigned int ))SDRAM_KERNEL_START;

//指向起始地址

void boot_linux();

//用來處理啟動linux內核,這一過程需要設計

//啟動參數,包括核心啟動參數,內存參數,命令行參數和結束標志等

setup_core_tag();

//設置核心啟動參數

setup_mem_tag();

//設置內存參數

setup_cmdline_tag();

//設置命令行參數

setup_end_tag();

//設置結束標志

4.6BootLoader測試

燒寫BootLoader,然后從nandflash啟動,TFTP客戶端下載完Linux內核后,通過SecureCRT串口輸入數字3,即可正確引導Linux內核和根文件系統。實驗效果如圖14、圖15和圖16所示。

圖14 SecureCRT串口顯示完成加載Linux

圖15 SecureCRT串口顯示獲取MAC和TFTP下載正常

圖16 SecureCRT串口顯示正在啟動Linux內核

通過圖14、圖15和圖16顯示,實驗結果說明該BootLoader能正確引導Linux內核和根文件系統,并且運行穩定,為后續的嵌入式系統開發奠定了基礎。

5 結 語

BootLoader是嚴重依賴于硬件而實現的,每種不同體系結構的處理器都有不同的BootLoader,因此BootLoader的設計在嵌入式系統開發中非常關鍵,如何設計出一個比較通用的BootLoader更是困難。本文提出了一種基于“NAND Flash+TFTP”存儲下載方式的BootLoader設計方法,實驗結果表明該BootLoader運行穩定,只需要根據硬件資源的不同,稍作一些代碼上的修改,即可移植至嵌入式系統和其他的處理器中。同時該設計方法為BootLoader系統設計提供了實用價值。

[1] 鄭靈翔. 嵌入式系統設計與應用開發[M]. 北京: 北京航空航天大學出版社, 2006:201-219.

[2] 孫瓊. 嵌入式Linux應用程序開發詳解[M]. 北京:人民郵電出版社,2006:172-175.

[3] 田會峰. 基于S3C2440的BootLoader設計與實現[J]. 自動化技術與應用, 2010,29(7):29-32.

[4] 杜春雷. ARM體系結構與編程[M]. 北京:清華大學出版社, 2003:22-223.

[5] 袁磊,朱怡安,蘭婧. 嵌入式系統BootLoader設計與實現[J]. 計算機測量與控制,2009,17(2):389-391.

[6] 張群忠,沈建華. ARM&Linux嵌入式系統BootLoader的研究與設計[J]. 計算機應用與軟件,2006,23(12):97-99.

[6] 葉茂,李智,任和. Cortex-A8的Bootloader設計與實現[J].單片機與嵌入式系統應用,2015,2(1):17-20.

[7] 馮林琳,耿恒山. 基于S3C6410的Uboot分析與移植[J]. 計算機與現代化,2013,3(1):119-121.

[9] 梁超,楊峰,雷鳴,等. U-Boot SD卡啟動方式的移植分析與功能擴展[J]. 現代電子技術,2013,36(20):84-86,90.

[10] 吳偉,周延周. 基于S3C2440的嵌入式系統小型U-Boot的研究[J]. 廣東工業大學學報,2014,31(4):85-89.

DESIGN AND REALISATION OF AN S3C6410-BASED BOOTLOADER

Wu LeiPi ZhiYuan Zongsheng

(College of Computer, North China University of Technology, Beijing 100144, China)

BootLoader is one of the key technologies in embedded system development, and is mainly used for establishing operating system environment. To address the problem of BootLoader in seriously relying on the hardware implementation, in this paper we propose a BootLoader design method which is based on “NAND Flash+TFTP” storage download mode, and verify this BootLoader by an experiment with OK6410 development board. Experimental result shows that the newly designed BootLoader operates good and stably. The design method can be widely applied to embedded system and other processors.

BootLoaderEmbedded systemS3C6410

2015-06-08。北京市自然科學基金項目(4131001);中央支持地方專項(PXM2014_014212_000097);北京市屬高等學校創新團隊建設與教師職業發展計劃項目(IDHT20130502);北京市自然科學基金項目(4132026)。吳磊,副教授,主研領域:嵌入式技術,無線通信。皮智,碩士生。袁宗勝,碩士生。

TP311.52

A

10.3969/j.issn.1000-386x.2016.09.057

猜你喜歡
嵌入式設置系統
Smartflower POP 一體式光伏系統
工業設計(2022年8期)2022-09-09 07:43:20
中隊崗位該如何設置
少先隊活動(2021年4期)2021-07-23 01:46:22
WJ-700無人機系統
ZC系列無人機遙感系統
北京測繪(2020年12期)2020-12-29 01:33:58
搭建基于Qt的嵌入式開發平臺
連通與提升系統的最后一塊拼圖 Audiolab 傲立 M-DAC mini
嵌入式軟PLC在電鍍生產流程控制系統中的應用
電鍍與環保(2016年3期)2017-01-20 08:15:32
本刊欄目設置說明
中俄臨床醫學專業課程設置的比較與思考
Altera加入嵌入式視覺聯盟
主站蜘蛛池模板: 国产精品香蕉在线| 999精品色在线观看| 欧美日韩精品一区二区在线线| 久久精品娱乐亚洲领先| 欧美精品另类| 欧美日本中文| 97久久超碰极品视觉盛宴| 日韩精品无码一级毛片免费| а∨天堂一区中文字幕| 三上悠亚在线精品二区| 老色鬼久久亚洲AV综合| 国产精品福利导航| 国产91透明丝袜美腿在线| 亚洲 欧美 偷自乱 图片| 永久免费无码成人网站| 国产偷国产偷在线高清| 99性视频| 成人亚洲视频| 国产亚洲精品97在线观看| 欧美成a人片在线观看| 国产va免费精品观看| 欧美国产中文| 99久久精品国产麻豆婷婷| 欧美午夜小视频| 色综合中文| 欧美国产日产一区二区| 婷婷六月色| 91麻豆国产精品91久久久| 亚洲青涩在线| 凹凸精品免费精品视频| 婷婷色在线视频| 996免费视频国产在线播放| 91破解版在线亚洲| 国产91全国探花系列在线播放| 亚洲成人播放| 老司机久久99久久精品播放| 91免费国产在线观看尤物| 亚洲美女久久| a毛片免费在线观看| 亚洲一区二区黄色| 精品欧美视频| 亚洲成在人线av品善网好看| 亚洲 成人国产| 国产99精品久久| 国产91在线|中文| 日韩毛片在线播放| 久久亚洲高清国产| 无码精品国产dvd在线观看9久| 欧美一级一级做性视频| 国产资源站| 中文成人在线视频| 国产毛片网站| 午夜视频免费试看| 午夜日韩久久影院| 四虎精品国产AV二区| 成人免费午夜视频| 国产一级视频久久| 狠狠操夜夜爽| 无码一区18禁| 中文字幕欧美成人免费| 欧美日本激情| 精品欧美一区二区三区久久久| 国产18在线| 久久综合亚洲色一区二区三区| 尤物视频一区| 国产精品男人的天堂| 激情五月婷婷综合网| 国产午夜一级毛片| 91精品人妻一区二区| 国内精品自在欧美一区| 欧美a在线看| 国产91蝌蚪窝| 青青草原国产一区二区| 欧美综合一区二区三区| 国产第二十一页| 国产在线观看一区二区三区| 免费一级α片在线观看| 亚洲无码高清免费视频亚洲| 在线日韩日本国产亚洲| 一区二区三区在线不卡免费| 免费在线色| 亚洲自拍另类|