




已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
開放性實(shí)驗(yàn)報(bào)告題 目: 基于ARM的多線程應(yīng)用程序設(shè)計(jì) 院系名稱: 電氣工程學(xué)院 專業(yè)班級(jí): 自動(dòng)1302 學(xué)生姓名: 張鵬濤 學(xué) 號(hào): 201323020219 指導(dǎo)教師: 張曉東 成績:指導(dǎo)老師簽名: 日期:2017.1.6 目 錄1 系統(tǒng)概述與設(shè)計(jì)要求11.1 系統(tǒng)概述11.2 設(shè)計(jì)要求22 方案論證22.1 實(shí)現(xiàn)方法22.2 線程優(yōu)勢(shì)23 硬件設(shè)計(jì)33.1 樹莓派接口驅(qū)動(dòng)LED電路設(shè)計(jì)34 軟件設(shè)計(jì)44.1 驅(qū)動(dòng)三色LED燈44.1.1 驅(qū)動(dòng)實(shí)現(xiàn)方法44.1.2 wiringPi庫安裝和軟件編程44.2 服務(wù)器和客戶端54.2.1 服務(wù)器設(shè)計(jì)方法54.2.2 客戶端設(shè)計(jì)方法55 系統(tǒng)調(diào)試6設(shè)計(jì)心得6參考文獻(xiàn)7附錄1(LED驅(qū)動(dòng)程序)8附錄2(服務(wù)器程序)10附錄3(客戶端程序代碼)161 系統(tǒng)概述與設(shè)計(jì)要求1.1 系統(tǒng)概述 本系統(tǒng)設(shè)計(jì)是基于樹莓派開發(fā)板上實(shí)現(xiàn)的,樹莓派由注冊(cè)于英國的慈善組織“Raspberry Pi 基金會(huì)”開發(fā),EbenUpton/埃厄普頓為項(xiàng)目帶頭人。2012年3月,英國劍橋大學(xué)埃本阿普頓(Eben Epton)正式發(fā)售世界上最小的臺(tái)式機(jī),又稱卡片式電腦,外形只有信用卡大小,卻具有電腦的所有基本功能,這就是Raspberry Pi電腦板,中文譯名樹莓派。它是一款基于ARM的微型電腦主板,以SD/MicroSD卡為內(nèi)存硬盤,卡片主板周圍有1/2/4個(gè)USB接口和一個(gè)10/100 以太網(wǎng)接口(A型沒有網(wǎng)口),可連接鍵盤、鼠標(biāo)和網(wǎng)線,同時(shí)擁有視頻模擬信號(hào)的電視輸出接口和HDMI高清視頻輸出接口,以上部件全部整合在一張僅比信用卡稍大的主板上,具備所有PC的基本功能。而樹莓派2具有900MHz內(nèi)核頻率, 4核 ARM Cortex-A7,1GB 內(nèi)存,帶Micro SD 卡插槽(支持通過它啟動(dòng) Linux 操作系統(tǒng),如 Fedora),40PIN接口(可以增加驅(qū)動(dòng)外設(shè))。本系統(tǒng)設(shè)計(jì)正式在樹莓派2環(huán)境下開發(fā)實(shí)現(xiàn)多線程設(shè)計(jì),設(shè)計(jì)的主要功能就是兩個(gè)客戶端通過服務(wù)器互相收發(fā)信息。1.2 設(shè)計(jì)要求 要求多個(gè)客戶端能夠同時(shí)連接服務(wù)器,而服務(wù)器需要?jiǎng)?chuàng)建線程來管理這多個(gè)客戶端,并且能夠把一個(gè)客戶端發(fā)來的數(shù)據(jù)進(jìn)行解析,發(fā)給另一個(gè)客戶端,實(shí)現(xiàn)兩個(gè)甚至多個(gè)客戶端互相收發(fā)信息。能夠通過驅(qū)動(dòng)三色燈來發(fā)現(xiàn)系統(tǒng)運(yùn)行的狀態(tài),紅色說明有錯(cuò)誤發(fā)生,綠色說明正在正常運(yùn)行,藍(lán)色說明有用戶連接,綠色說明有客戶端互相收發(fā)信息。2 方案論證2.1 實(shí)現(xiàn)方法 要實(shí)現(xiàn)服務(wù)器同時(shí)管理兩個(gè)甚至多個(gè)客戶端,就必須引入進(jìn)程或線程。2.2 線程優(yōu)勢(shì) 一是和進(jìn)程相比,它是一種非常節(jié)儉的多任務(wù)操作方式。 進(jìn)程是系統(tǒng)中程序執(zhí)行和資源分配的基本單位。我們知道,在Linux系統(tǒng)下,啟動(dòng)一個(gè)新的進(jìn)程必須分配給它獨(dú)立的地址空間,建立眾多的數(shù)據(jù)表來維護(hù)它的代碼段、堆棧段和數(shù)據(jù)段,這就導(dǎo)致了進(jìn)程在進(jìn)行切換等操作起到了現(xiàn)場(chǎng)保護(hù)作用, 這是一種昂貴的多任務(wù)工作方式。 但是為了進(jìn)一步減少處理機(jī)的空轉(zhuǎn)時(shí)間支持多處理器和減少上下文切換開銷,進(jìn)程演化中出現(xiàn)了另外一個(gè)概念,這就是線程,也被人稱為輕量級(jí)的進(jìn)程。它是一個(gè)進(jìn)程內(nèi)的基本調(diào)度單位。線程是在共享的內(nèi)存空間中并發(fā)的多道執(zhí)行路徑,它們共享一個(gè)進(jìn)程的資源,比如文件描述符和信號(hào)處理等。因此,大大減少了上下文切換的開銷。 二是線程間方便的通信機(jī)制。 對(duì)不同進(jìn)程來說,它們具有獨(dú)立的數(shù)據(jù)空間,要進(jìn)行數(shù)據(jù)的傳遞只能通過通信的方式進(jìn)行,這種方式不僅費(fèi)時(shí),而且很不方便。線程則不然,由于同一進(jìn)程下的線程之間共享數(shù)據(jù)空間,所以一個(gè)線程的數(shù)據(jù)可以直接為其它線程所用,這不僅快捷,而且方便。當(dāng)然,數(shù)據(jù)的共享也帶來其他一些問題,有的變量不能同時(shí)被兩個(gè)線程所修改,有的子程序中聲明為static的數(shù)據(jù)更有可能給多線程程序帶來災(zāi)難性的打擊,這些正是編寫多線程程序時(shí)最需要注意的地方。3 硬件設(shè)計(jì)3.1 樹莓派接口驅(qū)動(dòng)LED電路設(shè)計(jì)圖 3.1 從圖3.1可以知道,要想讓三色燈的紅色亮起來,首先控制樹莓派GPIO.27引腳輸出低電平,同理可以控制GPIO.28、GPIO29引腳電瓶來控制綠、藍(lán)LED的啟動(dòng)和關(guān)閉。樹莓派開發(fā)板上的相關(guān)引腳如圖3.2。圖 3.24 軟件設(shè)計(jì)4.1 驅(qū)動(dòng)三色LED燈4.1.1 驅(qū)動(dòng)實(shí)現(xiàn)方法 控制引腳電瓶的高低就能實(shí)現(xiàn)控制LED燈的變化,實(shí)際上三色LED可以顯示無數(shù)種顏色,要想超過三種顏色的顯示實(shí)現(xiàn),就必須引入PWM。PWM是模擬脈寬調(diào)制來控制輸出引腳的實(shí)際輸出電瓶大小,此系統(tǒng)可以控制引腳從03.3V變化來顯示不同的顏色。wiringPi適合那些具有C語言基礎(chǔ),在接觸樹莓派之前已經(jīng)接觸過單片機(jī)或者嵌入式開發(fā)的人群。wiringPi的API函數(shù)和arduino非常相似,這也使得它廣受歡迎。作者給出了大量的說明和示例代碼,這些示例代碼也包括UART設(shè)備,I2C設(shè)備和SPI設(shè)備等。4.1.2 wiringPi庫安裝和軟件編程 首先需要在樹莓派上安裝wiringPi庫,我們選擇直接在網(wǎng)上下載安裝源碼,輸入命令:cd 進(jìn)入根目錄下,輸入命令:git clone git://wiringPi 從網(wǎng)上下載源碼包,輸入命令cd wiringPi 進(jìn)入安裝包目錄下,依次輸入命令:configure make make install來配置、編譯和安裝,最后輸入命令sudo ./build 來執(zhí)行編譯之后生成的可執(zhí)行文件,完成安裝。最后輸入命令:gpio readall會(huì)出來引腳圖來確定已經(jīng)安裝成功。 接下來就需要運(yùn)用庫的軟件編程來驅(qū)動(dòng)led燈啦,在寫C文件時(shí)首先要加入庫的頭文件:#include 和C語言必要的頭文件:#include ,然后還需要加入實(shí)現(xiàn)軟件PWM的頭文件:#include 。接下來我們就需要運(yùn)用庫的API函數(shù)wiringPiSetup()初始化wiringPi,若初始化失敗會(huì)返回-1;然后運(yùn)用庫的API函數(shù)softPwmCreate()創(chuàng)建軟件PWM,此函數(shù)有3個(gè)輸入?yún)?shù),分別是控制引腳號(hào),PWM最小值,PWM最大值;運(yùn)用庫的API函數(shù)softPwmWrite()寫PWM的值,此函數(shù)有2個(gè)輸入?yún)?shù),分別是控制那個(gè)引腳號(hào),寫入的PWM的值,此值需要在最小最大值之間。 完整代碼如附錄1。4.2 服務(wù)器和客戶端4.2.1 服務(wù)器設(shè)計(jì)方法 為了方便起見,我們把服務(wù)器和客戶端都定義在本地IP上進(jìn)行測(cè)試,服務(wù)器端的話,首先我們需要把主函數(shù)傳入的端口號(hào)記錄下來,并且利用C語言標(biāo)準(zhǔn)函數(shù)atoi轉(zhuǎn)換成整型值。接著我們定義兩個(gè)整型數(shù)組來存放兩個(gè)客戶端的套接字,然后我們根據(jù)端口去創(chuàng)建服務(wù)器,創(chuàng)建服務(wù)器需要幾個(gè)函數(shù)來實(shí)現(xiàn),第一個(gè)就是socket()函數(shù)來創(chuàng)建一個(gè)服務(wù)器的套接字,此函數(shù)有3個(gè)輸入?yún)?shù),我們選擇ipv4協(xié)議族,流式Socket,TCP協(xié)議類型。然后根據(jù)端口號(hào)和本地IP配置服務(wù)器,之后就是調(diào)用綁定bind(),監(jiān)聽listen()函數(shù)來完成服務(wù)器的創(chuàng)建。之后就是根據(jù)創(chuàng)建的套接字來進(jìn)行循環(huán),如果有客戶端連接,就保存客戶端套接字創(chuàng)建一個(gè)線程去處理,此處我們以兩個(gè)客戶端為例來進(jìn)行操作。若是套接字編號(hào)0發(fā)來消息,我們就轉(zhuǎn)發(fā)給套接字編號(hào)1,若是超過2個(gè)的客戶端連接進(jìn)來我們直接關(guān)閉創(chuàng)建的線程就行,之后要是有客戶端掉線,就把線程和客戶端一塊銷毀。 具體代碼實(shí)現(xiàn)見附錄24.2.2 客戶端設(shè)計(jì)方法 首先我們封裝三個(gè)函數(shù),分別是連接、讀數(shù)據(jù)、寫數(shù)據(jù),開始就調(diào)用連接函數(shù),在連接函數(shù)里我們創(chuàng)建客戶端并通過輸入的服務(wù)器ip和端口去連接服務(wù)器,然后我們創(chuàng)建兩個(gè)線程分別是讀和寫,在讀函數(shù)里我們不間斷讀鍵盤數(shù)據(jù)并發(fā)送給服務(wù)器,在寫函數(shù)里不間斷的讀服務(wù)器發(fā)來的數(shù)據(jù)并顯示在屏幕上。 具體代碼實(shí)現(xiàn)見附錄3。5 系統(tǒng)調(diào)試 此系統(tǒng)的調(diào)試,我們選擇Linux虛擬機(jī)模擬調(diào)試,首先運(yùn)行服務(wù)器和兩個(gè)客戶端,然后客戶端連接服務(wù)器,之后兩個(gè)客戶端互相收發(fā)數(shù)據(jù)。為了方便起見,我在PC機(jī)上運(yùn)行和仿真,首先安裝虛擬機(jī)VMware8.0,然后安裝VMware Tools,虛擬機(jī)的工具是為了共享電腦上的文件,這樣可以在電腦上編寫代碼,在虛擬機(jī)上編譯運(yùn)行。 編譯服務(wù)器的代碼,輸入命令gcc server.c -o server.exe -lpthread,回車之后會(huì)生成server.exe可執(zhí)行文件,之后我們運(yùn)行服務(wù)器,輸入命令./server.exe 6789,運(yùn)行服務(wù)器,其中6789為輸入的端口號(hào)。之后編譯客戶端代碼,輸入命令gcc client.c -o client.exe -lpthread,回車之后會(huì)生成client.exe可執(zhí)行文件,我們事先查看虛擬機(jī)ip,輸入命令ifconfig回車就能看到虛擬機(jī)本機(jī)ip,為我們客戶端連接服務(wù)器所用。之后我們運(yùn)行客戶端一,輸入命令./client.exe 09 6789,回車,然后用同樣的命令運(yùn)行客戶端二,之后我們?cè)谝粋€(gè)客戶端輸入信息回車,在另一個(gè)客戶端就能接收到,具體運(yùn)行結(jié)果如圖5.1,5.2,5.3。圖 5.1圖5.2圖5.3設(shè)計(jì)心得 此次開發(fā)性試驗(yàn)設(shè)計(jì)讓我收獲甚多。一是要有一個(gè)積極的心態(tài),獨(dú)立解決問題的意識(shí),培養(yǎng)扎實(shí)基礎(chǔ)的認(rèn)識(shí)。不要什么東西都感覺跟簡單(很多東西可能是看似簡單)就不去做了或者不屑一做,以至于性網(wǎng)上搜搜就可以了,這樣很不好。有自己的東西有自己的付出才會(huì)有程序運(yùn)行成功時(shí)的喜悅和小自豪,這樣也有助于培養(yǎng)自己的興趣。要時(shí)刻牢記態(tài)度決定一切。其次是興趣,感覺學(xué)習(xí)工作中興趣很關(guān)鍵,只是一個(gè)引發(fā)人積極性的問題,有了興趣就自覺了,效率自然就高了。再次要敢于嘗試和挑戰(zhàn)。不要安于現(xiàn)成的程序,而且不要害怕失敗,在程序調(diào)試的過程中這點(diǎn)尤為重要,“發(fā)現(xiàn)出問題然后解決問題”是一個(gè)積累經(jīng)驗(yàn)的過程,而且很高效。最后要不懈追求。對(duì)于源代碼進(jìn)行不斷的完善,要盡可能的實(shí)現(xiàn)課題所要求的功能。對(duì)于初學(xué)者或者開發(fā)較少的人來說,大量大寫程序還是有必要的,但同時(shí)要注意思考,理解其實(shí)現(xiàn)的內(nèi)在意義。還可以自己添加一些有意義的功能來實(shí)現(xiàn)。當(dāng)看到自己編寫的程序正常運(yùn)行時(shí),興趣也會(huì)隨之而來,樂此不疲,形成一個(gè)良性循環(huán)。 短短一周的開放性ARM多線程設(shè)計(jì)很快結(jié)束了,我發(fā)現(xiàn)我對(duì)嵌入式這個(gè)方向、對(duì)嵌入式技術(shù)、對(duì)Linux都有了新的認(rèn)識(shí)。通過這次的編程,我了解到,要真真正正的掌握計(jì)算機(jī)程序還不是一件簡單容易的事兒,但真正掌握后,它帶給我們的將是無窮的便捷與科技,我喜歡高端便捷的生活。我希望我能做計(jì)算機(jī)這個(gè)萬能機(jī)器人的主人而不是奴隸,我會(huì)努力加油的!參考文獻(xiàn)1徐千洋.LinuxC函數(shù)庫參考手冊(cè).M中國青年出版社.20022馬忠梅,馬廣云,徐英慧,田譯.ARM嵌入式處理結(jié)構(gòu)與應(yīng)用基礎(chǔ)M.北京航空航天大學(xué)出版社.20023鄒思鐵.嵌入式Linux設(shè)計(jì)與應(yīng)用M.北京清華大學(xué)出版社.20024杜春雷.ARM體系結(jié)構(gòu)與編程M.清華大學(xué)出版社.20035田澤.嵌入式系統(tǒng)開發(fā)與應(yīng)用M.北京航空航天大學(xué)出版社.200511陳鑫.嵌入式軟件技術(shù)的現(xiàn)狀與發(fā)展動(dòng)向M.軟件世界.20016田澤.嵌入式系統(tǒng)開發(fā)與應(yīng)用實(shí)驗(yàn)教程M.北京航空航天大學(xué)出版社.20047AlessandroRubini,JonathanCorbet.Linux設(shè)備驅(qū)動(dòng)程序M.中國電力出版社.2002附錄1(LED驅(qū)動(dòng)程序)#include #include #include #define uchar unsigned char#define LedPinRed 27#define LedPinGreen 28#define LedPinBlue 29void ledInit(void) softPwmCreate(LedPinRed, 0, 100); softPwmCreate(LedPinGreen,0, 100); softPwmCreate(LedPinBlue, 0, 100);void ledColorSet(uchar r_val, uchar g_val, uchar b_val) softPwmWrite(LedPinRed, r_val); softPwmWrite(LedPinGreen, g_val); softPwmWrite(LedPinBlue, b_val);int main(void) int i; if(wiringPiSetup() = -1) printf(setup wiringPi failed !); return 1; ledInit(); while(1) ledColorSet(0xff,0x00,0x00); /red delay(500); ledColorSet(0x00,0xff,0x00); /green delay(500); ledColorSet(0x00,0x00,0xff); /blue delay(500); return 0;附錄2(服務(wù)器程序)#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define BUFSIZE 1024 int socket_client2; int socket_create(int port) int st = socket(AF_INET, SOCK_STREAM, 0); int on = 1; if (setsockopt(st, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) = -1) printf(setsockopt is failed %sn, strerror(errno); return 0; struct sockaddr_in addr; memset(&addr, 0, sizeof(addr); addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(st, (struct sockaddr *) &addr, sizeof(addr) = -1) printf(zhang.pt:bind is failed %sn, strerror(errno); return 0; if (listen(st, 300) = -1) printf(zhang.pt:listen is failed %sn, strerror(errno); return 0; return st; void deliver(int index, const char *buf, ssize_t len) ssize_t rc = 0; if(index = 0) if (socket_client1 = 0) printf(%d:user not onlinen, index); else rc = send(socket_client1, buf, len, 0); printf(send:%s,send:%u bytesn, buf, rc); if (rc = 0) if (rc = 0) printf(zhang.pt:send failed, disconnection,n); else printf(zhang.pt:send failed, %sn, strerror(errno); if(index = 1) if(socket_client0 = 0) printf(%d:user not onlinen, index); else rc = send(socket_client0, buf, len, 0); printf(send:%s,send:%u bytesn, buf, rc); if(rc = 0) if (rc = 0) printf(zhang.pt:send failed, disconnection,n); else printf(zhang.pt:send failed, %sn, strerror(errno); void socket_work(int index) char bufBUFSIZE; ssize_t rc = 0; while(1) memset(buf, 0, sizeof(buf); rc = recv(socket_clientindex, buf, sizeof(buf), 0); if (rc sin_addr.s_addr); sprintf(IPAddr, %u.%u.%u.%u, p0, p1, p2, p3); void socket_accept(int st) pthread_t thr_d; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); struct sockaddr_in client_addr; socklen_t len = sizeof(client_addr); while(1) memset(&client_addr, 0, sizeof(client_addr); int client_st = accept(st, (void *)&client_addr, &len); if(client_st = -1) printf(zhang.pt:accept failed %sn, strerror(errno); break; else char sIP32; memset(sIP, 0, sizeof(sIP); sockaddr_toa(&client_addr, sIP); printf(zhang.pt:accept by %sn, sIP); int *tmp = malloc(sizeof(int); *tmp = client_st; pthread_create(&thr_d, &attr, socket_handle, tmp); pthread_attr_destroy(&attr); int main(int arg, char *args) if(arg 2) printf(zhang.pt:server port error!n); return 0; int iport = atoi(args1); if(iport = 0) printf(zhang.pt:port %d is invalid!n, iport); return 0; printf(zhang.pt:server is begin*v*!n); memset(socket_client, 0, sizeof(socket_client); int st = socket_create(iport); if(st = 0) return 0; socket_accept(st); close(st); printf(zhang.pt:server is endn); return 0; 附錄3(客戶端程序代碼)#include #include #include #include #include #include #include #include #include #define BUFSIZE 1024 void *socket_read(void *arg) int st = *(int *)arg; char bufBUFSIZE; while(1) memset(buf, 0, sizeof(buf); ssize_t rc = recv(st, buf, sizeof(buf), 0); if(rc = 0) printf(zhang.pt:recv failed, %sn, strerror(errno); break; else printf(zhang.pt:recv:%s,recv:%u byten, buf, rc); return NULL; void *socket_write(void *arg) int st = *(int *)arg; char bufBUFSIZE; while(1) memset(buf, 0, sizeof(buf); read(STDIN_FILENO, buf, sizeof(buf); int ilen = strlen(buf); if(bufilen - 1 = n) bufilen - 1 = 0; ssize_t rc = send(st, buf, sizeof(buf), 0); printf(zhang.pt:send:%s,send:%u byten, buf, rc); if(rc = 0) printf(zhang.pt:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 食品添加劑安全性評(píng)估與合理使用在調(diào)味品行業(yè)的應(yīng)用報(bào)告
- 小學(xué)教育信息化建設(shè)反思試題及答案
- 教育園區(qū)建設(shè)對(duì)2025年社會(huì)穩(wěn)定風(fēng)險(xiǎn)評(píng)估與風(fēng)險(xiǎn)監(jiān)測(cè)報(bào)告
- 機(jī)械裝備制造業(yè)智能化升級(jí)與產(chǎn)品質(zhì)量提升研究報(bào)告
- 教師教育教學(xué)改進(jìn)表現(xiàn)的試題及答案
- 小學(xué)教師反思與校本培訓(xùn)的重要性試題及答案
- 山東石油化工學(xué)院《工程管理類軟件應(yīng)用含技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 工業(yè)互聯(lián)網(wǎng)平臺(tái)安全升級(jí)之道:2025年漏洞掃描技術(shù)前瞻報(bào)告
- 曲阜遠(yuǎn)東職業(yè)技術(shù)學(xué)院《食品分析含實(shí)驗(yàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 市政公用工程法律法規(guī)試題及答案
- 設(shè)備維護(hù)工程師簡歷
- 2023版押品考試題庫必考點(diǎn)含答案
- 挖孔樁基施工方案(水磨鉆)
- 變電檢修技能考試計(jì)算
- 國際經(jīng)濟(jì)法學(xué)(湘潭大學(xué))智慧樹知到答案章節(jié)測(cè)試2023年
- 以案說德發(fā)言四篇
- 大氣污染控制工程課后題答案解析
- 臨床試驗(yàn)倫理委員會(huì)倫理審查不同意見溝通的標(biāo)準(zhǔn)操作規(guī)程
- 梅毒診療指南(2023年)
- 高中物理3-3熱學(xué)練習(xí)題(含答案)
- DB32-T 3916-2020建筑地基基礎(chǔ)檢測(cè)規(guī)程-(高清現(xiàn)行)
評(píng)論
0/150
提交評(píng)論