新華書店的做的數(shù)字閱讀網(wǎng)站51外鏈代發(fā)網(wǎng)
前言
?? 某團(tuán)硬件工程師的筆試題,個人感覺題目的價值還是很高的,分為選擇題和編程題,選擇題考的是嵌入式基礎(chǔ)知識,編程題是兩道算法題,一道為簡單難度,一道為中等難度
目錄
- 前言
- 選擇題
- 編程題
選擇題
- C語言中變量有一系列的命名規(guī)則,下列選項中,屬于錯誤的C語言變量命名規(guī)則的是:
A、C語言中變量名是字母、數(shù)字、下劃線組合
B、變量命名中不允許出現(xiàn)空格
C、C語言變量的開頭只能是字母或數(shù)字
D、變量名不可以是關(guān)鍵字,且嚴(yán)格區(qū)分大小寫
答案:選C
解析:C語言變量命名規(guī)則
- 關(guān)于字符設(shè)備驅(qū)動的并發(fā)和競態(tài),下列說法正確的是:
A、并發(fā)是多個執(zhí)行單元不同時被執(zhí)行
B、競態(tài)是并發(fā)的執(zhí)行單元對共享資源的訪問導(dǎo)致的競爭狀態(tài)
C、競態(tài)是自發(fā)的導(dǎo)致的競爭狀態(tài)
D、并發(fā)是兩個執(zhí)行單元同時被執(zhí)行
答案:選B
解析:并發(fā)是多個執(zhí)行單元同時、并行被執(zhí)行,而并發(fā)的執(zhí)行單元對共享資源的訪問會導(dǎo)致競態(tài),因此A、D錯。競態(tài)條件通常不是自發(fā)的,而是由并發(fā)執(zhí)行單元(進(jìn)程、線程等)之間的相互干擾造成的,因此C錯。
參考:避免競態(tài)的方式是給訪問的共享資源添加鎖:嵌入式驅(qū)動學(xué)習(xí)第一周——內(nèi)核的鎖機(jī)制
- 在我們使用FreeRTOS任務(wù)通知功能時,我們可以使用函數(shù)xTaskNotify()來發(fā)送任務(wù)通知,在FreeRTOS中,任務(wù)通知更新的方法不包括:
A、覆蓋接收任務(wù)的通知值
B、增加接收任務(wù)的通知值
C、減少接收任務(wù)的通知值
D、不覆蓋接受任務(wù)的通知值
答案:C
解析:任務(wù)通知可以通過如下方法更新接收任務(wù)的通知值:不覆蓋接收任務(wù)的通知值 ( 如果上次發(fā)送給接收任務(wù)的通知還沒被處理 ) 、覆蓋接收任務(wù)的通知值、更新接收任務(wù)通知值的一個或多個 bit、增加接收任務(wù)的通知值,因此選C
參考:FreeRTOS(8)----任務(wù)通知
- C語言的fopen函數(shù)中,mode字符規(guī)定了打開文件的模式,下列選項中,對于打開文件的模式描述錯誤的是:
A、‘r’ 表示以只讀方式打開文件,但是該文件必須存在
B、‘a(chǎn)+’ 表示以附加方式打開可讀寫的文件,且原文件內(nèi)容會被保留
C、‘rb+’ 表示讀寫一個二進(jìn)制文件,文件如果不存在就會建立對應(yīng)的文件
D、‘w+’ 會將文件長度清零,文件如果不存在會建立對應(yīng)的文件
答案:C
解析:考察的是fopen函數(shù),'rb+'如果文件不存在會出錯
參考:【C標(biāo)準(zhǔn)庫】詳解fopen函數(shù) 一篇讓你搞懂fopen函數(shù)
- C語言中,如果輸入整數(shù)v是2的冪,下面表達(dá)式中哪個會返回True:
A、(~v & (v-1)) == 0
B、(v | (v-1)) == 0
C、(v & (v-1)) == 0
D、(v | (v+1)) == 0
答案:C
解析:帶入特值,由于v是2的冪,那么就只有一位上是1,假設(shè)v是0b0100,那么(~v & (v-1))不為0,A錯誤;(v | (v-1))也不為0,故B錯誤;(v & (v-1)) 為0,因為v-1就使得原本1的那位是0,其后面的位為1,做與運(yùn)算即都為0;(v | (v+1))不為0,故D錯
- 下列程序中橫線處該填什么
int main() {unsigned char counter;TMOD=0x01;TH0 = (65536 - 46083) % 256;TL0 = (65536 - 46083) % 256;TF0 = 0;P0 = 0xff;counter = 0;TR0 = 1;while(1) {while(TF0 = 1) {counter++;if (counter == 20) {________________counter = 0;}TH0 = (65536 - 46083) % 256;TL0 = (65536 - 46083) % 256;}}
}
?? A、P0=0;
?? B、P0=1;
?? C、P0=0x01;
?? D、P0=~P0;
答案:D
解析:要實現(xiàn)燈的亮滅功能的話,就需要每次都是取反,而不是限定為一個值
- 在CAN中線的設(shè)備通信協(xié)議中,幀由不同的段組成,不同類型的幀所包含的段也不一樣,其中遙控幀不包括的段為:
A、仲裁段
B、數(shù)據(jù)段
C、控制段
D、幀起始
答案:B
解析:CAN總線的遙控幀包括了:
?? 幀起始——表示幀開始的段;
?? 仲裁段——表示該幀優(yōu)先級的段??烧埱缶哂邢嗤?ID 的數(shù)據(jù)幀;
?? 控制段——表示數(shù)據(jù)的字節(jié)數(shù)及保留位的段;
?? CRC段——檢查幀的傳輸錯誤的段;
?? ACK段——表示確認(rèn)正常接收的段;
?? 幀起始——表示遙控幀結(jié)束的段;
參考:詳解CAN總線:CAN總線報文格式—遙控幀
- 在嵌入式軟件開發(fā)中,SDIO總線主要是為SDIO卡提供一個高速的I/O能力,SDIO總線能夠支持的通信包括wifi、GPS、camera sensor等。關(guān)于SDIO總線設(shè)備,描述錯誤的是:
A、SDIO的信號傳輸模式有SPI、1-bit、4-bit三種
B、SDIO的每次操作都是由HOST在CMD線上發(fā)起一個CMD,對于有的CMD,DEVICE需要返回Response,有的設(shè)備不需要
C、在SDIO總線定義中,DAT1信號線用來傳輸數(shù)據(jù)
D、SDIO總線采用HOST-DEVICE設(shè)計,所有的通信都是由HOST端發(fā)出命令開始的
答案:C
解析:在SDIO總線定義中,DAT1信號線復(fù)用為中斷線。在SDIO的1BIT模式下DAT0用來傳輸數(shù)據(jù),DAT1用作中斷線。在SDIO的4BIT模式下DAT0-DAT3用來傳輸數(shù)據(jù),其中DAT1復(fù)用作中斷線。
參考:[SDIO].SDIO總線詳解
- 下列選項中,對操作系統(tǒng)功能介紹錯誤的是哪一個
A、可以管理文件
B、可以提供用戶接口
C、沒法管理設(shè)備
D、可以管理存儲
答案:C
解析:現(xiàn)代操作系統(tǒng)通常提供文件系統(tǒng)來管理文件,包括創(chuàng)建、讀取、寫入、刪除和修改文件等操作,**故A對;**操作系統(tǒng)通常提供用戶界面,使用戶能夠與計算機(jī)系統(tǒng)進(jìn)行交互。這包括命令行界面、圖形用戶界面(GUI)、應(yīng)用程序接口(API)等,故B對;操作系統(tǒng)通常管理存儲資源,包括內(nèi)存管理和存儲設(shè)備管理。內(nèi)存管理涉及到為進(jìn)程分配內(nèi)存空間,以及內(nèi)存的分頁、交換等操作;而存儲設(shè)備管理涉及到文件系統(tǒng)的管理,包括文件的存儲、檢索和訪問等,故D對;操作系統(tǒng)通常管理設(shè)備,包括輸入/輸出設(shè)備(如鍵盤、鼠標(biāo)、顯示器)、存儲設(shè)備(如硬盤、固態(tài)硬盤)和網(wǎng)絡(luò)設(shè)備(如網(wǎng)卡)等,故C錯
參考:操作系統(tǒng)的主要功能是什么
- 關(guān)于網(wǎng)絡(luò)設(shè)備,以下選項說法有誤的是:
A、sk_buff結(jié)構(gòu)是內(nèi)核網(wǎng)絡(luò)部分最重要的數(shù)據(jù)結(jié)構(gòu)之一
B、在設(shè)置網(wǎng)絡(luò)設(shè)備參數(shù)時,需要用到net_device結(jié)構(gòu)
C、head指向數(shù)據(jù)緩沖的內(nèi)核首地址,end指向當(dāng)前數(shù)據(jù)包的尾地址
D、網(wǎng)絡(luò)協(xié)議與分層結(jié)構(gòu)相配合,將便于維護(hù)
答案:C
解析:sk_buff
是Linux網(wǎng)絡(luò)中最核心的結(jié)構(gòu)體,它用來管理和控制接收或發(fā)送數(shù)據(jù)包的信息。各層協(xié)議都依賴于sk_buff
而存在。內(nèi)核中sk_buff
結(jié)構(gòu)體在各層協(xié)議之間傳輸不是用拷貝sk_buff
結(jié)構(gòu)體,而是通過增加協(xié)議頭和移動指針來操作的,故A對;net_device
數(shù)據(jù)結(jié)構(gòu)存儲著特定網(wǎng)絡(luò)設(shè)備的所有信息,故B對;head
和end
指向緩沖區(qū)的頭部和尾部,而data和tail指向?qū)嶋H數(shù)據(jù)的頭部和尾部。每一層會在head
和data
之間填充協(xié)議頭,或者在tail
和end
之間添加新的協(xié)議數(shù)據(jù),故C錯;D對
參考:網(wǎng)絡(luò)設(shè)備驅(qū)動介紹(淺析)
?? Linux內(nèi)核中sk_buff結(jié)構(gòu)詳解
?? Linux網(wǎng)絡(luò)技術(shù)學(xué)習(xí)(二)—— net_device數(shù)據(jù)結(jié)構(gòu)解析添加鏈接描述
?? Linux驅(qū)動開發(fā)之網(wǎng)絡(luò)設(shè)備 & 讀書筆記
- 關(guān)于對全局變量OSIntNesting的描述錯誤的是:
A、可以作為調(diào)度器是否可進(jìn)行調(diào)度的標(biāo)志
B、OSIntNesting大于0的時候,表示系統(tǒng)當(dāng)前處于中斷處理狀態(tài)
C、在正常任務(wù)執(zhí)行(即非中斷狀態(tài))時,OSIntNesting的值為0
D、不能記錄中斷嵌套的層數(shù)
答案:D
解析:全局變量OSIntNesting最重要的就是兩個用途,一個是記錄中斷嵌套層數(shù),故D錯。每當(dāng)有一個嵌套中斷發(fā)生時,其值就加1,有中斷結(jié)束時,就減一,故B、C對。第二個用途是作為調(diào)度器是否可進(jìn)行調(diào)度的標(biāo)志,以保證調(diào)度器不會再中斷服務(wù)程序中進(jìn)行任務(wù)調(diào)度,故A對。當(dāng)OSIntNesting大于0的時候,將調(diào)度器加鎖,OSIntNesting等于0的時候,調(diào)度器解鎖
參考:OSIntNesting
- 下列哪項不屬于網(wǎng)絡(luò)設(shè)備驅(qū)動的層次結(jié)構(gòu)
A、網(wǎng)絡(luò)設(shè)備與媒介層
B、數(shù)據(jù)鏈路層
C、設(shè)備驅(qū)動功能層
D、網(wǎng)絡(luò)協(xié)議接口層
答案:D
解析: “網(wǎng)絡(luò)協(xié)議接口層” 則通常屬于操作系統(tǒng)的網(wǎng)絡(luò)協(xié)議棧中,不直接涉及到設(shè)備驅(qū)動的層次結(jié)構(gòu)。
- 在以下關(guān)于字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)設(shè)備的定義中,哪一項描述有誤?
A、網(wǎng)絡(luò)設(shè)備由專門的網(wǎng)絡(luò)接口來實現(xiàn)
B、塊設(shè)備可以從設(shè)備的任意位置讀取一定長度
C、字符設(shè)備是面向流的設(shè)備,讀取數(shù)據(jù)需要按照先后順序進(jìn)行
D、網(wǎng)絡(luò)設(shè)備中的應(yīng)用程序可以直接訪問網(wǎng)絡(luò)設(shè)備驅(qū)動程序
答案:D
解析:網(wǎng)絡(luò)設(shè)備通常由專門的網(wǎng)絡(luò)接口來實現(xiàn)。這個網(wǎng)絡(luò)接口可能是物理上的設(shè)備,如網(wǎng)卡或無線網(wǎng)卡,也可以是虛擬的設(shè)備,如虛擬網(wǎng)卡,故A對;塊設(shè)備是一種存儲設(shè)備,以固定大小的塊為單位進(jìn)行數(shù)據(jù)讀寫操作。每個塊通常具有相同的大小,例如512
字節(jié)或4KB
,故B對;字符設(shè)備是指只能一個字節(jié)一個字節(jié)讀寫的設(shè)備,不能隨機(jī)讀取設(shè)備內(nèi)存中的某一數(shù)據(jù),讀取數(shù)據(jù)需要按照先后順序,故C對。在通常情況下,應(yīng)用程序無法直接訪問網(wǎng)絡(luò)設(shè)備驅(qū)動程序。網(wǎng)絡(luò)設(shè)備驅(qū)動程序位于操作系統(tǒng)內(nèi)核中,而應(yīng)用程序運(yùn)行在用戶空間。操作系統(tǒng)通常會提供一些接口來讓應(yīng)用程序與網(wǎng)絡(luò)設(shè)備進(jìn)行通信,故D錯
參考:
- 在FreeRTOS中,空閑任務(wù)是一種特殊的任務(wù),有區(qū)別于其他用于任務(wù),關(guān)于空閑任務(wù)的描述錯誤的是:
A、如果某個任務(wù)要調(diào)用函數(shù)vTaskDelete()刪除自身,那么這個任務(wù)的任務(wù)控制塊TCB將會在空閑任務(wù)重釋放
B、空閑任務(wù)的堆棧大小是可隨意修改的
C、空閑任務(wù)的優(yōu)先級是可隨意修改的
D、當(dāng)FreeRTOS的調(diào)度器啟動后就會自動的創(chuàng)建一個空閑任務(wù)
答案:B
解析:當(dāng) FreeRTOS 的調(diào)度器啟動以后就會自動的創(chuàng)建一個空閑任務(wù),這樣就可以確保至少有一任務(wù)可以運(yùn)行,故D對;如果某個任務(wù)要調(diào)用函數(shù) vTaskDelete()刪除自身,那么這個任務(wù)的任務(wù)控制塊 TCB 和任務(wù)堆棧等這些由 FreeRTOS 系統(tǒng)自動分配的內(nèi)存需要在空閑任務(wù)中釋放掉,如果刪除的是別的任務(wù)那么相應(yīng)的內(nèi)存就會被直接釋放掉,不需要在空閑任務(wù)中釋放,故A對;空閑任務(wù)的堆棧的起始地址和大小均被定義成一個常量,不能被修改,故B錯。
參考:FreeRTOS 空閑任務(wù)
- 以下C代碼運(yùn)行的結(jié)果是什么:
#include <stdio.h>int main() {int numbers[5];int *p;p = numbers; *p = 10;p++; *p = 20;p = &numbers[2]; *p = 30;p = numbers + 3; *p = 40;p = numbers; *(p + 4) = 50;for (int n = 0; n < 5; n++)printf("%d", numbers[n]);printf(" ");return 0;
}
?? A、1020304050
?? B、編譯錯誤
?? C、運(yùn)行錯誤
?? D、10 20 30 40 50
答案:A
解析:函數(shù)名是指向數(shù)組的第一塊數(shù)據(jù)的地址的,指針加減就是在數(shù)組上的下標(biāo)變化,注意的是for循環(huán)沒有加{},因此最外面的是在for循環(huán)執(zhí)行完才打印一個空格的
- 在Linux中,有一個名為file的文件,內(nèi)容如下所示:
one
two
three
four
five
six
seven
eight
nine
ten
?? 請問以下哪個命令可以打印 three four five這3行:
?? A、sed -n ‘3, 6p’ file
?? B、cat file | head -5 | tail -3
?? C、cat file | head -3 | tail -5
?? D、sed -n ‘2,5p’ file1
答案:B
解析:A打印出來是three,four,five,six
,B打印出來是three,four,five
,C打印出來是one,two,three
,D打印出來是two,three,four,five
- AT89S52單片機(jī)中,在外部中斷響應(yīng)的期間,中斷請求標(biāo)志位查詢占用了:
A、2個機(jī)器周期
B、3個機(jī)器周期
C、4個機(jī)器周期
D、1個機(jī)器周期
答案:A
解析:有點偏冷門了
- 在Linux中,關(guān)于虛擬內(nèi)存相關(guān)的說法正確的是:
A、頁是虛擬內(nèi)存與物理內(nèi)存的交換單元,最小的單位是64KB
B、在頁表結(jié)構(gòu)中,有效位為1代表虛擬地址未被分配
C、在一個進(jìn)程中,每個線程之間的虛擬內(nèi)存是獨占的
D、CPU與內(nèi)存之間通過MMU將虛擬內(nèi)存地址翻譯成物理內(nèi)存地址
答案:D
解析:管理內(nèi)存的最小單元就是頁,頁面的大小常見的有4KB,但是還有8、16、64KB等,故A錯;頁表中,如果有效位為1,地址字段指向該虛擬頁對應(yīng)的物理頁在內(nèi)存中的起始位置。如果有效位為0,地址字段為空時表明該虛擬頁還沒有被分配,不為空時指向該虛擬頁在磁盤中的起始位置,故B錯;線程之間通常共享相同的地址空間,但是進(jìn)程之間是獨占的,故C錯;
處理器的MMU(內(nèi)存管理單元)會將虛擬內(nèi)存映射到物理內(nèi)存,過程如下:
(1)CPU生成一個虛擬地址傳遞給MMU
(2)MMU會根據(jù)虛擬地址生成PTE地址,然后到內(nèi)存中查詢PTE
(3)內(nèi)存返回PTE給MMU
(4)MMU解析PTE,得到物理地址,傳送回內(nèi)存
(5)最后內(nèi)存將數(shù)據(jù)傳給CPU。
參考:內(nèi)存管理:頁表
?? 關(guān)于虛擬內(nèi)存和物理內(nèi)存的映射和地址轉(zhuǎn)換
- 8051的結(jié)構(gòu)與功能(沒把選項記下來)
解析:
CPU核心:8051的核心是一個基于哈佛結(jié)構(gòu)的8位CPU,擁有128字節(jié)的RAM,4K字節(jié)的ROM(程序存儲器),以及4個8位通用寄存器。它支持8位和16位算術(shù)運(yùn)算,包括加減乘除和邏輯運(yùn)算。
??
存儲器: 8051包含了一定量的RAM用于數(shù)據(jù)存儲,以及ROM用于程序存儲。它還支持外部擴(kuò)展的RAM和ROM。
??
I/O端口: 8051擁有多個通用輸入/輸出端口,用于連接外部設(shè)備和傳感器,如LED、鍵盤、LCD顯示器等。
??
定時器/計數(shù)器: 8051集成了多個定時器和計數(shù)器,用于定時、計數(shù)和延時等應(yīng)用。這些定時器/計數(shù)器可以用于生成精確的時間間隔、測量外部信號脈沖寬度、計數(shù)事件等。
??
串行通信接口(UART):8051包含了一個串行通信接口,支持異步串行通信協(xié)議,如RS-232。這使得8051能夠與其他設(shè)備進(jìn)行串行通信,如PC、傳感器、顯示器等。
??
中斷控制器: 8051包含了中斷控制器,支持多種中斷源和優(yōu)先級,使得它能夠及時響應(yīng)外部事件和處理異步任務(wù)。
??
電源管理: 8051支持多種低功耗模式,可以有效管理功耗,延長電池壽命,適用于電池供電的應(yīng)用。
- 若給定如下定義:
int array[8];
int *p;
?? 如果指令指針p指向array數(shù)組,那么,*(p+3)表示的是:
?? A、元素a[4]對應(yīng)的地址
?? B、元素a[3]對應(yīng)的數(shù)據(jù)
?? C、元素a[3]對應(yīng)的地址
?? D、元素a[4]對應(yīng)的數(shù)據(jù)
答案:B
解析:沒什么好說的,就是考察指針與數(shù)組
編程題
- 第一道題是一道字符串查找替換,將題目中的
'mt'
、'Mt'
、'mT'
、'MT'
全部替換為'$$'
輸入是一串字符串,輸出是替換后的字符串
輸入:I love mt, I work in Mt
輸出:I love $$, I work in $$
解析:這道題就是字符串的查找替換,可以遍歷字符串,直到最后一位的前一位,然后判斷當(dāng)前位字符是否為’m’或’M’,是的話下一位是否為’t’或’T’,是的話就替換這兩個為$
并且讓索引額外加一
- 第二道題的描述大致如下:
給定一個n×n的矩陣,其中的值全由0和1組成。對于給定的一個i,如果在 i×i 的矩陣中發(fā)現(xiàn)1的數(shù)量與0的數(shù)量相等,則為完美矩陣,那么輸出所有的i (1 ≤ i ≤ n),對應(yīng)完美矩陣的數(shù)量。 1 ≤ n ≤ 200
輸入:第一行是數(shù)字n,第二行到第n行為矩陣具體的值
輸出:輸出n行,每行為對應(yīng)的 i 的完美矩陣數(shù)量
輸入:
4
1010
0101
1100
0011
輸出:
0
7
0
1
解析:遍歷n次,當(dāng)n為奇數(shù)行時直接跳過,每次都用一個i×i
的窗,初始先判斷其中1的個數(shù)減去0的個數(shù)記為tmp
。然后移動窗的過程中用新加入的列或者行中1的個數(shù)減去出去的列或行中1的個數(shù),記為tmp1
。如果tmp+tmp1=0
就說明達(dá)到平衡,計數(shù)加一。
?? 暴力解題會超時。