一、QT
1、QT簡介:QT是一個跨平臺的C++應用程序開發框架,支持Windows、Linux、macOS、IOS、Android等
2、QT優勢:跨平臺性、豐富的類庫、信號與槽機制、文檔和社區支持
3、QT信號與槽機制:用于對象間通信的機制。當一個對象狀態發生變化時,發出一個信號signal,另一個對象可以連接這個信號到一個slot函數上
當線程的信號與槽實現原理主要是由觀察者模式與函數指針的聯合使用
多線程的信號與槽實現原理本質上是事件機制
優勢:類型安全,松散耦合
缺點:相比回調函數慢10倍,性能下忽略不計
本質:一種高級的、類型安全的對象間通信機制,替代傳統的、不安全的回調函數(如函數指針)
用法:一個信號連接多個槽,多個信號連接一個槽
4、QT元對象系統:實現信號與槽機制、屬性系統、動態類型轉換等功能的基礎,通過Q_OBJECT宏、元對象編譯器(MOC)等技術實現。
5、QT信號與槽機制連接方法5種:UI信號槽自動連接、Lamda表達式、自定義信號槽、QT4宏直接連接函數、QT5新式語法
6、QT信號與槽機制連接類型5種:
AutoConnection(默認)
DirectConnection(槽立即被調用)
QueuedConnection(槽放入線程事件隊列中)
BlockingQueuedConnection(會阻塞發送者的線程,直到solt處理完畢)
UniqueConnection(確保信號與槽之間只建立一次連接,避免重復連接)
7、QT信號和槽參數:信號的參數類型和數量必須與槽函數的參數類型和數量兼容,類型安全。
8、QT中的事件機制(Event loop):當開啟事件循環時,會創建一個事件隊列并監聽,觸發事件時(鼠標點擊、鍵盤輸入等)會經過過濾,篩選掉不需要處理的事件,將需要處理的事件發送到監聽列隊中,監聽方根據處理策略將需要處理的事件取出,調用對應函數處理。
9、QT創建多線程的兩種方式:①使用QThread類。②繼承QObject。
10、QT子線程與主線程通信:通過信號與槽機制進行通信,使用Qt::Queuedonnection連接類型
11、QT多線程的線程安全問題:使用互斥鎖(QMutex),在訪問共享資源時,使用互斥鎖進行加鎖和解鎖操作,確保同一時間只有一個線程可以訪問共享資源。
12、QT中的布局管理器:水平、垂直、網格、表單布局
13、QT自定義控件:繼承QWidget或其他控件類,重寫相關的虛函數來實現。
虛函數是C++實現運行時多態的核心機制。基類函數聲明Virtual,派生類中才能使用override重寫函數。C++ 虛函數學習
14、QT中連接MYSQL:安裝mysql驅動,使用QSqlDatabase連接數據庫
15、QT中的內存管理機制的用法與原理:
用法:在子對象構造時傳遞父對象的指針即可,或者子對象調用setParent()函數設置或更換父對象。Qt中基本所有帶有Parent與Children單詞的函數基本都與內存管理相關。
原理:在設置父對象的時候,讓父對象保存子對象的地址,然后在父對象的析構函數中釋放子對象。即可完成內存管理,Qt中的內存管理規則為一個父對象可以管理多個子對象,而子對象最多只會有一個父對象,并且由于父對象需要管理多個子對象,導致必須使用容器存儲,且所有子對象和父對象必須直接或間接繼承同一個類。
16、QT窗口對象的父子關系如何指定?有什么作用與好處?
指定:窗口對象(QWidget)的父子關系可由子對象的構造函數中傳遞父對象的指針完成,或者子對象調用setParent()函數,傳遞父對象的指針。
作用:子窗口默認會成為父窗口的子窗口,會嵌套進父窗口中,在父窗口顯示時同時顯示,父窗口隱藏時同時隱藏。
好處:父窗口銷毀時會帶著子窗口一起銷毀,子對象無需再調用delete
17、QT中如果一個信號的處理方法一直未被執行,有哪些可能?
槽函數對象已經被銷毀存在長期處理的事件函數導致程序卡在事件中連接信號與槽時參數錯誤或未進行連接單線程的信號與槽中配置的阻塞排隊屬性(BlockingQueuedConnection)導致死鎖多線程信號與槽的通信中,槽函數所在線程未開啟事件循環
18、QT中信號與槽如何同步異步?
信號與槽中第五個參數默認情況下為QT::AutoConnection,單線程時會自動選擇QT::DirectConnection(直連)。多線程時會自動選擇QT::QueuedConnection(排隊方式)
QT默認單線程的信號與槽的連接為同步的,也就是QT::DirectConnection(直連),只要信號觸發,一定會優先執行槽函數,槽函數執行結束后則返回到信號調用的位置。
QT默認多線程的信號與槽的連接為異步的,也就是QT::QueuedConnection(排隊方式),信號觸發后不會等待槽函數結束,會直接往后執行,而槽函數在事件循環中排隊,等待簽名的事件執行完再開始執行。
多線程中如果想同步需要將連接類型配置為QT::BlockingQueuedConnection(阻塞排隊方式)、
?
二、RTOS
1、一個處理器核心在某一個時刻只能運行一個任務
2、RTOS中有一個實時任務調度器,按照優先級分配CPU時間
3、調度器中有時間片、搶占式、合作式三種調度方式
時間片:每個任務都有相同的優先級,任務會運行固定的時間片個數或者遇到阻塞API函數。
搶占式:每個任務都有不同的優先級,任務會一直運行直到被高優先級任務搶占或者遇到阻塞式的API函數。
合作式:很少使用,用在資源有限的設備上。
4、FreeRtos中所有的通信和同步機制都是基于隊列實現的,特性先入先出
5、FreeRtos中信號量分為二值信號量、計數型信號量、互斥信號量、遞歸互斥信號量,作用資源管理和任務同步
6、FreeRtos內核怎么調度的,運行態、就緒態、阻塞態、掛起態
三、Linux
1、Linux內核組成:進程調度、內存管理、虛擬文件系統、網絡接口、進程間通信、模塊管理器、系統調用接口
2、用戶空間:應用程序運行的區域,應用程序不能直接訪問硬件或操作系統的內核。受限
3、內核空間:Linux內核運行的區域,內核能夠直接訪問硬件資源(內存、I/O設備等)。最高權限
4、用戶空間通過系統調用進入內核空間,用戶空間的進程崩潰不影響系統,內核空間出差會導致系統崩潰
5、用戶空間與內核空間通信:系統調用、中斷、信號、管道、共享內存
6、進程:具有獨立的內存空間、棧等資源。需要通過進程間通信(IPC),代價高
7、線程:共享進程的內存空間和資源。一個進程包含多個線程,線程間通信,成本低。共享內存可能導致數據競爭而崩潰,一個線程崩潰影響整個進程。
8、多進程:獨立性強,資源隔離,缺點是資源開銷大
9、多線程:資源共享,效率高,調度方便,缺點是同步問題、調度開銷、性能限制
10、多進程和多線程通信(IPC)方法:管道、命名管道、消息隊列、共享內存、信號量、信號、套接字
共享內存:用于大量數據傳輸,圖形處理或音視頻流傳輸。消息隊列:任務管理系統、多進程日志收集服務。套接字:分布式系統中的進程通信,客戶端與服務器的交互。
11、 線程通訊(鎖):信號量、讀寫鎖、條件變量、互斥鎖、自旋鎖
12、守護進程:在后臺運行的特殊進程
13、臨界區:指一個訪問共用資源的程序片段,而這些共用資源又無法被多個線程訪問的特性。臨界區用于保護共享資源。
14、Linux中信號是如何處理的:信號是一種軟件中斷,用于通知進程發生了某種事情。處理流程:發送信號、處理信號、信號屏蔽
15、Linux中的內存管理機制:分頁、交換、伙伴系統、SLAB分配器
16、虛擬內存:是一種內存管理技術,為每個進程提供了一個連續的虛擬地址空間,物理內存與硬盤上的虛擬內存結合,實現擴大內存的效果。
17、內存映射:mmap函數,將文件或設備映射到內存中,運行程序直接對文件內存進行訪問。
18、中斷:中斷通常由硬件設施引發的。指系統停止當前正在運行的程序,以便處理其他緊急事件或請求。
19、異常:異常通常由軟件錯誤引起的。指程序運行過程中發生的,可能是程序本身錯誤。
20、硬鏈接:通過文件索引節點進行鏈接,只能在同一文件系統內創建
21、軟鏈接:通過文件路徑進行鏈接,可以跨越不同的文件系統
22、堆(Heap):動態分配的內存區域,由程序員分配和釋放。通常位于棧的頂部。
23、棧(Stack):靜態分配的內存區域,由系統分配和釋放。通常位于內存的底部。
四、ARM
1、Stm32啟動流程:引腳初始化-初始化棧指針-指向復位程序-設置異常中斷-設置系統時鐘-調用C庫函數main
2、STM32-GPIO引腳工作模式8種:模擬輸入、浮空輸入、上拉和下拉輸入、開漏輸出、推挽輸出、復用開漏和復用推挽輸出
APB1(低速外設總線):DAC、USB、SPI、I2C、UART、CAN
APB2(高速外設總線):ADC、I/0、高級TIM、串口1
3、串口配置步驟:串口時鐘使能-串口復位-GPIO工作模式-串口參數初始化-使能串口-中斷處理
4、串行總線通信:
I2C半雙工同步:多主多從,SDA(數據)+SCL(時鐘)組成。
當多個I2C連接在總線上,需要接上拉電阻,所有I2C設備SDA和SCL都是開漏輸出
(避免高低電平沖突,也就是總線競爭),不能輸出高電平,高電平靠外部上拉電阻提供。
I2C通信流程:起始條件->地址幀->應答->數據幀->停止位SPI全雙工同步:單主多從,MISO(主入從出)+MOSI(主出從入)+SCLK(主時鐘)+CS/SS(從片選)。
支持Mode0-3四種工作模式,通過時鐘極性(CPOL)和時鐘相位(CPHA)控制。
SPI通信流程:主設初始化SPI->主設備選中從設備->主設備發送數據(MOSI)并接收數據(MISO)->主設備釋放從設備RS485半雙工異步:如果跑Modbus協議則是單主多從,A+B雙線制,差分信號,信息通過兩條線路的電壓差來表示,抗干擾能力強。
總線兩端接120Ω終端電阻是為了解決信號反射問題,提高通信穩定可靠。CAN半雙工異步:CAN網絡中沒有主從設備區別,一個CAN節點由控制器和收發器兩個硬件部分組成。
CANH+CANL雙線制,差分信號,有閉環(串120Ω終端電阻)和開環(串2.2kΩ終端電阻)兩種總線拓撲結構。
采用廣播通信的方式,一個CAN節點發送的數據幀可以被總線所有節點接收。
CAN網絡通信有5種類型幀:數據幀、遙控幀、錯誤幀、過載幀、幀間空間
CAN網絡數據幀組成:幀起始+仲裁段+控制段+數據段+CRC段+ACK段+幀結束(同步通信共用時鐘線,異步通信無專用時鐘線,靠波特率約定)
(RS485(4線)全雙工異步: A+B信號線,DE+RE方向線,差分信號)
5、TCP、UDP的區別
TCP:可靠、面向連接的協議、網頁瀏覽電子郵件場景、三次握手建立連接、四次揮手關閉連接UDP:不可靠、無連接的協議、視頻音頻在線游戲場景
6、OSI網絡模型:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層
7、常見的濾波算法:一階補償濾波、算術平均濾波、中位值濾波、限幅平均濾波、滑動平均濾波、卡爾曼濾波
8、二分法:在有序數組中查找特定元素的搜索算法,時間復雜度最低
五、C/C++
1、New(C++)和malloc(C)都是動態分配內存的方法,他們的區別如下:
1、內存分配位置:new操作從自由存儲器為對象動態分配內存空間,malloc函數從堆上動態分配內存。
2、內存分配成功返回類型:new操作內存分配成功返回對象類型的指針,malloc函數返回的是void*。
3、內存分配失敗返回類型:new操作內存分配失敗拋出bac_alloc異常,malloc函數返回的是NULL。
4、是否指定內存大小:new申請內存時不需要指定內存塊大小,系統自動分配,malloc函數需要顯性指出所需內存塊大小。
2、指針和引用的相同和區別:
1、相同點:都是間接訪問內存的方式、本身都占內存、都可以訪問動態分配的內存
2、不同點:指針是實體,存儲一個指向內存單元的地址。而引用是原變量的別名,存儲的是原變量的值。
3、C語言中extern 的作用:是為了在C++中使用C語言的編譯和鏈接方式,并且在一些特定情況下保證函數的正確導出和導入。
4、Char和int之間轉換:例如:char c=’A’; int i=(int)c;
5、Static的用法:靜態變量只初始化一次,在程序開始時被分配內存,并且只能在定義的作用域中被使用。
6、Const的用法:使用該關鍵詞定義的變量告知編譯器無法被修改。并且將常變量存儲在符合表中,而不是內存中。放在函數中確保返回值不會被修改。
7、Volatile的作用:保證變量的可見性和一致性。
8、Sizeof和strlen的區別:對于char str[]=”hello”; Sizeof(str)結果是6,strlen結果是5。對于int arr[]={1,2,3}; sizeof(arr)的結果是sizeof(int)*3即數組長度,strlen()函數因為數組沒有’\0’無法計算
C里面全局變量和全局靜態變量放在靜態存儲區里面,
C里面全局常量放在只讀數據段里面
C里面局部變量和局部常量放在棧里面
C里面用戶定義的(malloc),放在堆里面
13、虛函數是C++實現運行時多態的核心機制。基類函數聲明Virtual,派生類中才能使用override重寫函數。