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