嵌入式 c语言 面试题,嵌入式面试题-持续更新
1.用預(yù)處理指令#define聲明一個(gè)常數(shù),用以表示1年中有多少秒(忽略閏年問(wèn)題)。
#define? SECONDS_PER_YEAR? (60 * 60 * 24 * 365)UL? //最后的UL代表無(wú)符號(hào)整數(shù)。
2.寫(xiě)一個(gè)“標(biāo)準(zhǔn)”宏MIN,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。
#define MIN(x, y) ((x) < (y) ? (x) : (y))? //注意x,y要加括號(hào),因?yàn)閤,y如果有復(fù)合運(yùn)算會(huì)出現(xiàn)問(wèn)題。
3.預(yù)處理器標(biāo)識(shí)#error的目的是什么?
停止編譯,提示錯(cuò)誤信息。
4.寫(xiě)一個(gè)無(wú)限循環(huán)。
a) while(1)
b) for(;;)
c) loop:
goto loop;
5.請(qǐng)寫(xiě)出float x與“零”比較的if語(yǔ)句。
const float EPSINON = 0.000001;
if ((x >= - EPS) && (x <= EPS));
6.嵌入式系統(tǒng)經(jīng)常具有要求程序員去訪問(wèn)某特定的內(nèi)存位置的特點(diǎn)。在某工程中,要求設(shè)置一絕對(duì)地址為0x67a9的整型變量的值為0xaa66。
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa66;
7.嵌入式系統(tǒng)總是要用戶對(duì)變量或寄存器進(jìn)行位操作。給定一個(gè)整型變量a,分別對(duì)a的第三位進(jìn)行置1,清0,取反的操作,同時(shí)保持其它位不變。
a |= (1<<3); ? ?//置1
a &= ~(1<<3); //清0
a ^= (1<<3); ? ?//取反
8.關(guān)鍵字static的作用是什么?
(1)在函數(shù)體,一個(gè)被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過(guò)程中維持其值不變。
(2)在模塊內(nèi)(但在函數(shù)體外),一個(gè)被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問(wèn),但不能被模塊外其它函數(shù)訪問(wèn)。它是一個(gè)本地的全局變量。
(3)在模塊內(nèi),一個(gè)被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個(gè)函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。
9.關(guān)鍵字const是什么含意?
const的意思是只讀,它的作用是:
(1)表示為常量,不可更改;(2)改變變量的存儲(chǔ)域;(3)修飾函數(shù)參數(shù)時(shí),防止參數(shù)被以外改變。
10.關(guān)鍵字volatile有什么含意并給出三個(gè)不同的例子。
volatile是易變的,不穩(wěn)定的意思。volatile是關(guān)鍵字,是一種類型修飾符,用它修飾的變量表示可以被某些編譯器未知的因素更改,比如操作系統(tǒng)、硬件或者其他線程等。每次使用它修飾的變量的時(shí)候必須從內(nèi)存中取出它的值,而不是從寄存器或者緩存中讀取,從而保證了對(duì)特殊地址的穩(wěn)定訪問(wèn)。
(1) 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)
(2)一個(gè)中斷服務(wù)子程序中會(huì)訪問(wèn)到的非自動(dòng)變量(Non-automatic variables)
(3)多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量
11.下面的聲明都是什么意思?
const int a; ? ? ? ? ? ?//a是一個(gè)常整型數(shù)
int const a; ? ? ? ? ? ?//同上
const int *a; ? ? ? ? ? //a是一個(gè)指向常整型數(shù)的指針(整型數(shù)是不可修改的,但指針可以)
int * const a; ? ? ? ? ? //a是一個(gè)指向整型數(shù)的常指針(指針指向的整型數(shù)是可以修改的,但指針是不可修改的)
const int * const a; ?//a是一個(gè)指向常整型數(shù)的常指針(也就是說(shuō),指針指向的整型數(shù)是不可修改的,同時(shí)指針也是不可修改的)
12.用變量a給出下面的定義
a) 一個(gè)整型數(shù) ? ? ? ? //int a;
b) 一個(gè)指向整型數(shù)的指針 ?//int *a;
c) 一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數(shù) ? //int **a;
d) 一個(gè)有10個(gè)整型數(shù)的數(shù)組 ?//int a[10]
e) 一個(gè)有10個(gè)指針的數(shù)組,該指針是指向一個(gè)整型數(shù)的 ?//int *a[10]
f) 一個(gè)指向有10個(gè)整型數(shù)數(shù)組的指針 ? //int (*a)[10]
g) 一個(gè)指向函數(shù)的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù) ?//int (*a)[int]
h) 一個(gè)有10個(gè)指針的數(shù)組,該指針指向一個(gè)函數(shù),該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù) ?//int (*a[10])(int)
13.?#與##的作用?
#是把宏參數(shù)轉(zhuǎn)化為字符串的運(yùn)算符,##是把兩個(gè)宏參數(shù)連接的運(yùn)算符。如下:
#define STR(arg) #arg??????????則宏STR(hello)展開(kāi)時(shí)為”hello”
#define NAME(y) name_##y????則宏NAME(1)展開(kāi)為name_1
14.如何避免頭文件被重復(fù)包含?
例如,為避免頭文件my_head.h被重復(fù)包含,可在其中使用條件編譯:
#ifndef _MY_HEAD_H
#define _MY_HEAD_H????/*空宏*/
/*其他語(yǔ)句*/
#endif
15.extern關(guān)鍵字的作用?
修飾符 extern 用在變量或者函數(shù)的聲明前, 用來(lái)說(shuō)明 “此變量 / 函數(shù)是在 別處定義的,要在此處引用”。
(1)extern修飾變量的聲明。
(2)extern修飾函數(shù)聲明。
(3)此外,extern修飾符可用于指示C或者C++函數(shù)的調(diào)用規(guī)范。
16.如何在C++代碼中調(diào)用C寫(xiě)的文件?
#ifdef __cplusplus
extern "C" {
#endif
// 代碼
#ifdef __cplusplus
}
#endif
17. extern "C"的作用?
extern "C"的作用是讓 C++ 編譯器將extern "C"聲明的代碼當(dāng)作 C 語(yǔ)言代碼處理,可以避免 C++ 因符號(hào)修飾導(dǎo)致代碼不能和C語(yǔ)言庫(kù)中的符號(hào)進(jìn)行鏈接的問(wèn)題。
18.隊(duì)列和棧的區(qū)別?
隊(duì)列先進(jìn)先出,棧后進(jìn)先出。
19.switch支持的參數(shù)類型?
switch語(yǔ)句中使用的表達(dá)式必須是int或enum類型,否則如float等其他數(shù)據(jù)類型是無(wú)法通過(guò)的編譯的,因?yàn)榫幾g器需要switch后面的語(yǔ)句和case后面的值精確匹配,而計(jì)算機(jī)無(wú)法精確表達(dá)一個(gè)float數(shù)據(jù)類型。
20.什么是預(yù)編譯,何時(shí)需要預(yù)編譯?
預(yù)編譯又稱為預(yù)處理,是做些代碼文本的替換工作。處理#開(kāi)頭的指令,比如拷貝#include包含的文件代碼,#define宏定義的替換,條件編譯等。C提供的預(yù)處理功能主要有以下三種:(1)宏定義???(2)文件包含??(3)條件編譯
21.嵌入式設(shè)計(jì)流程?
(1)系統(tǒng)需求分析
(2)體系結(jié)構(gòu)設(shè)計(jì)
(3)硬件/軟件協(xié)同設(shè)計(jì)
(4)系統(tǒng)集成
(5)系統(tǒng)測(cè)試
22.簡(jiǎn)述你對(duì)嵌入式和嵌入式系統(tǒng)的理解。
凡是使用了CPU的電子設(shè)備都可以叫嵌入式,(如電子表、超聲波測(cè)距儀等)。而嵌入式系統(tǒng)一般值在開(kāi)發(fā)時(shí)移植了操作系統(tǒng),功能較復(fù)雜的電子設(shè)備,(如手機(jī)、掌上電腦等)。
23.簡(jiǎn)述任務(wù)切換的過(guò)程。
當(dāng)多任務(wù)內(nèi)核決定運(yùn)行另外的任務(wù)時(shí),它保存正在運(yùn)行任務(wù)的當(dāng)前狀態(tài),即CPU寄存器中的全部?jī)?nèi)容。這些內(nèi)容保存在任務(wù)的當(dāng)前狀態(tài)保存區(qū),也就是任務(wù)自己的堆棧中。入棧工作完成以后,就把下一個(gè)將要運(yùn)行的任務(wù)的當(dāng)前狀態(tài)從任務(wù)的堆棧中重新裝入CPU的寄存器,并開(kāi)始下一個(gè)任務(wù)的運(yùn)行。這個(gè)過(guò)程就稱為任務(wù)切換。做任務(wù)切換所需要的時(shí)間取決于CPU有多少寄存器要入棧。
總結(jié)
以上是生活随笔為你收集整理的嵌入式 c语言 面试题,嵌入式面试题-持续更新的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 本机连接opc server有部分数据不
- 下一篇: 数据量大的sql怎么做优化_搜索引擎关键