嵌入式軟件面試總結(jié)

一、進(jìn)程和線程

基礎(chǔ)概念網(wǎng)上都有,面試的時(shí)候關(guān)于概念只要清楚一下幾點(diǎn)

更多概念(有一個(gè)火車也挺形象)可以看看知乎大佬是這么說(shuō)的

  1. 進(jìn)程(處理器資源的基本單元)等于是cpu給你分配資源,不干活,相當(dāng)于倉(cāng)庫(kù)。線程(任務(wù)執(zhí)行的最小單位)就是干活。

  2. 一個(gè)進(jìn)程里面至少一個(gè)線程,線程是依賴于進(jìn)程上的,相當(dāng)于干活的人必須在倉(cāng)庫(kù)里干活。

  3. 同一個(gè)進(jìn)程里的線程是可以共同訪問(wèn)這個(gè)進(jìn)程的資源的(涉及到資源訪問(wèn)沖突的問(wèn)題以及解決方法-互斥鎖)

2.5 C語(yǔ)言互斥鎖使用方式(死鎖及解決方法)

pthread_mutex Lock = PTHREAD_MUTEX_INITIALIZER;//聲明鎖 全局變量
pthread_mutex_init(&Lock,NULL);//初始化鎖
pthread_mutex_lock(&Lock);//上鎖
pthread_mutex_unlock(&Lock);//解鎖
//舉例
void func_a(){
    int cnt=0;
    while(cnt<5){
        pthread_mutex_lock(&Lock);//判斷是否上鎖
        printf("a\n");
        cnt++;
        pthread_mutex_unlock(&Lock);//解鎖
    }
}

void func_b(){
    int cnt=0;
    while(cnt<5){
        pthread_mutex_lock(&Lock);//判斷是否上鎖
        printf("b\n");
        cnt++;
        pthread_mutex_unlock(&Lock);//解鎖
    }
}

int main(){
    pthread_mutex_init(&Lock,NULL);//初始化鎖
   
    pthread_t thread_a;//創(chuàng)建a線程ID
    pthread_create(&thread_a, NULL, (void *)func_a, NULL);//創(chuàng)建線程
    pthread_detach(thread_a);//線程結(jié)束后 資源自動(dòng)回收
    
    pthread_t thread_b;//創(chuàng)建b線程ID
    pthread_create(&thread_b, NULL, (void *)func_b, NULL);//創(chuàng)建線程
    pthread_detach(thread_b);//線程結(jié)束后 資源自動(dòng)回收
    while(1);
}

更多的還有線程的喚醒與等待(pthead_cond_init, pthread_cond_signal, pthread_cond_wait),就是線程在訪問(wèn)鎖住資源的時(shí)候開始等待,資源一釋放就喚醒開始工作,防止資源再次被鎖住,不過(guò)問(wèn)的不多。

  1. C語(yǔ)言創(chuàng)建及銷毀線程的方式
pthread_t thread_ID;//創(chuàng)建線程ID
pthread_create(&thread_ID, NULL, (void *)function, NULL);//創(chuàng)建線程 對(duì)應(yīng)到函數(shù)function
pthread_detach(thread_ID);//線程資源回收
pthread_exit(thread_ID);//終止線程

線程收尸這里涉及到pthread_detach與pthread_join的區(qū)別,就是一個(gè)結(jié)束了自動(dòng)回收線程占有的資源,一個(gè)手動(dòng)釋放線程占有的資源,詳見這里。不過(guò)這個(gè)面試問(wèn)的也不多。

  1. C語(yǔ)言創(chuàng)建及銷毀進(jìn)程的方式(這里我也不是很懂 如果問(wèn)父進(jìn)程和子進(jìn)程一些資源回收問(wèn)題 就直接說(shuō)自己在子進(jìn)程創(chuàng)建上涉獵不多 只直到進(jìn)程間的一些通信方式)
fork();//創(chuàng)建子進(jìn)程
getpid();//獲得當(dāng)前pid
getppid();//獲取父進(jìn)程PID
execv();//進(jìn)程中加載可執(zhí)行文件
exit();//終結(jié)進(jìn)程

\我這里進(jìn)程間通信基本都說(shuō)是用的套接字通信(套接字就是socket) 就是一個(gè)進(jìn)程作為客戶端,一個(gè)進(jìn)程作為服務(wù)器,通過(guò)TCP/IP進(jìn)行通信,順便引導(dǎo)一波,說(shuō)一下TCP握手,顯示你對(duì)網(wǎng)絡(luò)通信有基本了解。

  1. 進(jìn)程的一些狀態(tài),只需要掌握就緒、運(yùn)行和阻塞三個(gè)基本狀態(tài)即可,詳細(xì)可以了解三個(gè)狀態(tài)的原因以及部分其他狀態(tài)

二、開發(fā)與調(diào)試

  1. 首先得知道平時(shí)上層應(yīng)用的開發(fā)工具
    c語(yǔ)言開發(fā):gcc(面向linux的c語(yǔ)言開發(fā)工具), arm-linux-gcc(面向arm平臺(tái)的c語(yǔ)言開發(fā)工具)
    c++開發(fā):g++(面向linux的c++開發(fā)工具), arm-linux-g++(面向arm平臺(tái)的c++開發(fā)工具)
    通常開發(fā)流程:
//在linux環(huán)境(ubuntu)下編寫好c文件 以hello.c為例
arm-linux-gcc -o hello hello.c//運(yùn)行arm-linux-gcc 
//其中-o表示輸出(output) 輸出可執(zhí)行文件hello 其中源文件為hello.c
//里面就涉及到了文件生成四步驟:預(yù)處理、編譯、匯編和連接
//將hello文件移植到arm平臺(tái)(arm-linux) 執(zhí)行即可
./hello  //執(zhí)行二進(jìn)制文件 顯示hello world
//在面向大工程 多文件編譯時(shí) 需要編寫makefile文件 執(zhí)行多條gcc語(yǔ)句(批處理)

在出現(xiàn)bug時(shí),通常通過(guò)printf直接輸出變量信息或者gdb斷點(diǎn)調(diào)試,以gdb調(diào)試為例
GDB調(diào)試流程

//在linux環(huán)境(ubuntu)下編寫好c文件 以hello.c為例
arm-linux-gcc -g -o hello hello.c//運(yùn)行arm-linux-gcc 
//這里-g表示帶有g(shù)db調(diào)試功能選項(xiàng)的可執(zhí)行文件輸出
gdb hello//通過(guò)gdb工具直接運(yùn)行hello可執(zhí)行文件
//gdb常用語(yǔ)句
//break(簡(jiǎn)寫 b) :格式 b 行號(hào),在某行設(shè)置斷點(diǎn)
//run(簡(jiǎn)寫 r) :運(yùn)行程序直到遇到 結(jié)束或者遇到斷點(diǎn)等待下一個(gè)命令;
//continue、step、next : 均為首字母 c, s, n

三、通信模塊

基礎(chǔ)概念要知道常用的通信模塊:


通信常用接口

I2C、SPI以及USB因?yàn)橛玫牟欢啵灾灰私馑麄兊墓ぷ鞣绞竭€有同步異步就可以
UART因?yàn)橛玫亩?,要清楚基本的信息,例如停止位、校?yàn)位還有中斷是單字節(jié)接收,一般的波特率設(shè)置以及波特率的意義都要清楚。然后面試官一般就會(huì)開始問(wèn)你中斷的一些問(wèn)題,設(shè)置中斷要注意什么,中斷流程之類的。
網(wǎng)口只要知道上面說(shuō)的套接字通信方式即可,一般工控ARM-LINUX會(huì)設(shè)有兩個(gè)網(wǎng)口,一個(gè)用于外網(wǎng)傳輸,一個(gè)用于本地配置

中斷流程

1.根據(jù)響應(yīng)的中斷源的中斷優(yōu)先級(jí), 使相應(yīng)的優(yōu)先級(jí)狀態(tài)觸發(fā)器置1;
2.把當(dāng)前程序計(jì)數(shù)器PC的內(nèi)容壓入堆棧,保護(hù)斷點(diǎn),尋找中斷源;
3.執(zhí)行硬件中斷服務(wù)子程序調(diào)用;
4.清除相應(yīng)的中斷請(qǐng)求標(biāo)志位(串行口中斷請(qǐng)求標(biāo)志RI和TI除外);
5.把被響應(yīng)的中斷源所對(duì)應(yīng)的中斷服務(wù)程序的入口地址(中斷矢量)送入PC, 從而轉(zhuǎn)入相應(yīng)的中斷服務(wù)程序。
6.中斷返回,程序返回?cái)帱c(diǎn)處繼續(xù)執(zhí)行。

ISR(中斷服務(wù)處理要求)

1、ISR不能有返回值 ;
2、ISR不能傳遞參數(shù);
3、ISR應(yīng)該是短而高效的,在ISR中做浮點(diǎn)運(yùn)算是不明智的;
4、ISR中不應(yīng)該有重入和性能上的問(wèn)題,因此不應(yīng)該在中斷函數(shù)中使用pintf()函數(shù)。

四、其他

零散知識(shí)
1.帶操作系統(tǒng)和不帶操作系統(tǒng)的區(qū)別有哪些(linux、ucos與單純的stm32以及51的區(qū)別)
2.什么時(shí)候多線程好一點(diǎn),什么時(shí)候多進(jìn)程好一點(diǎn)
3.知道read函數(shù)的具體實(shí)現(xiàn)流程嗎
4.用戶態(tài)和內(nèi)核態(tài)切換的方式有哪幾種
5.簡(jiǎn)單說(shuō)一下uboot啟動(dòng)流程把
6.為什么uboot啟動(dòng)需要關(guān)閉cache

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

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