嵌入式軟件面試八股文

目錄

一、指針函數和函數指針

二、指針的大小

三、sizeof 和 strlen 區別

四、數組指針和指針數組

五、C語言里面內存分配的方式

六、struct結構體和union聯合體的區別

八、數組和鏈表的區別

九、寫一個宏這個紅返回輸入參數比較小的一個

?十,使用#include<> 和使用 include " "? 區別

十一、全局變量和局部變量的區別

十二、define 和 typedef的區別

十三、static的作用

十四、什么是內存泄漏

十五、內存對齊(字節對齊)

十六、數組名和指針的區別

十七、指針常量和常量指針

十八、堆和棧的區別

?十九、malloc 和 new 的區別

二十、class和struct在c++的區別

二十一、c++的類有幾個訪問權限

二十二、內斂函數?

二十三、實現拷貝strcpy函數

二十四、程序分為幾個段

二十五、隊列和棧的區別

二十六、一個.c 文件怎么轉化為可執行程序

二十七、SPI和IIC的尋址區別

?二十八、交叉編譯

?二十九、uart iic spi 的區別

三十、SPI有幾根線可以去除哪幾根

三十一、TCP和UDP的區別

三十二、線程和進程的區別

三十三、進程間通信有幾種方式

三十四、什么是DMA

三十五、進程的狀態

三十六、什么是僵尸進程,孤兒進程,守護進程

三十七、FreeRTOS的調度算法

?三十八、RTOS中任務同步的方式

三十九、RTOS中時間片的大小是由什么決定的

四十、FreeRTOS中任務的狀態

四十一、環行緩沖區

四十二、PWM

四十三、if兩種寫法

四十四、UDP和TCP通信建立流程

四十五、IIC的GPIO配置為什么要使用開漏輸出,并且為什么需要上拉電阻

四十六、大小端的概念和判斷

四十七、LInux和RTOS的區別

四十八、看門狗定時器

四十九、面向對象的三大特征

五十、fork和vfork的區別

五十一、當for循環遇到fork函數

?五十二、GPIO的工作模式

?五十三、UART 和 USART 的區別

五十四、OSI7層模型和 TCP/ IP四層模型

五十五、什么是MQTT協議

五十六、RAM,ROM,Flash 的區別

五十七、FreeRTOS 和 RT - Thread


一、指針函數和函數指針

指針函數:返回值是一個指針的函數

函數指針:指向一個函數的指針

二、指針的大小

指針的大小跟編譯器的位數有關,在32bit系統下,指針的大小是4個字節,在64bit系統下,指針大小是8字節

三、sizeof 和 strlen 區別

sizeof 是一個運算符,它計算的是所占內存的長度,還可以計算 int(4字節) char等類型的大小

strlen 是一個函數,計算的是字符串的長度,字符串以? “\0” 結尾

printf("%d %d \n",sizeof("\0"),strlen("\0"));結果輸出    2    0由于sizeof計算的是內存的大小,而"\0"也是一個字符串,而字符串是以"\0"結尾的,故后面還省略了一個"\0",所以是兩個。而strlen是計算字符串長度的,"\0"是不需要計算長度的,所以為0

四、數組指針和指針數組

1、數組指針指的是指向數組的指針,本質是一個指針

2、指針數組本質是一個數組,里面每一個元素都是指針

eg.int (*p)[10];        數組指針的聲明int* p[10];          指針數組的聲明

五、C語言里面內存分配的方式

1、靜態存儲區的分配? ? ? ? 例如全局變量,靜態變量

2、棧上分配(函數中定義出的局部變量)

3、堆上分配(malloc,new)

六、struct結構體和union聯合體的區別

1、union 聯合體 :成員共享一塊地址,共用體大小 = 成員中占內存最大的成員大小

2、struct 結構體:不同成員放在不同的地址中,結構體大小 = 所以成員大小之和(字節對齊)

? ? ? ? ? ? ? ? ? ? ? ? ? ??? ?(字節對齊不清楚的,看下面十五的內容)

七、野指針是什么,為什么導致野指針

野指針是指向不可以內存的指針

是指指針指向的內存已經被釋放或失效,但指針本身未被置空,仍然保留著原來的地址。這樣的指針稱為“野指針”,訪問它會導致未定義行為(Undefined Behavior, UB),可能引發程序崩潰、數據損壞或安全漏洞。

1、當指針被創建的時候,沒有賦值,那么就會變成野指針

char* p    野指針char* p = NULL    正確初始化指針

2、當指針被?free 或 delete 后如果沒有將指針賦值為NULL,也會變成野指針

char* p1 = malloc(10);
free(p1);                沒有賦值,變成野指針p1 = NULL;  // 消除野指針

3、指針越界也是野指針

#include <stdio.h>
#include <stdlib.h>int main() {int *arr = malloc(5 * sizeof(int));  // 分配 5 個 int 的空間if (!arr) return -1;// 錯誤:越界寫入(arr[5] 超出分配的內存范圍)for (int i = 0; i <= 5; i++) {  // 錯誤:i <= 5(合法索引是 0~4)arr[i] = i;                 // 當 i=5 時,越界寫入!}// 此時 arr 可能已被越界操作破壞,變成野指針printf("%d\n", arr[0]);  // 可能正常,也可能崩潰(取決于越界是否破壞了指針)free(arr);  // 可能崩潰,因為 arr 可能已被越界操作損壞return 0;
}

八、數組和鏈表的區別

1、數組的地址空間是連續的,訪問速度快,直接通過下標訪問,增刪改查麻煩

2、鏈表的地址空間是不連續的,訪問速度慢,需要遍歷鏈表,增刪改查方便

九、寫一個宏這個紅返回輸入參數比較小的一個

#define MIN(a,b) ( (a) <= (b) ) ? (a) : (b) 

注意:

這里define只做一個替換的作用,它不會檢查語法和計算運算結果,需要把每一個變量都用括號括起來,防止出現問題

?十,使用#include<> 和使用 include " "? 區別

#include<>? :編譯器會從標準庫的路徑里面去搜索,對于搜索標準庫的文件速度會比較快

include " "? ? :編譯器會從用戶的工作路徑里面去搜索,對于自己定義的文件使用這個會比較快,比如自己定義的 .h .c 文件

十一、全局變量和局部變量的區別

1、作用域,全局變量的作用域為程序塊,局部變量的作用域是當前函數內部

2、生命周期,全局變量的生命周期是整個程序,局部變量的生命周期是當前函數

3、存儲方式不同,局部變量是存儲在棧里面的,全局變量是存儲在靜態存儲區里面的

4、使用方式不同,局部變量在程序的各個部分都可以使用到,局部變量的話只能在函數的內部使用

十二、define 和 typedef的區別

1、define是一個預處理指令,typedef是關鍵字

#define PI 3.1415926  // 宏定義void func1() {printf("%f\n", PI);  // 可用
}
===========================================================typedef int MyInt;  // 全局作用域void func1() {MyInt x = 10;  // 可用(全局 typedef)printf("%d\n", x);
}

2、define不會做正確性檢查,而typedef會做正確性檢查

3、define沒有作用域的限制

  • 從定義點開始,直到文件末尾(或遇到?#undef),無視函數、代碼塊等作用域

typedef是有作用域的限制

  • 如果定義在全局,則作用域為文件。

  • 如果定義在函數或代碼塊內,則只在該區域內有效。

4,對指針的操作不同

?

十三、static的作用

?static的作用是定義一個靜態變量或者一個靜態函數

1、在函數體中使用static去定義變量,那么這個變量就只會被初始化一次

2、定義的靜態函數或者是靜態變量就只能在當前文件使用(作用域的限制)

3、在函數內定義的靜態變量無法被其它函數使用

十四、什么是內存泄漏

內存泄漏指的是在程序運行的時候,動態分配的空間沒有被回收或者是正確釋放,導致了這個內存空間還占據者系統的資源

也就是當你 malloc 動態開辟一個空間時,使用完后沒有及時的 free 或者 delete 它 就會造成內存泄漏

十五、內存對齊(字節對齊)

內存對齊時在存儲數據時,數據按照一定的規則放置在內存中的過程

以最大的變量所占據的內存來進行分配空間

?下圖是字節對齊的示例:

注意

一、結構體變量的首地址是最長成員長度的整數倍。

二、每個成員相對結構體首地址的偏移量,一定是該成員長度的整數倍
三、結構體的總長度是最長成員長度的整數倍。

四、如果結構體內有成員長度大于處理器的位數那么就以處理器的位數作為對齊單位,?

十六、數組名和指針的區別

1、數組名就是數組首元素的地址,也可以看作一個常量指針,這個指針時不能修改指向,內存訪問為4個字節

2、使用指針訪問數組的時候需要訪問到解引用使用*,使用指針訪問數組是間接訪問,使用數組名訪問是直接訪問

int arr[5] = {10, 20, 30, 40, 50};
int *ptr = arr;  // ptr 指向數組首元素// 使用指針遍歷數組
for (int i = 0; i < 5; i++) {printf("%d ", *(ptr + i));  // 解引用訪問元素
}
  • 指針存儲的是地址,訪問數組元素需要:

    1. 計算偏移量ptr + i)得到目標地址。

    2. 解引用*)獲取該地址的值。

  • 間接訪問:指針先找到地址,再通過地址訪問數據(多一步尋址)。

  • 靈活性強:指針可以隨意移動(如?ptr++),適用于動態內存(如?malloc?分配的數組)。

int arr[5] = {10, 20, 30, 40, 50};// 使用數組名遍歷
for (int i = 0; i < 5; i++) {printf("%d ", arr[i]);  // 直接通過索引訪問
}
  • 數組名是首元素地址的常量指針(類型為?int[5]),但編譯器會優化為直接訪問。

  • 直接訪問

    • arr[i]?會被編譯為?*(arr + i),但編譯器可能直接計算內存位置,無需運行時尋址。

    • 類似于“硬編碼”偏移量,效率可能更高(尤其在循環中)。

  • 不可修改:數組名是常量,不能執行?arr++?這樣的操作。

3、使用sizeof對指針和數組名進行計算的時候是不同的,指針的大小和編譯器的位數有關,使用sizeof計算數組名是整個數組的大小

十七、指針常量和常量指針

常量指針:指的是向一個常量的指針,這個指針無法修改所指向的數據,但是可以修改指向

int a = 10;
const int b = 20;const int *ptr = &a;  // 指向變量 a(但通過 ptr 不能修改 a)
// *ptr = 30;        // 錯誤!不能通過 ptr 修改 a
ptr = &b;            // 正確!可以修改指針指向 bprintf("%d\n", *ptr); // 輸出 20

?指針常量:指指針是一個常量,指針所指向的地址是固定的,但是可以修改地址中的值

int a = 10;
int *const ptr = &a;  // ptr將永遠指向a的地址

十八、堆和棧的區別

1、創建方式不同

棧是自動創建(棧主要用于局部變量),但函數執行完成,棧被銷毀

堆是程序員手動進行創建和釋放的,malloc進行創建,free進行釋放

2、空間大小的區別,棧的空間比較小,堆的空間比較大

3、訪問速度,棧的訪問速度是比堆快的

為什么棧存儲局部變量?

  • 高效:棧的分配和釋放只需移動指針,速度快。

  • 自動管理:函數返回時,棧幀自動彈出,變量銷毀,無需手動釋放。

為什么使用堆內存?

  1. 需要大內存(如大型數組、動態數據結構)。

  2. 生命周期需靈活控制(如跨函數使用數據)。

  3. 棧空間不足時(遞歸深度大或局部變量過多)。

?十九、malloc 和 new 的區別

1、malloc 是c語言中的標準庫函數,new是c++中的操作符

2、malloc分配內存后返回的是void* 類型的指針,new 分配內存后返回的是對應對象類型的指針

3、使用malloc分配內存的時候需要指定分配內存的大小,使用new進行內存分配時不需要指定

4、使用malloc分配內存的時候不會調用到構造函數,使用new分配內存時會調用到構造函數

二十、class和struct在c++的區別

1、struct成員默認時公有的,class默認的成員是私有的

2、繼承方面,struct默認是公有繼承,class默認是私有繼承

3、使用常見,struct一般是用于做簡單的數據結構,class一般用于封裝和繼承

二十一、c++的類有幾個訪問權限

1、在c++中分別有三個訪問權限:公有的、私有的,受保護的

2、public,當成員聲明為public時,就可以在類的外部進行訪問

3、private,當成員聲明為private時,只能在類的內部使用

4、protected,當成員聲明為protected時,只能在類內部或者時子類中進行訪問

二十二、內斂函數?

1、是一種特殊的函數聲明方式,通過在函數簽名加上inline關鍵字,來指示編譯器

2、減小函數調用的開銷

3、提高執行的效率

4、允許編譯器進行優化進一步提高性能

二十三、實現拷貝strcpy函數

用于將一個字符串(包括終止符?\0)復制到另一個字符串

char *strcpy(char *dest, const char *src);dest:目標字符串(復制到的地址)src:源字符串(被復制的字符串)返回值:返回 dest 的地址(便于鏈式調用)

二十四、程序分為幾個段

1、代碼段,用于存儲程序的可執行指令,一般是只讀的,防止被修改

2、數據段(Data段):用于存儲已經初始化的全局變量和靜態變量

3、BSS段:存儲沒有初始化的全局變量和靜態變量

4、堆:malloc 和 free 進行管理

5、棧:存儲局部變量,棧的申請和釋放都是由操作系統來決定的

二十五、隊列和棧的區別

1、訪問的方式:棧是先進后出,隊列是先進先出

2、棧:只能在棧頂進行操作? ? ?隊列:在隊尾進行插入,在隊首進行刪除

3、應用場景:棧主要在函數調用和表達式求值? ? ? ? 隊列主要在任務調度和廣度優先搜索

二十六、一個.c 文件怎么轉化為可執行程序

1、預處理:將頭文件和宏定義進行展開,生成沒有注釋的源代碼? ? ? ? ?.i 文件

2、編譯:將預處理得到的源代碼轉化為匯編代碼? ? ? ? .s 文件

3、匯編:將匯編的代碼轉換為機器碼生成對應的目標文件? ? ? ? ?.o文件

4、鏈接:將全部的 .o? 文件鏈接成一個可執行文件? ? ? ? .hex文件

二十七、SPI和IIC的尋址區別

  • I2C 靠地址尋址SPI 靠片選尋址

?二十八、交叉編譯

交叉編譯指的是在一個平臺上編譯出另一個平臺的可執行程序

交叉編譯是指在一種計算機平臺(主機,Host)上編譯生成另一種平臺(目標機,Target)可執行的代碼。例如:

  • 在?x86 電腦?上編譯?ARM 開發板?的程序。

  • 在?Windows 系統?上編譯?Linux 系統?的可執行文件。

?二十九、uart iic spi 的區別

1、uart:異步通信的方式,沒有時鐘線

????? iic 和 spi 都是同步通信,SCL SCLK

2、接線的區別

UART: TX,RX

SPI:SCLK(時鐘線)? CS(片選引腳)? MOSI(主機輸出從機輸入)? ?MIS0(主機輸入從機輸出)

IIC:SDA(數據線)? SCL(時鐘線)

3、設備數量
UART:一對一通信
IIC:支持多主機和多從機之間的通信
SPI:一主機多從機

4.傳輸速度
UART: 115200 9600
IIC:標準模式(100kbps)快速模式(400kbps)高速模式(3.4Mbps)
SPI:

5.工作模式

UART:全雙工,半雙工

IIC:半雙工

SPI:全雙工

  • 用 UART
    需要簡單、低速、點對點通信(如調試日志)。

  • 用 I2C
    設備數量少、引腳有限、速度要求不高(如傳感器網絡)。

  • 用 SPI
    需要高速、全雙工通信或設備地址沖突時(如存儲芯片、顯示屏)。

?全雙工(Full Duplex)

  • 定義:通信雙方可以同時進行數據的發送和接收

  • 特點

    • 需要獨立的發送和接收通道(如兩根數據線)。

    • 實時性強,效率高。

  • 典型應用

    • 電話通話(雙方能同時說話和聽聲)。

    • UART(通過 TX 和 RX 線實現全雙工)。

    • SPI(通過 MOSI 和 MISO 線實現全雙工)。

?????????

半雙工(Half Duplex)

  • 定義:通信雙方可以雙向傳輸數據,但不能同時進行(需分時復用同一通道)。

  • 特點

    • 只需單根數據線,但需要協議控制方向(如切換發送/接收模式)。

    • 效率較低(需等待對方傳輸完成)。

  • 典型應用

    • 對講機(同一時間只能一方說話)。

    • I2C(通過 SDA 線分時傳輸數據)。

    • RS-485(工業總線,需方向控制)。

三十、SPI有幾根線可以去除哪幾根

SPI有四根線

1、SCLK:時鐘線,用于同步數據傳輸時的時序控制

2、MOSI:主設備輸出,從設備輸入線

3、MIS0:主設備輸入,從設備輸出線77CS:片選線,用于選擇對應的從機設備

4、不需要進行雙向通信,MOSI,MIS0其中一根線去除

5、CS:只進行一對一通信的時候,不需要片選線

三十一、TCP和UDP的區別

1、數據的可靠性:TCP提供的是可靠的數據傳輸,三次握手,UDP無連接的,不可靠的數據通信

2、通信方式 TCP是面向連接的通信方式????????UDP是不需要進行連接

3、數據傳輸的效率UDP的通信速率比TCP快????????UDP丟包概率比較大

4、應用場景:TCP一般用于郵件,文件傳輸(FTP) ????????UDP:視頻在線游戲 直播

三十二、線程和進程的區別

1、定義:進程是資源分配的基本單位 線程是進程中的執行單元,CPU調度和執行的基本單位?

2、資源占用:每一個進程都有自己獨立的地址空間????????線程是共享進程的地址空間

3、容錯性:當一個進程出現問題不會影響到其他的進程執行? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? 線程出現問題可能會導致整個程序崩潰從而影響到其他的線程

4、調度和切換:進程是一個獨立的單位,需要恢復的上下文的內容就比較多,消耗的資源也就比較多,線程消耗的資源是比較少的

三十三、進程間通信有幾種方式

1.管道? ? 2.命名管道? 3.共亭內存(mmap)?? 4.信號量? ?5.消息隊列? ? 6.套接字(socket)? 7? 信號

1 3 4 5 6 都要借助系統內核

三十四、什么是DMA

DMA是一種無需CPU參與就可以讓外設和系統之間的內存進行雙向的數據傳遞

DMA:直接內存存取器

DMA可以減輕CPU的負擔提高系統的運行效率

????????????????

三十五、進程的狀態

創建狀態:當調用fork進入創建狀態

就緒狀態:進程已經準備好,但是還沒有運行

運行狀態:進程已經獲得系統的資源可以運行

阻塞狀態:等待信號量或者互斥量等事件的時候會進入這個狀態

終止狀態:進程結束

三十六、什么是僵尸進程,孤兒進程,守護進程

僵尸進程:使用fork創建的子進程后,如果子進程退出,父進程并沒有調用wait或者waitpid函數記錄子進程的退出狀態,那么這個子進程的信息還保存在系統中,這個時候這個子進程就叫做僵尸進程

因為父進程異常結束,子進程就會變成孤兒進程,會被進程號為1進程 init 收養

在父進程創建出子進程后故意把父進程結束那么這個進程就是守護進程

三十七、FreeRTOS的調度算法

1、搶占式調度:高優先級的任務可以打斷低優先級任務的執行(適用于優先級不同的任務)

?2、時間片輪轉:相同優先級的任務具有相同大小的時間片(1ms)當時間片被耗盡任務會強制退出

3、協作式調度:使用vtaskdelay釋放CPU的資源讓其他的任務來運行,信號量,互斥量等來實現

?三十八、RTOS中任務同步的方式

1、隊列:還可以進行數據的傳遞

2、信號量:在FreeRT0S中會分成兩種:二進程信號量(實現共享資源的訪問)計數型信號量(實現生產者和消費者模型)

3、互斥量:實現共享資源的訪問

4、事件組:可以等待多個任務的通知

5、任務通知:是一種輕量級的任務同步方式,TCB,任務通知不需要創建就可以使用(用于一對一的通信)

三十九、RTOS中時間片的大小是由什么決定的

直接通過修改freeRT0S配置文件宏定義的時間片頻率來設置時間片大小

在????????FreeRTosConfghlist.h? ? ? ? ?這個文件里面

#define configTICK RATE HZ     ((TickType_t)1000)//時間片的頻率 1000HZ = 1ms

四十、FreeRTOS中任務的狀態

1、就緒態:當任務被創建的時候就會進入到就緒態

2、運行態:當任務的代碼正在被執行的時候就是運行態

3、阻塞態:當任務在等待信號量或者是互斥量等的時候會進入阻塞態

4、掛起態:使用vTaskSuspend進入到掛起態

????????????????? ? ??

四十一、環行緩沖區

使用環形緩沖區經常被用于串口通信,socket,使用環形緩沖區可以將數據保存下來,使用R,W指針來進行數據的操作

?

四十二、PWM

PWM:脈沖寬度調制技術

占空比:高電平占整個周期的比例/整個周期*100%

四十三、if兩種寫法

if(x == 0)? ? ? ? ? ? ? ? if( 0 == x )

四十四、UDP和TCP通信建立流程

TCP客戶端

1.socket函數創建套接字
2.connect函數連接服務器
3.使用read write函數進行發送和讀取數據? send? ?recv? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4.使用close關閉客戶端?

TCP服務器

1.socket創建套接字
2.bind綁定IP地址和端口號
3.listen去監聽對應的端口
4.accept等待客戶端的連接
5.使用read write函數進行發送和讀取數據
6.使用close關閉服務器

UDP客戶端
1.socket創建套接字? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.sendto發送數據? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.recvform來接收服務器的消息? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4.close關閉客戶端

UDP服務器
1.socket創建套接字? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.bind進行綁定? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.recvferm接收數據? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4.sendw發送數據? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 5.關閉服務器

四十五、IIC的GPIO配置為什么要使用開漏輸出,并且為什么需要上拉電阻

因為IIC總線的兩個引腳都配置為了開漏輸出,開漏輸出無法輸出高電平,只能輸出低電平? ? ? ? ? 加入上拉電阻可以讓引腳輸出高電平

假設使用推挽輸出,一個設備輸出高電平,一個設備輸出低電平,這個時候會導致短路燒毀設備? 在IIC中可以掛載多個設備這個時候就需要區分是誰在使用IIC總線,實現了線與的功能,0&1&0=0

四十六、大小端的概念和判斷

概念:指多字節的數據在內存中的存儲順序方式,在不同的計算機中會使用不同的字節序來表示數據

大端存儲:高字節在低地址,低字節在高地址

小端存儲:低字節在低地址,高字節在高地址

0x12345678假設他的第一個字節是0x78那么這個系統為小端存儲假設第一個字節是0x12,那么這個系統是大端存儲

四十七、LInux和RTOS的區別

1、應用場景

Linux:桌面計算機,服務器,嵌入式系統。

RTOS:嵌入式系統

2、實時性

Linux不保證實時性

RTOS提供嚴格的實時性保證,任務的調度和執行時間非常可預測,任務的響應都非常快

3、資源占用

Linux比較龐大,占用的資源比較多

RTOS是輕量級的操作系統占用的資源比較少,RTOS適用于在嵌入式系統

4、內存方面

Linux有虛擬內存,內核空間和用戶空間

RTOS沒有虛擬內存,也沒有用戶空間和內核空間

5、擴展性

Linux的擴展性非常高,通過加載各種模塊和各種庫來達到擴展功能

RTOS擴展性比較有限,功能比較專門化

四十八、看門狗定時器

概念:
旨在檢測和恢復系統故障,它是一種硬件計時器,要求系統在規定的時間內定期對其進行復位(喂狗)。如果系統沒有及時復位看門狗,計時器將會溢出,并觸發一種預定的響應,通常是系統復位或重啟。

作用:

  1. 防止系統卡死:如果系統由于軟件錯誤、死鎖或其他原因導致無法繼續正常工作,看門狗定時器可以自動復位系統,從而防止系統長時間卡死。
  2. 提高系統可靠性:在任務關鍵的嵌入式應用中,如工業控制、汽車電子、醫療設備等,看門狗定時器是確保系統持續可靠運行的重要手段。
  3. 恢復程序運行:當系統由于不可預見的故障導致異常行為時,看門狗定時器可以讓系統迅速恢復到已知的初始狀態,減少故障的影響。

四十九、面向對象的三大特征

1.封裝(Encapsulation):

  • 封裝是將數據和操作這些數據的代碼(方法)放在一起,形成一個獨立的單元一一對象。對象的內部數據通常是私有的,只能通過公共方法訪問,從而保護數據不被隨意修改。
  • 例子:一個 car 對象有私有的 speed 屬性,只能通過 setspeed()和 getspeed()方法修改和獲取速度。

2.繼承(Inheritance):

  • 繼承允許一個類(子類)從另一個類(父類)繼承屬性和方法。子類可以重用父類的代碼,并可以添加或修改功能,
  • 例子:car 類可以繼承 vehic1e 類的屬性和方法,如 move(),然后添加 honk()方法。

3.多態(Polymorphism):

  • 多態是指同一操作在不同對象上可以表現出不同的行為。通常通過方法重寫實現,不同類的對象可以通過相同的接口調用不同的實現。
  • 例子:Dog 和 cat 都繼承自 Anima1,它們都有 speak()方法,但具體的 speak()實現不同.

五十、fork和vfork的區別

1、fork的子進程會拷貝父進程的數據段和代碼段,vork子進程和父進程共享數據段

2、fork創建出的子進程和父進程執行的順序不確定,vfork保證了子進程先運行

3、當需要改變共享數據段的變量的時候才會拷貝父進程

4、vfork保證子進程先運行,在它調用exec或者是exit之后父進程才可能被調度執行,如果在調用這兩個函數之前子進程依賴父進程的下一步操作這個時候會發生死鎖

五十一、當for循環遇到fork函數

for (int i = 0; i<3; i++)
{fork();
}

初始進程 P1:在第一次 fork()調用時創建了進程 P2,
第二次循環:P1 和 P2 分別創建了 P3 和 P4.
第三次循環:P1、P2、P3、P4各自再創建一個進程,最終有8個進程:P1 到 P8.

五十二、SPI的工作模式

SR!(串行外設接口,SerialPeripheralinterface)有四種不同的工作模式,主要是由時鐘極性(CPOL)和時鐘相位(CRHA)這兩個參數來決定的。它們決定了時鐘信號如何與數據交換進行同步。

1.SP!的基本概念
SP!是一種全雙工、同步的通信協議,常用于短距離的芯片間通信。它包括以下四個基本信號線:

  • MOSl(Master Out Slave In):主設備發送數據,外設接收數據。
  • MISO(Master In Slave Out):外設發送數據,主設備接收數據。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  • SCLK(Serial Clock):時鐘信號,由主設備生成
  • SS/cs(Slave Select/Chip Select):選擇某個從設備的信號線,低電平時選中從設備。

2.時鐘極性(CPOL) 和時鐘相位(CPHA)

  • CPOL:控制時鐘空閑狀態時的電平????????????????????????????????????????????????????????????????????????????????

?CPOL=0:時鐘空閑時為低電平

?CPOL=1:時鐘空閑時為高電平0

  • CPHA:控制數據是在時鐘的第一個還是第二個跳變邊沿采樣。

CPHA=0:在第一個時鐘跳變沿(從空閑到活動)采樣數據
CPHA-1:在第二個時鐘跳變沿采樣數據。

?五十二、GPIO的工作模式

?五十三、UART 和 USART 的區別

UART (Universal Asynchronous Receiver/Transmitter)和USART?(Universal synchronous / AsynchronousReceiver/Transmitter)都是用于串行通信的接口,主要區別在于它們支持的通信模式:

1. UART:

  • 通信方式:僅支持異步通信,即發送端和接收端不使用統一的時鐘信號
  • 時鐘信號:無時鐘信號,數據幀通過預定義的波特率進行同步。
  • 工作原理:發送端在開始位(start bit)后發送數據,接收端在沒有時鐘的情況下依賴波特率來解釋數據。
  • 應用場景:適用于點對點的低速數據通信。

2. USART

  • 通信方式:支持異步和同步通信兩種模式。

異步模式:與 UART 相同,沒有時鐘信號,依靠波特率同步。
同步模式:發送端和接收端共享時鐘信號,數據與時鐘同步傳輸。

  • 時鐘信號:在同步模式下使用時鐘信號進行同步通信。
  • 工作原理:

異步模式與 UART 相同。
同步模式下,發送和接收的數據與時鐘信號嚴格同步,提高通信的準確性和速度。

  • 應用場景:可以用于高速和高可靠性的串行通信,尤其是需要同步時鐘的場合。

五十四、OSI7層模型和 TCP/ IP四層模型

五十五、什么是MQTT協議

五十六、RAM,ROM,Flash 的區別

?

五十七、FreeRTOS 和 RT - Thread

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90864.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90864.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90864.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Gradle#Plugin

查看任務來自那個插件 /gradlew tasks --all <taskName>Java Plugin Java Library Plugin

滲透高級-----測試復現(第三次作業)

文章目錄測試復現一&#xff0c;環境搭建二&#xff0c;通過VS Code連接cacti三&#xff0c;測試測試復現 一&#xff0c;環境搭建 1&#xff0c;在ubuntu虛擬機上安裝MySql數據庫&#xff1a; apt-get upgrade # 更新apt-get upgrade apt-get update # 更新apt-ge…

LINUX727 磁盤管理回顧1;配置文件回顧

邏輯卷快照 快照為什么這么小RAID 磁盤陣列 raid 0 raid 1 raid5 raid10raid0 raid1 raid5 raid6 raid10 rank;create raid0 mdadm -c /dev/md0 -l 0 -n 2 /dev/sdb3 /dev/sdb4 raid1 mdadm -c /dev/md1 -l 1 -n 2 /dev/sdb5 /dev/sdb6 raid5 mdadm -c /dev/md5 -l 5 -n 3 -x …

【筆記】Einstein關系式 D = ukBT 的推導與應用研究

文章目錄從漲落理論和能量均分定理的數學推導基于平衡統計力學的推導1. 漂移流的來源&#xff1a;Jdrift?μρ?UJ_{drift} -μρ?UJdrift??μρ?U物理機制粒子流的形成2. 擴散流的來源&#xff1a;Jdiffusion?D?ρJ_{diffusion} -D?ρJdiffusion??D?ρ3. 熱平衡要…

AJAX 原理_第一節_XHR 對象

文章目錄1.AJAX原理1.1 初識XML1.2 查詢參數1.3 案例-地區查詢1.4 案例-注冊-設置請求頭1.AJAX原理 1.1 初識XML AJAX原理是什么? XMLHttpRequest對象 XHR對象定義: 通過XMLHttpRequest可以在不刷新頁面的情況下請求特定URL,獲取數據.這允許頁面在不影響用戶操作的情況下,更…

BeautifulSoup 使用詳解與實戰示例

BeautifulSoup 是一個用于解析HTML和XML文檔的Python庫&#xff0c;它能夠將復雜的HTML文檔轉換成一個復雜的樹形結構&#xff0c;使得我們可以輕松地查找和提取所需的內容。下面我將詳細介紹BeautifulSoup的使用流程&#xff0c;并結合實際示例進行說明。一、安裝與基礎使用1.…

LangChain實戰——實現多輪對話 + Function Calling

隨著大語言模型&#xff08;LLMs&#xff09;的迅猛發展&#xff0c;“Function Calling”&#xff08;函數調用&#xff09;逐漸成為一個重要的能力&#xff0c;它使得模型不僅能聊天&#xff0c;還能像“中控大腦”一樣調用外部函數完成具體任務&#xff0c;比如查天氣、調用…

湖南(源點咨詢)市場調研 如何在行業研究中快速有效介入 起頭篇

行業研究從業人員經常需要在承接研究案子后快速的摸清委托方所在行業。而俗話說&#xff0c;隔行如隔山&#xff0c;快速了解行業&#xff0c;主要用于行業分析報告及為市場細分準入進行前期鋪墊&#xff0c;要想摸清一個行業&#xff0c;需要長期持續的跟蹤。了解一個行業&…

【c++】從 “勉強能用” 到 “真正好用”:中文問答系統的 200 行關鍵優化——關于我用AI編寫了一個聊天機器人……(16)

先看核心結論&#xff1a;兩段代碼的本質區別如果用一句話總結兩段代碼的差異&#xff1a;前者是 “帶中文支持的問答系統”&#xff0c;后者是 “真正適配中文的問答系統”。具體來說&#xff0c;兩段代碼的核心功能都是 “加載問答數據→接收用戶輸入→匹配答案”&#xff0c…

VR 技術在污水處理領域的創新性應用探索?

在廣州&#xff0c;VR 污水處理技術的應用可謂是多點開花。首先&#xff0c;在污水處理流程模擬方面&#xff0c;工程師們利用 VR 技術創建了高度逼真的污水處理廠三維模型&#xff0c;將污水處理的整個流程&#xff0c;從預處理去除大顆粒雜質和懸浮物&#xff0c;到初級處理通…

深度學習暑期科研項目(兩個月發EI論文)

深度學習暑期科研項目&#xff08;8周發EI論文&#xff09; 哈爾濱工業大學博士的六大選題對本科生而言&#xff0c;越早接觸系統的科研訓練開始上手科研項目&#xff0c;就越能在未來的升學求職中占據很大的優勢。暑假是提升個人簡歷、豐富科研經歷的最佳時期&#xff01;哈爾…

【RH134 問答題】第 1 章 提高命令行運行效率

目錄#!/bin/bash 是什么意思&#xff1f;PATH 變量有什么重要作用&#xff1f;echo 命令的作用是什么&#xff1f;解釋下列正則表達式的含義簡述正則表達式和 shell 模式匹配的區別&#xff0c;在 shell 命令使用正則表達式的時候需要注意什么&#xff1f;#!/bin/bash 是什么意…

OpenCV(02)圖像顏色處理,灰度化,二值化,仿射變換

【OpenCV&#xff08;01&#xff09;】基本圖像操作、繪制&#xff0c;讀取視頻 目錄圖像顏色加法灰度化二值化仿射變換圖像顏色加法 顏色加法 import cv2 as cv import numpy as np#讀圖 cao cv.imread(E:\hqyj\code\opencv\images\cao.png) pig cv.imread(E:\hqyj\code\o…

嵌入式——單片機的獨立按鍵

一、目的功能通過開發板上的獨立按鍵k1控制d1指示燈亮滅&#xff0c;k1一次亮再按一次滅。二、硬件原理圖三、消抖理解&#xff08;一&#xff09;核心原理&#xff1a;當事件被重復觸發時&#xff0c;設置一個延遲&#xff0c;只有在該時間內沒有新的事件被觸發&#xff0c;才…

機器學習的工作流程

&#x1f31f; 歡迎來到AI奇妙世界&#xff01; &#x1f31f; 親愛的開發者朋友們&#xff0c;大家好&#xff01;&#x1f44b; 我是人工智能領域的探索者與分享者&#xff0c;很高興在CSDN與你們相遇&#xff01;&#x1f389; 在這里&#xff0c;我將持續輸出AI前沿技術、實…

聚類里面的一些相關概念介紹闡述

一、性能度量外部指標&#xff1a;聚類結果與某個“參考模型”進行比較&#xff1b;系數&#xff1a; &#xff0c;其中的 表示樣本是否屬于某類簇&#xff1b; 指數&#xff1a;&#xff0c;其中 表示樣本在兩個聚類結果中都是同一類簇&#xff0c; 表示在其中一個聚類結果中…

mmap機制

先看這個 MMAP 機制通俗易懂-CSDN博客 一句話 **mmap(memory map)是操作系統提供的“把文件或設備直接映射到進程虛擬地址空間”的機制,Java 里對應 `MappedByteBuffer`。** --- ### 1. 技術本質 - 系統調用:`mmap()`(POSIX)、`CreateFileMapping`(Windows)。 …

嵌入式硬件篇---驅動板

制作 ESP32 驅動板的核心是 “搭建 ESP32 與外設之間的橋梁”—— 因為 ESP32 的 GPIO 引腳輸出電流很小&#xff08;最大 20mA&#xff09;&#xff0c;無法直接驅動大功率設備&#xff08;如電機、繼電器、電磁閥等&#xff09;&#xff0c;驅動板的作用就是放大電流 / 功率&…

UniappDay01

1.技術架構2.創建uniapp項目 通過HBuilderX創建 官網安裝創建uniapp vue3項目安裝uniapp vue3的編譯器在工具欄啟動微信小程序開啟服務端口模擬器窗口分離和置頂 通過命令行創建 3.pages.json和tabbar案例 pages.json用來配置路由&#xff0c;導航欄&#xff0c;tabbar等頁面類…

子空間投影,投影矩陣,最小二乘法

一、子空間投影 1.1 投影與誤差向量b 在 向量a 上的投影即 a 上離 b 最近的點&#xff1a; paTbaTaa p \frac{a^T b}{a^Ta}a paTaaTb?a 我們記 誤差 e b - p&#xff0c;顯然誤差e 和 a 是正交的。 1.2 投影矩陣向量b 在子空間S上的投影是S中離b 最近的向量p。 我們做如下推…