3月5日的面試題.md

[TOC]

驅(qū)動模塊類

串口驅(qū)動
20160518212553019.png

20160519234552579.png

Linux把每個串行端口都看做是一個字符設備
串口初始化 、打開串口、串口寫操作、串口讀操作
串口驅(qū)動程序設計詳解---串口初始化 上
串口驅(qū)動程序設計詳解---串口初始化 下

CAN驅(qū)動

CAN驅(qū)動源碼

CAN模塊

總線協(xié)議規(guī)定了5種幀,分別是數(shù)據(jù)幀、遙控幀(遠程幀)、錯誤幀、過載幀以及幀間隔
數(shù)據(jù)幀的7位域:幀起始(Start of )、仲裁域(Arbitration Field)、控制域(Control Field)、數(shù)據(jù)域(DataField)、CRC域(CRC Field)、應答域(ACK Field)和幀結尾(End of )
特點:
傳輸距離遠(最遠10Km),傳輸速率快(最高1MHz bps)
自動檢測報文發(fā)送成功與否,可硬件自動重發(fā)
電壓值:
0--顯性--CANH對地3.5V,CANL 1.5V
1--隱性--CANH對地2.5V,CANL 2.5V
120歐的終端電阻是可以過濾掉總線通過程中的自激振蕩
1 寄存器初始化配置順序
(1)進入復位模式,進行配置 (2)配置時鐘分頻寄存器,決定Peil模式還是Basic模式。 (3)配置總線定時寄存器,確定波特率。 (4)配置中斷使能寄存器,決定使用那幾個中斷 (5)配置輸出控制寄存器 (6)配置驗收碼和屏蔽碼,決定接收哪一類節(jié)點的數(shù)據(jù) (7)退出復位模式,進入正常工作模式。
2 發(fā)送數(shù)據(jù)順序 (1)查詢狀態(tài)寄存器,判斷是否正在接收,是否正在發(fā)送,是否數(shù)據(jù)緩沖區(qū)被鎖。 (2)配置發(fā)送緩沖區(qū)。 (3)配置命令寄存器,啟動發(fā)送。
3 接收數(shù)據(jù)順序 (1)采用中斷接收,關CPU中斷。 (2)判斷是不是接收中斷。 (3)判斷是遠程幀還是數(shù)據(jù)幀 (4)讀取數(shù)據(jù) (5)開中斷
CAN軟-硬件要則

串口通信

串口通信指串口按位(bit)發(fā)送和接收字節(jié)。盡管比按字節(jié)(byte)的并行通信慢,但是串口可以在使用一根線發(fā)送數(shù)據(jù)的同時用另一根線接收數(shù)據(jù)。長度可達1200米,電壓一般為5V
主要接線為Tx、Rx和地線
串口通信是異步的,端口能夠在一根線上發(fā)送數(shù)據(jù)同時在另一根線上接收數(shù)據(jù)
串口通信最重要的參數(shù)是比特率、數(shù)據(jù)位、停止位和奇偶校驗:
a,比特率:這是一個衡量通信速度的參數(shù)。它表示每秒鐘傳送的bit的個數(shù)。例如300波特表示每秒鐘發(fā)送300個bit。當我們提到時鐘周期時,就是指比特率,例如如果協(xié)議需要4800波特率,那么時鐘是4800Hz。這意味著串口通信在數(shù)據(jù)線上的采樣率為4800Hz。通常電話線的比特率為14400,28800和36600。比特率可以遠遠大于這些值,但是波特率和距離成反比。高比特率常常用于放置的很近的儀器間的通信,典型的例子就是GPIB設備的通信。
b,數(shù)據(jù)位:這是衡量通信中實際數(shù)據(jù)位的參數(shù)。當計算機發(fā)送一個信息包,實際的數(shù)據(jù)不會是8位的,標準的值是5、7和8位。如何設置取決于你想傳送的信息。比如,標準的ASCII碼是0127(7位)。擴展的ASCII碼是0255(8位)。如果數(shù)據(jù)使用簡單的文本(標準ASCII碼),那么每個數(shù)據(jù)包使用7位數(shù)據(jù)。每個包是指一個字節(jié),包括開始/停止位,數(shù)據(jù)位和奇偶校驗位。由于實際數(shù)據(jù)位取決于通信協(xié)議的選取,術語"包"指任何通信的情況。
c,停止位:用于表示單個包的最后一位。典型的值為1,1.5和2位。由于數(shù)據(jù)是在傳輸線上定時的,并且每一個設備有其自己的時鐘,很可能在通信中兩臺設備間出現(xiàn)了小小的不同步。因此停止位不僅僅是表示傳輸?shù)慕Y束,并且提供計算機校正時鐘同步的機會。適用于停止位的位數(shù)越多,不同時鐘同步的容忍程度越大,但是數(shù)據(jù)傳輸率同時也越慢。
d,奇偶校驗位:在串口通信中一種簡單的檢錯方式。有四種檢錯方式:偶、奇、高和低。當然沒有校驗位也是可以的。對于偶和奇校驗的情況,串口會設置校驗位(數(shù)據(jù)位后面的一位),用一個值確保傳輸?shù)臄?shù)據(jù)有偶個或者奇?zhèn)€邏輯高位。例如,如果數(shù)據(jù)是011,那么對于偶校驗,校驗位為0,保證邏輯高的位數(shù)是偶數(shù)個。如果是奇校驗,校驗位為1,這樣就有3個邏輯高位。高位和低位不真正的檢查數(shù)據(jù),簡單置位邏輯高或者邏輯低校驗。這樣使得接收設備能夠知道一個位的狀態(tài),有機會判斷是否有噪聲干擾了通信或者是否傳輸和接收數(shù)據(jù)是否不同步。

QT程序類

信號與槽機制

元對象編譯器 moc對 C++ 文件中的類聲明進行分析并產(chǎn)生用于初始化元對象的 C++ 代碼,元對象包含全部信號和槽的名字以及指向這些函數(shù)的指針
當某個信號對其客戶或所有者發(fā)生的內(nèi)部狀態(tài)發(fā)生改變,信號被一個對象發(fā)射。只有 定義過這個信號的類及其派生類能夠發(fā)射這個信號。當一個信號被發(fā)射時,與其相關聯(lián)的槽將被立刻執(zhí)行,就象一個正常的函數(shù)調(diào)用一樣。信號 - 槽機制完全獨立于任何 GUI 事件循環(huán)。只有當所有的槽返回以后發(fā)射函數(shù)(emit)才返回。 如果存在多個槽與某個信號相關聯(lián),那么,當這個信號被發(fā)射時,這些槽將會一個接一個地執(zhí)行,但是它們執(zhí)行的順序?qū)请S機的、不確定的,我們不能人為地指定哪個先執(zhí)行、哪 個后執(zhí)行。
槽是普通的 C++成員函數(shù),可以被正常調(diào)用,它們唯一的特殊性就是很多信號可以與其相關聯(lián)。當與其關聯(lián)的信號被發(fā)射時,這個槽就會被調(diào)用。槽可以有參數(shù),但槽的參數(shù)不能有缺省值。槽的存取權限決定了誰能夠與其相關聯(lián)。同普通的 C++ 成員函數(shù)一樣,槽函數(shù)也分為三種類型,即 public slots、private slots 和 protected slots。
通過調(diào)用 QObject 對象的 connect 函數(shù)來將某個對象的信號與另外一個對象的槽函數(shù)相關聯(lián),這樣當發(fā)射者發(fā)射信號時,接收者的槽函數(shù)將被調(diào)用

MVC框架

是模型(model)-視圖(view)-控制器(controller)的縮寫
Model(模型)表示應用程序核心(比如數(shù)據(jù)庫記錄列表)。是應用程序中用于處理應用程序數(shù)據(jù)邏輯的部分
View(視圖)顯示數(shù)據(jù)(數(shù)據(jù)庫記錄)。是應用程序中處理數(shù)據(jù)顯示的部分
Controller(控制器)處理輸入(寫入數(shù)據(jù)庫記錄)。是應用程序中處理用戶交互的部分

其他

堆和棧的區(qū)別

1.程序的內(nèi)存分配
棧(stack):有編譯器自動分配和釋放,存放函數(shù)的參數(shù)、局部變量、臨時變量、函數(shù)返回地址等;
堆(heap):一般有程序員分配和釋放,如果沒有手動釋放,在程序結束時可能由操作系統(tǒng)自動釋放(?這個可能針對Java那樣的有回收機制的語言而說的,對于c/c++,這樣的必須要手動釋放開辟的堆內(nèi)存),稍有不慎會引起內(nèi)存泄漏。
2.申請后系統(tǒng)的響應
棧:只要棧的剩余空間大于所申請的空間,系統(tǒng)將為程序提供內(nèi)存,否則將報異常提示棧溢出。
堆:在記錄空閑內(nèi)存地址的鏈表中尋找一個空間大于所申請空間的堆結點,然后將該結點從空閑結點鏈表中刪除,并將該結點的空間分配給程序。另外,對于大多數(shù)系統(tǒng)會在這塊內(nèi)存空間的首地址出記錄本次分配空間的大小,這樣代碼中的delete 才能正確釋放本內(nèi)存空間。系統(tǒng)會將多余的那部分重新空閑鏈表中。
3、申請大小限制
棧:在Windows下,棧是向低地址擴展的數(shù)據(jù)結構,是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預先規(guī)定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數(shù)),如果申請的空間超過棧的剩余空間時,將提示overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴展的數(shù)據(jù)結構,是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統(tǒng)中有效的虛擬內(nèi)存。由此可見,堆獲得的空間比較靈活,也比較大。
4、分配效率
棧:由系統(tǒng)自動分配,速度較快。但程序員是無法控制的。
堆:由new分配的內(nèi)存,一般速度比較慢,而且容易產(chǎn)生內(nèi)存碎片,不過用起來最方便. 另外,在WINDOWS下,最好的方式是用VirtualAlloc分配內(nèi)存,不是在堆,也不是在棧是直接在進程的地址空間中保留一快內(nèi)存,雖然用起來最不方便。但是速度快,也最靈活
5、存儲內(nèi)容
棧:在棧中,第一個進棧的是主函數(shù)下一條指令的地址,然后是函數(shù)的各個參數(shù),在大多數(shù)編譯器中,參數(shù)是由右往左入棧,然后是函數(shù)中的局部變量。注意,靜態(tài)變量不入棧。出棧則剛好順序相反。
堆:一般在堆的頭部用一個字節(jié)存放堆的大小,具體內(nèi)容由程序員安排。

可重入函數(shù)

可重入函數(shù)也可以這樣理解,重入即表示重復進入,首先它意味著這個函數(shù)可以被中斷,其次意味著它除了使用自己棧上的變量以外不依賴于任何環(huán)境(包括static),這樣的函數(shù)就是purecode(純代碼)可重入,可以允許有該函數(shù)的多個副本在運行,由于它們使用的是分離的棧,所以不會互相干擾。如果確實需要訪問全局變量(包括static),一定要注意實施互斥手段??芍厝牒瘮?shù)在并行運行環(huán)境中非常重要,但是一般要為訪問全局變量付出一些性能代價(如果必須訪問全局變量,記住利用互斥信號量來保護全局變量),不能使用靜態(tài)局部變量
滿足下列條件的函數(shù)多數(shù)是不可重入的:
1)函數(shù)體內(nèi)使用了靜態(tài)的數(shù)據(jù)結構;
2)函數(shù)體內(nèi)調(diào)用了malloc()或者free()函數(shù);
3)函數(shù)體內(nèi)調(diào)用了標準I/O函數(shù);
4)調(diào)用其它任何不可重入的函數(shù)

TCP的底層實現(xiàn)

TCP/IP協(xié)議族
物理層,數(shù)據(jù)鏈路層,網(wǎng)絡層,傳輸層,會話層,表示層,應用層
1.SYN包:請求建立連接的數(shù)據(jù)包
2.ACK包:回應數(shù)據(jù)包,表示接收到了對方的某個數(shù)據(jù)包
3.PSH包:正常數(shù)據(jù)包
4.FIN包:通訊結束包
5.RST包: 重置連接
三次握手”或者說“SYN,SYN/ACK,ACK”
關閉連接(四次分手):
1.一端主動關閉連接。向另一端發(fā)送FIN包。
2.接收到FIN包的另一端回應一個ACK數(shù)據(jù)包。
3.另一端發(fā)送一個FIN包。
4.接收到FIN包的原發(fā)送方發(fā)送ACK對它進行確認。

fcc181f693124d909132ba6ea8368bb0_th.jpg

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,425評論 6 13
  • 從三月份找實習到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,810評論 11 349
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,062評論 25 709
  • 1、修課方案如何制定? 答:建議參照下圖 2、本學期如何選課? 建議參照下圖。公共課一定要選,數(shù)學課一定要選,專業(yè)...
    天機大師姐閱讀 513評論 0 0
  • 一個人想,一個人走,一個人哭,一個人傷心
    湘姐閱讀 183評論 0 0

友情鏈接更多精彩內(nèi)容