嵌入式云IOT技術(shù)圈" data-alias="" data-signature="分享單片機(jī)、嵌入式Linux/Android、物聯(lián)網(wǎng)等相關(guān)產(chǎn)品項(xiàng)目開發(fā)經(jīng)驗(yàn),打造最硬核嵌入式技術(shù)公眾號。" data-from="0">點(diǎn)擊上方「嵌入式云IOT技術(shù)圈」,選擇「置頂公眾號」第一時(shí)間查看嵌入式筆記!
1. C語言中,修飾符volatile含義是什么?其應(yīng)用場合有哪些?
volatile提醒編譯器它后面所定義的變量隨時(shí)都有可能改變,因此編譯后的程序每次需要存儲或讀取這個(gè)變量的時(shí)候,都會直接從變量地址中讀取數(shù)據(jù)。如果沒有volatile關(guān)鍵字,則編譯器可能優(yōu)化讀取和存儲,可能暫時(shí)使用寄存器中的值,如果這個(gè)變量由別的程序更新了的話,將出現(xiàn)不一致的現(xiàn)象。
2. 請問TCP/IP協(xié)議分為哪幾層?FTP協(xié)議在哪一層?
ISO/OSI的參考模型共有7層,由低層至高層分別為:物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會話層、表示層、應(yīng)用層物理層:
在物理媒體上傳輸原始的數(shù)據(jù)比特流。?
數(shù)據(jù)鏈路層:
將數(shù)據(jù)分成一個(gè)個(gè)數(shù)據(jù)幀,以數(shù)據(jù)幀為單位傳輸。有應(yīng)有答,遇錯(cuò)重發(fā)。?
網(wǎng)絡(luò)層:
將數(shù)據(jù)分成一定長度的分組,將分組穿過通信子網(wǎng)。?
傳輸層:
提供不具體網(wǎng)絡(luò)的高效、經(jīng)濟(jì)、透明的端到端數(shù)據(jù)傳輸服務(wù)。?
會話層:
進(jìn)程間的對話也稱為會話,會話層管理不同主機(jī)上各進(jìn)程間的對話。?
表示層:
為應(yīng)用層進(jìn)程提供格式化的表示和轉(zhuǎn)換數(shù)據(jù)服務(wù)。?
應(yīng)用層:
提供應(yīng)用程序訪問OSI環(huán)境的手段。
應(yīng)用層:
TELNET、FTP、TFTP、SMTP、SNMP、HTTP、BOOTP、DHCP、DNS?
表示層:
文本:ASCII,EBCDIC
圖形:TIFF,JPEG,GIF,PICT
聲音:MIDI,MPEG,QUICKTIME
會話層:NFS、SQL、RPC 、X-WINDOWS、ASP(APPTALK會話協(xié)議)、SCP
傳輸層:TCP、UDP、SPX
網(wǎng)絡(luò)層:IP、IPX、ICMP、RIP、OSPF(Open Shortest Path First開放式最短路徑優(yōu)先)?
數(shù)據(jù)鏈路層:SDLC、HDLC、PPP、STP(Spanning Tree Protocol)、幀中繼?
物理層:EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45
3. 在網(wǎng)絡(luò)應(yīng)用中,函數(shù)htons,htonl,ntohs,ntohl的作用是什么?
uint32_t?htonl(uint32_t?hostlong);//32位的主機(jī)字節(jié)序轉(zhuǎn)換到網(wǎng)絡(luò)字節(jié)序?
uint16_t?htons(uint16_t?hostshort);//16位的主機(jī)字節(jié)序轉(zhuǎn)換到網(wǎng)絡(luò)字節(jié)序?
uint32_t?ntohl(uint32_t?netlong);//32位的網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換到主機(jī)字節(jié)序?
uint16_t?ntohs(uint16_t?netshort);//16位的網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換到主機(jī)字節(jié)序?
(皆為大小端的改變)
4. C語言中static函數(shù)與普通函數(shù)的區(qū)別是什么?
靜態(tài)函數(shù)在函數(shù)的返回類型前加上關(guān)鍵字static,函數(shù)就被定義成為靜態(tài)函數(shù)。函數(shù)的定義和聲明默認(rèn)情況下是extern的,但靜態(tài)函數(shù)只是在聲明他的文件當(dāng)中可見,不能被其他文件所用。定義靜態(tài)函數(shù)的好處:
- 其他文件中可以定義相同名字的函數(shù),不會發(fā)生沖突
- 靜態(tài)函數(shù)不能被其他文件所用。
局部靜態(tài)變量在局部變量之前加上關(guān)鍵字static,局部變量就被定義成為一個(gè)局部靜態(tài)變量。
- 內(nèi)存中的位置:靜態(tài)存儲區(qū)
- 初始化:未經(jīng)初始化的全局靜態(tài)變量會被程序自動(dòng)初始化為0(自動(dòng)對象的值是任意的,除非他被顯示初始化)
- 作用域:作用域仍為局部作用域,當(dāng)定義它的函數(shù)或者語句塊結(jié)束的時(shí)候,作用域隨之結(jié)束。
全局靜態(tài)變量在全局變量之前加上關(guān)鍵字static,全局變量就被定義成為一個(gè)全局靜態(tài)變量。
- 內(nèi)存中的位置:靜態(tài)存儲區(qū)(靜態(tài)存儲區(qū)在整個(gè)程序運(yùn)行期間都存在)
- 初始化:未經(jīng)初始化的全局靜態(tài)變量會被程序自動(dòng)初始化為0(自動(dòng)對象的值是任意的,除非他被顯示初始化)
- 作用域:全局靜態(tài)變量在聲明他的文件之外是不可見的。準(zhǔn)確地講從定義之處開始到文件結(jié)尾。
好處:定義全局靜態(tài)變量的好處:
- 不會被其他文件所訪問,修改
- 其他文件中可以使用相同名字的變量,不會發(fā)生沖突
5. 請實(shí)現(xiàn)內(nèi)存復(fù)制函數(shù)void memcpy(void *dst const void *src,int size)
void?*memcpy(void?*dest,?const?void?*src,?unsigned?int?size)
{
????if(dest==NULL?||?src==NULL)
????{
????????return?dest;
????}
????
????void?*temp?=?dest;
????while(size--)
????{
????????*(char?*)dest?=?*(char?*)src;
????????dest?=?(char?*)dest? ?1;
????????src?=?(char?*)src? ?1;
????}
????return?temp;
}
6、進(jìn)程間通信的方式有
- 管道(pipe),流管道(s_pipe)和有名管道(FIFO)
- 信號(signal)
- 消息隊(duì)列
- 共享內(nèi)存
- 信號量
- 套接字(socket)
7、IPv4把所有的IP地址分為A、B、C、D、E五類。請寫出B類地址和C類地址的范圍和掩碼,D類地址的用途是什么?
A類IP地址范圍:0.0.0.0到127.255.255.255B類IP地址范圍:128.0.0.0到191.255.255.255C類IP地址范圍:192.0.0.0到223.255.255.255D類IP地址范圍:224.0.0.0到239.255.255.255E類IP地址范圍:224.0.0.0到254.255.255.255D類地址用于多點(diǎn)播送E類地址保留,僅作實(shí)驗(yàn)和開發(fā)用全零(“0.0.0.0”)地址指任意網(wǎng)絡(luò)。全“1”的IP地址(“255.255.255.255”)是當(dāng)前子網(wǎng)的廣播地址。
8、請簡述在linux中多進(jìn)程程序和多線程程序的區(qū)別。
9、寫一個(gè)標(biāo)準(zhǔn)的宏MINX,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)?
#define?MIN(A,?B)????((A)>(B)??(B)?:?(A))
10、什么是MMU,MMU的作用
MMU是Memory Management Unit(內(nèi)存管理單元)1)虛擬內(nèi)存。有了虛擬內(nèi)存,可以在處理器上運(yùn)行比實(shí)際物理內(nèi)存大的應(yīng)用程序。為了使用虛擬內(nèi)存,操作系統(tǒng)通常要設(shè)置一個(gè)交換分區(qū)(通常是硬盤),通過將不活躍的內(nèi)存中的數(shù)據(jù)放入交換分區(qū),操作系統(tǒng)可以騰出其空間來為其它的程序服務(wù)。虛擬內(nèi)存是通過虛擬地址來實(shí)現(xiàn)的。2)內(nèi)存保護(hù)。根據(jù)需要對特定的內(nèi)存區(qū)塊的訪問進(jìn)行保護(hù),通過這一功能,我們可以將特定的內(nèi)存塊設(shè)置成只讀、只寫或是可同時(shí)讀寫
11、關(guān)鍵字volatile有什么含義,并給出幾個(gè)應(yīng)用場合。
volatile的本意是“易變的” 由于訪問寄存器的速度要快過RAM,所以編譯器一般都會作減少存取外部RAM的優(yōu)化,但有可能會讀臟數(shù)據(jù)。當(dāng)要求使用volatile 聲明的變量的值的時(shí)候,系統(tǒng)總是重新從它所在的內(nèi)存讀取數(shù)據(jù),即使它前面的指令剛剛從該處讀取過數(shù)據(jù)。而且讀取的數(shù)據(jù)立刻被保存。一般說來,volatile用在如下的幾個(gè)地方:
- 1、中斷服務(wù)程序中修改的供其它程序檢測的變量需要加volatile;
- 2、多任務(wù)環(huán)境下各任務(wù)間共享的標(biāo)志應(yīng)該加volatile;
- 3、存儲器映射的硬件寄存器通常也要加volatile說明,因?yàn)槊看螌λ淖x寫都可能由不同意義;
12、“棧 stack”和“堆 heap”有什么區(qū)別,寫兩個(gè)函數(shù)分別在棧上和堆上分配內(nèi)存,在堆上分配內(nèi)存應(yīng)注意哪些問題?
stack:由系統(tǒng)自動(dòng)分配。例如,聲明在函數(shù)中一個(gè)局部變量
int b
; 系統(tǒng)自動(dòng)在棧中為
b
開辟空間heap:需要程序員自己申請,并指明大小,在c中malloc函數(shù)
p1 = (char *)malloc(10);
棧:只要棧的剩余空間大于所申請空間,系統(tǒng)將為程序提供內(nèi)存,否則將報(bào)異常提示棧溢出。堆:首先應(yīng)該知道操作系統(tǒng)有一個(gè)記錄空閑內(nèi)存地址的鏈表,當(dāng)系統(tǒng)收到程序的申請時(shí),會遍歷該鏈表,尋找第一個(gè)空間大于所申請空間的堆結(jié)點(diǎn),然后將該結(jié)點(diǎn)從空閑結(jié)點(diǎn)鏈表中刪除,并將該結(jié)點(diǎn)的空間分配給程序.
棧:棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,是一塊連續(xù)的內(nèi)存的區(qū)域,在WINDOWS下,棧的大小是2M ,如果申請的空間超過棧的剩余空間時(shí),將提示overflow。因此,能從棧獲得的空間較小。(有限內(nèi)存)堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。(自己分配)
void?fun(void)
{
????int?a[10];
????int?*p?=?(int?*)malloc(10*sizeof(int));
????if(p?==?NULL)
????{
????????return;
????}
}
13、請指出下面程序的錯(cuò)誤
unsigned?char?i?=?10;?
char?b?=?100;?
char*?p;?
void?f(void)?
{?
????While(–-i>=0)?
????{?
???????*(p )?=?b;?
????}?
}
p沒有分配空間i是無符號型,自減操作會引發(fā)死循環(huán)
14、TCP/IP通信建立的過程怎樣,端口有什么作用?
端口作用:(連接作用)就是讓運(yùn)輸層的各種應(yīng)用進(jìn)程都能將其數(shù)據(jù)通過端口向下交付給運(yùn)輸層,以及讓運(yùn)輸層知道應(yīng)當(dāng)將其報(bào)文段的數(shù)據(jù)向上通過端口交付給應(yīng)用層相應(yīng)的進(jìn)程
嵌入式技術(shù)公眾號。" data-from="0">