1. C語言中,修飾符volatile含義是什么?其應用場合有哪些?
答:volatile關鍵字的作用
volatile提醒編譯器它后面所定義的變量隨時都有可能改變,因此編譯后的程序每次需要存儲或讀取這個變量的時候,都會直接從變量地址中讀取數據。如果沒有volatile關鍵字,則編譯器可能優化讀取和存儲,可能暫時使用寄存器中的值,如果這個變量由別的程序更新了的話,將出現不一致的現象。下面舉例說明。在DSP開發中,經常需要等待某個事件的觸發,所以經常會寫出這樣的程序:
short flag;void test(){do1();while(flag==0);do2();
}
這段程序等待內存變量flag的值變為1(懷疑此處是0,有點疑問,)之后才運行do2()。變量flag的值由別的程序更改,這個程序可能是某個硬件中斷服務程序。例如:如果某個按鈕按下的話,就會對DSP產生中斷,在按鍵中斷程序中修改flag為1,這樣上面的程序就能夠得以繼續運行。但是,編譯器并不知道flag的值會被別的程序修改,因此在它進行優化的時候,可能會把flag的值先讀入某個寄存器,然后等待那個寄存器變為1。如果不幸進行了這樣的優化,那么while循環就變成了死循環,因為寄存器的內容不可能被中斷服務程序修改。為了讓程序每次都讀取真正flag變量的值,就需要定義為如下形式:
volatile short flag;
需要注意的是,沒有volatile也可能能正常運行,但是可能修改了編譯器的優化級別之后就又不能正常運行了。因此經常會出現debug版本正常,但是release版本卻不能正常的問題。所以為了安全起見,只要是等待別的程序修改某個變量的話,就加上volatile關鍵字。
2. 請問TCP/IP協議分為哪幾層?FTP協議在哪一層?
答:
TCP/IP整體構架概述
TCP/IP協議并不完全符合OSI的七層參考模型。傳統的開放式系統互連參考模型,是一種通信協議的7層抽象的參考模型,其中每一層執行某一特定任務。該模型的目的是使各種硬件在相同的層次上相互通信。這7層是:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。而TCP/IP通訊協議采用了4層的層級結構,每一層都呼叫它的下一層所提供的網絡來完成自己的需求。這4層分別為:
應用層:應用程序間溝通的層,如簡單電子郵件傳輸(SMTP)、文件傳輸協議(FTP)、網絡遠程訪問協議(Telnet)等。
傳輸層:在此層中,它提供了節點間的數據傳送服務,如傳輸控制協議(TCP)、用戶數據報協議(UDP)等,TCP和UDP給數據包加入傳輸數據并把它傳輸到下一層中,這一層負責傳送數據,并且確定數據已被送達并接收。
互連網絡層:負責提供基本的數據封包傳送功能,讓每一塊數據包都能夠到達目的主機(但不檢查是否被正確接收),如網際協議(IP)。
網絡接口層:對實際的網絡媒體的管理,定義如何使用實際網絡(如Ethernet、SerialLine等)來傳送數據。
3. 在網絡應用中,函數htons,htonl,ntohs,ntohl的作用是什么?
答:
htons
htons函數用來轉換u_short來自主機的TCP / IP網絡字節順序(即big-endian )的. u_short htons ( u_short hostshort ) ; 參數hostshort [ ] 16位元數的主機字節順序. 返回值的htons函數返回值的TCP /IP網絡字節順序. 須知htons函數有一個16位號碼主機字節順序并返回一個16位數字網絡字節命令中使用的TCP /IP網絡.
htonl
將主機的無符號長整形數轉換成網絡字節順序。
#include
u_long PASCAL FAR htonl( u_long hostlong);
hostlong:主機字節順序表達的32位數。
注釋:
本函數將一個32位數從主機字節順序轉換成網絡字節順序。
返回值:htonl()返回一個網絡字節順序的值。
參見:htons(), ntohl(), ntohs().
ntohs
將一個無符號短整形數從網絡字節順序轉換為主機字節順序。
#include
u_short PASCAL FAR ntohs(u_short netshort);
netshort:一個以網絡字節順序表達的16位數。
注釋:
本函數將一個16位數由網絡字節順序轉換為主機字節順序。
返回值:ntohs()返回一個以主機字節順序表達的數。
參見:htonl(), htons(),ntohl().
ntohl
將一個無符號長整形數從網絡字節順序轉換為主機字節順序。
#include
u_long PASCAL FAR ntohl(u_long netlong);
netlong:一個以網絡字節順序表達的32位數。
注釋:
本函數將一個32位數由網絡字節順序轉換為主機字節順序。
返回值:ntohl()返回一個以主機字節順序表達的數。
參見:htonl(), htons(),ntohs().
4. C語言中static函數與普通函數的區別是什么?
答:
1.static有什么用途?(請至少說明兩種)
1)在函數體,一個被聲明為靜態的變量在這一函數被調用過程中維持其值不變。
2) 在模塊內(但在函數體外),一個被聲明為靜態的變量可以被模塊內所有函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。
3) 在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地范圍內使用
static全局變量與普通的全局變量有什么區別?static局部變量和普通局部變量有什么區別?static函數與普通函數有什么區別?
全局變量(外部變量)的說明之前再冠以static 就構成了靜態的全局變量。全局變量本身就是靜態存儲方式,靜態全局變量當然也是靜態存儲方式。這兩者在存儲方式上并無不同。這兩者的區別雖在于非靜態全局變量的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。而靜態全局變量則限制了其作用域,即只在定義該變量的源文件內有效,在同一源程序的其它源文件中不能使用它。由于靜態全局變量的作用域局限于一個源文件內,只能為該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤。從以上分析可以看出,把局部變量改變為靜態變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變為靜態變量后是改變了它的作用域,限制了它的使用范圍。
static函數與普通函數作用域不同。僅在本文件。只在當前源文件中使用的函數應該說明為內部函數(static),內部函數應該在當前源文件中說明和定義。對于可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件static全局變量與普通的全局變量有什么區別:static全局變量只初使化一次,防止在其他文件單元中被引用; static局部變量和普通局部變量有什么區別:static局部變量只被初始化一次,下一次依據上一次結果值;static函數與普通函數有什么區別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝
5. 請實現內存復制函數voidmemcpy(void *dst const void *src,int size)
原型:extern void*memcpy(void *dest, void *src, unsigned int count);用法:#include
方法2:
寫一個內存拷貝函數
//考慮重疊的狀況void*_memcpy(void*dest,void*src,intlen){if(!dest||!src||!len||dest==src)returndest;char*pdest=static_cast
6.32位機器上,假設有一個32位數字0x1234abcd保存在0x00000000開始的內存中,那么在little endian和big endian的機器上,按字節該整數在內存中存放的順序是怎么樣的?
答:大端模式:數據的高字節存儲在內存地址的低字節,(正常存儲)小端模式:數據的高字節存儲在內存地址的高字節.
littleendian:0x00000000-0x000000003h:cd,ab,34,12
big endian: 0x00000000-0x000000003h: 12,34,ab,cd
7.ISO七層模型是什么,tcp/udp屬于哪一層?
答:物理層-數據鏈路層-網絡層-傳輸層-會話層-表示層-應用層,tcp/udp工作在傳輸層。
8.下面是一個中斷服務程序的代碼,請指出有那些問題?
_interrupt double compute_area(double radius)
{
double area=PI*radius*radius;
return area;
}
答:中斷子程序不能有返回值,去掉return area; compute_area之前的double關鍵字。這個函數有太多的錯誤了,以至讓人不知從何說起了:
1)ISR 不能返回一個值。如果你不懂這個,那么你不會被雇用的。
2) ISR 不能傳遞參數。如果你沒有看到這一點,你被雇用的機會等同第一項。
3) 在許多的處理器/編譯器中,浮點一般都是不可重入的。有些處理器/編譯器需要讓額處的寄存器入棧,有些處理器/編譯器就是不允許在ISR中做浮點運算。此外,ISR應該是短而有效率的,在ISR中做浮點運算是不明智的。
4) 與第三點一脈相承,printf()經常有重入和性能上的問題。如果你丟掉了第三和第四點,我不會太為難你的。不用說,如果你能得到后兩點,那么你的被雇用前景越來越光明了。
8.多任務系統中,常見的任務通訊機制有哪些?
答:操作系統還提供進程間的通訊機制來幫助完成這樣的任務。Linux中常見的進程間通訊機制有:信號、管道、共享內存、信號量和套接字等。
9.請實現內存復制函數memcpy(void *dst,const void*src,int size).
答:
舉例:
// memcpy.c#include
memcpy(d,s,strlen(s));d[strlen(s)]='\0';printf("%s",d);getchar();return 0;}截取view#include
10.請列舉主流linux的發布版本(四個以上)。
答:
(1)Redhat有兩大Linux產品系列,其一是免費的Fedora Core系列主要用于桌面版本,提供了較多新特性的支持。另外一個產品系列是收費的Enterprise系列,這個系列分成:AS/ES/WS等分支。
(2)Advanced Server,縮寫即AS。AS在標準Linux內核的基礎上,做了性能上的增強,并提高了可靠性,集成了眾多常見服務器的驅動程序。可輕松識別IBM/DELL/HP等常見機架式服務器的磁盤陣列卡等設備。
11.當前linux最主流的兩大桌面環境是什么,兩者區別是什么?
答:KDE與GNOME是目前Linux/UNIX系統最流行的圖形操作環境
12.linux系統下主要三類設備文件類型是什么?
答:塊設備、字符設備、網絡設備。
Linux 中的設備有2種類型:字符設備(無緩沖且只能順序存取)、塊設備(有緩沖且可以隨機存取)。每個字符設備和塊設備都必須有主、次設備號,主設備號相同的設備是同類設備(使用同一個驅動程序)。這些設備中,有些設備是對實際存在的物理硬件的抽象,而有些設備則是內核自身提供的功能(不依賴于特定的物理硬件,又稱為"虛擬設備")。
13.以太網的MTU是多大?
答:通常意義上的以太網MTU是指沒有以太網header和FCS的以太網payload部分,IEEE802規定了大小為0~1500字節;所以,二層以太網幀長應該為這個長度加上18B(6B的DA、6B的SA和2B的Length/Etype以及4B的FCS),這樣大小應該<1518;在Dot1Q情況下,應該在加上4B的802.1Q的Tag,即應該<1522B;在MPLS VPN環境中,IGP標簽和VPN標簽各是4B,所以,作為中間環節的交換機如果不支持Jumbo幀的話,就需要手工配置MTU=1500+N*4(N為MPLS Tag層數)。
14.ARP協議作用
答:IP數據包常通過以太網發送。以太網設備并不識別32位IP地址:它們是以48位以太網地址傳輸以太網數據包的。因此,IP驅動器必須把IP目的地址轉換成以太網網目的地址。在這兩種地址之間存在著某種靜態的或算法的映射,常常需要查看一張表。地址解析協議(Address Resolution Protocol,ARP)就是用來確定這些映象的協議。
ARP工作時,送出一個含有所希望的IP地址的以太網廣播數據包。目的地主機,或另一個代表該主機的系統,以一個含有IP和以太網地址對的數據包作為應答。發送者將這個地址對高速緩存起來,以節約不必要的ARP通信。
如果有一個不被信任的節點對本地網絡具有寫訪問許可權,那么也會有某種風險。這樣一臺機器可以發布虛假的ARP報文并將所有通信都轉向它自己,然后它就可以扮演某些機器,或者順便對數據流進行簡單的修改。ARP機制常常是自動起作用的。在特別安全的網絡上, ARP映射可以用固件,并且具有自動抑制協議達到防止干擾的目的。
15.編寫一個簡單的ECHO服務器
答:如下代碼是一個簡單的echo服務器,它示例的一些Winsock函數的用法。
#include
{cout<"<"?<#FUNC?<">CallError!"<""?????<"Error?Number?:?"?<h_addr_list[0])));}hostAddr.sin_family=AF_INET;hostAddr.sin_port=htons(PORT);hostAddr.sin_addr.s_addr=nIp;}if((nRet=bind(hListen,(PSOCKADDR)&hostAddr,sizeof(SOCKADDR_IN)))!=0){PRINT_SOCKET_ERROR(bind);return-1;}///#3if((nRet=listen(hListen,5))!=0){PRINT_SOCKET_ERROR(listen);return-1;}else{cout<"Listening?at?"?<
16. 什么是DSP?請簡述DSP與通用CPU的差別。
答:以微處理器解度看,兩者似乎沒什么差別. 但二者所專注的鄰域卻完全不一樣. 通用的CPU專注的事務處理,對實時性的支持相對DSP差了很多.雖然一些通用CPU也在加入一些高性能的運算支持,但它和DSP相比還是天差地遠.
比如現在的通用DSP可以在幾個us內完成1024點的復數FFT,通用處理器是咋都達不到這水平(現在的情況),雖然其系統時鐘有可能比DSP高出一個數量級.但一個周期完成多個復雜操作和多個周期完成一個操作的差別是很大的.
DSP完成的都是算法密集性的事務,可能工作比較單一而簡單,但對實時要求很高很高.必需要某個確定的時間內(有可能就那么幾us)完成所需要的所有操作.
通用CPU對事務管理很突出, 在這方面的能力比DSP支持得要好得多.
所以大多數的高性能系統會是DSP和通用CPU的結合.充分利用各自的優點.
由于DSP特注重高性能,其結構在同等條件比通用CPU要復雜得多,設計上也更困難.因此其價格相比通用CPU要貴那么一些(只是通用DSP和通用CPU 相比),一些很單一功能的DSP可是很便宜的,比通用CPU還便宜. 通用DSP因為要考慮通用,所以結構和專用的也是不一樣的.從表面上來看,DSP與標準微處理器有許多共同的地方:一個以ALU為核心的處理器、地址和數據總線、RAM、ROM以及I/O端口,從廣義上講,DSP、微處理器和微控制器(單片機)等都屬于處理器,可以說DSP是一種CPU。但DSP和一般的CPU又不同:
首先是體系結構:CPU是馮.諾伊曼結構的,而DSP有分開的代碼和數據總線即“哈佛結構”,這樣在同一個時鐘周期內可以進行多次存儲器訪問——這是因為 數據總線也往往有好幾組。有了這種體系結構,DSP就可以在單個時鐘周期內取出一條指令和一個或者兩個(或者更多)的操作數。
標準化和通用性:CPU的標準化和通用性做得很好,支持操作系統,所以以CPU為核心的系統方便人機交互以及和標準接口設備通信,非常方便而且不需要硬件 開發了;但這也使得CPU外設接口電路比較復雜,DSP主要還是用來開發嵌入式的信號處理系統了,不強調人機交互,一般不需要很多通信接口,因此結構也較為簡單,便于開發。如果只是著眼于嵌入式應用的話,嵌入式CPU和DSP的區別應該只在于一個偏重控制一個偏重運算了。
流水線結構:大多數DSP都擁有流水結構,即每條指令都由片內多個功能單元分別完成取指、譯碼、取數、執行等步驟,這樣可以大大提高系統的執行效率。但流水線的采用也增加了軟件設計的難度,要求設計者在程序設計中考慮流水的需要。
快速乘法器:信號處理算法往往大量用到乘加(multiply-accumulate,MAC)運算。DSP有專用的硬件乘法器,它可以在一個時鐘周期內 完成MAC運算。硬件乘法器占用了DSP芯片面積的很大一部分。(與之相反,通用CPU采用一種較慢的、迭代的乘法技術,它可以在多個時鐘周期內完成一次 乘法運算,但是占用了較少了硅片資源)。
地址發生器:DSP有專用的硬件地址發生單元,這樣它可以支持許多信號處理算法所要求的特定數據地址模式。這包括前(后)增(減)、環狀數據緩沖的模地址以及FFT的比特倒置地址。地址發生器單元與主ALU和乘法器并行工作,這就進一步增加了DSP可以在一個時鐘周期內可以完成的工作量。
硬件輔助循環:信號處理算法常常需要執行緊密的指令循環。對硬件輔助循環的支持,可以讓DSP高效的循環執行代碼塊而無需讓流水線停轉或者讓軟件來測試循環終止條件。
低功耗:DSP的功耗較小,通常在0.5W到4W,采用低功耗的DSP甚至只有0.05W,可用電池供電,很適合嵌入式系統;而CPU的功耗通常在20W以上。
17. 靜態局部變量與普通局部變量的區別是什么?
答:全局變量(外部變量)的說明之前再冠以static就構成了靜態的全局變量。全局變量本身就是靜態存儲方式, 靜態全局變量當然也是靜態存儲方式。 這兩者在存儲方式上并無不同。這兩者的區別雖在于非靜態全局變量的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。 而靜態全局變量則限制了其作用域, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。由于靜態全局變量的作用域局限于一個源文件內,只能為該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤。
從以上分析可以看出,把局部變量改變為靜態變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變為靜態變量后是改變了它的作用域, 限制了它的使用范圍。
static函數與普通函數作用域不同。僅在本文件。只在當前源文件中使用的函數應該說明為內部函數(static),內部函數應該在當前源文件中說明和定義。對于可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件
static全局變量與普通的全局變量有什么區別:static全局變量只初使化一次,防止在其他文件單元中被引用;static局部變量和普通局部變量有什么區別:static局部變量只被初始化一次,下一次依據上一次結果值;static函數與普通函數有什么區別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝。程序的局部變量存在于(堆棧)中,全局變量存在于(靜態區 )中,動態申請數據存在于( 堆)中。
18.請說明DSP中定點、浮點的概念
答:定點數指小數點在數中的位置是固定不變的,通常有定點整數和定點小數。在對小數點位置作出選擇之后,運算中的所有數均應統一為定點整數或定點小數,在運算中不再考慮小數問題。
(1)定義:數據中小數點位置固定不變的數 (2)種類:定點整數(3)小數點在符號位與有效位之間。
注:定點數受字長的限制,超出范圍會有溢出。
19.定點數與浮點數區別
答:定點表示法運算直觀,但數的表示范圍較小,不同的數運算時要考慮比例因子的選取,以防止溢出。浮點表示法運算時可以不考慮溢出,但浮點運算,編程較難。要掌握定、浮點數的轉換方法及浮點數規格化方法。
20.什么是cache?cache有哪些操作?
答:cache n. 高速緩沖存儲器 一種特殊的存儲器子系統,其中復制了頻繁使用的數據以利于快速訪問。存儲器的高速緩沖存儲器存儲了頻繁訪問的 RAM 位置的內容及這些數據項的存儲地址。當處理器引用存儲器中的某地址時,高速緩沖存儲器便檢查是否存有該地址。如果存有該地址,則將數據返回處理器;如果沒有保存該地址,則進行常規的存儲器訪問。因為高速緩沖存儲器總是比主RAM 存儲器速度快,所以當 RAM 的訪問速度低于微處理器的速度時,常使用高速緩沖存儲器。
-
寄存器
+關注
關注
31文章
5325瀏覽量
120053 -
C語言
+關注
關注
180文章
7601瀏覽量
136251 -
嵌入式軟件
+關注
關注
4文章
240瀏覽量
26620
原文標題:嵌入式軟件工程師測試題20道與簡析
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論