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