嵌入式軟體工程師經典面試題
printf("Output is %s\n", output);
}
112、寫出螺旋矩陣
void Matrix(int m,int n) //順時針
{
int i,j,a=1;
int s[100][100];
int small = (m<n)?m:n;
int k=small/2;
for(i=0;i<k;i++)
{
for(j=i;j<n-i-1;j++)
s[i][j]=a++;
for(j=i;j<m-i-1;j++)
s[j][n-i-1]=a++;
for(j=n-i-1;j>i;j--)
s[m-i-1][j]=a++;
for(j=m-i-1;j>i;j--)
s[j][i]=a++;
}
if(small & 1)
{
if(m<n)
for(i=k;i<n-k;++i)
s[k][i]=a++;
else
for(i=k;i<m-k;++i)
s[i][k]=a++;
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("=",s[i][j]);
printf("\n");
}
}
113、int *a = (int *)2;
printf("%d",a+3); 答案是2+3*4=14;int型別地址加1 相當於加4個位元組
114、main()
{
char a,b,c,d;
scanf("%c%c",&a,&b);
c=getchar();d=getchar();
printf("%c%c%c%c\n",a,b,c,d);
} 輸出:12
3
115、int a[2] = {1, 2};
//指向常量的指標,指標可以變,指標指向的內容不可以變
const int *p = a;//與int const *p = a;等價
p++;//ok
*p = 10;//error
//常指標,指標不可以變,指標指向的內容可以變
int* const p2 = a;
p2++;//error
*p2 = 10;//ok
//指向常量的常指標,都不可以改變
p3++;//error
*p3 = 10;//error
116、#error 預處理指令的作用是,編譯程式時,只要遇到#error 就會生成一個編譯錯誤提
示訊息,並停止編譯
117、中斷活動的全過程大致為:
1、中斷請求:中斷事件一旦發生或者中斷條件一旦構成,中斷源提交“申請報告”,
與請求CPU暫時放下目前的工作而轉為中斷源作為專項服務
2、中斷遮蔽:雖然中斷源提交了“申請報告”,但是,是否得到CPU的響應,
還要取決於“申請報告”是否能夠通過2道或者3道“關卡”(中斷遮蔽)送達CPU
(相應的中斷遮蔽位等於1,為關卡放行;反之相應的中斷遮蔽位等於0,為關卡禁止通行);
3、中斷響應:如果一路放行,則CPU響應中斷後,將被打斷的工作斷點記錄下來
(把斷點地址保護到堆疊),掛起“不再受理其他申請報告牌”
(清除全域性中斷標誌位GIE=0),跳轉到中斷服務子程式
4、保護現場:在處理新任務時可能破壞原有的工作現場,所以需要對工作現場和工作環境進行適當保護;
5、調查中斷源:檢查“申請報告”是由哪個中斷源提交的,以便作出有針對性的服務;
6、中斷處理:開始對查明的中斷源進行有針對性的中斷服務;
7、清除標誌:在處理完畢相應的任務之後,需要進行撤消登記(清除中斷標誌),以避免造成重複響應;
8、恢復現場:恢復前面曾經被保護起來的工作現場,以便繼續執行被中斷的工作;
9、中斷返回:將被打斷的工作斷點找回來(從堆疊中恢復斷點地址),
並摘下“不再受理其他申請報告牌”(GIE=1),繼續執行原先被打斷的工作。
118、linux程序間通訊的幾種方式的特點和優缺點,和適用場合。分類:
#管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,
而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。
#有名管道(named pipe) : 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。
#訊號量( semophore ) : 訊號量是一個計數器,可以用來控制多個程序對共享資源的訪問。
它常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。因此,主要作
為程序間以及同一程序內不同執行緒之間的同步手段。
#訊息佇列( message queue ) : 訊息佇列是由訊息的連結串列,存放在核心中並由訊息佇列標識
符標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。
#訊號 ( sinal ) : 訊號是一種比較複雜的通訊方式,用於通知接收程序某個事件已經發生。
#共享記憶體( shared memory):共享記憶體就是對映一段能被其他程序所訪問的記憶體,
這段共享記憶體由一個程序建立,但多個程序都可以訪問。共享記憶體是最快的IPC方式,
它是針對其他程序間通訊方式執行效率低而專門設計的。它往往與其他通訊機制,
如訊號量,配合使用,來實現程序間的同步和通訊。
#套接字( socket ) : 套解口也是一種程序間通訊機制,與其他通訊機制不同的是,
它可用於不同及其間的程序通訊。
119、關鍵字volatile有什麼含意?並給出三個不同的例子。
一個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設
這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,
而不是使用儲存在暫存器裡的備份。
下面是volatile變數的幾個例子:
1). 並行裝置的硬體暫存器(如:狀態暫存器)
2). 一箇中斷服務子程式中會訪問到的非自動變數(Non-automatic variables)
3). 多執行緒應用中被幾個任務共享的變數 回答不出這個問題的人是不會被僱傭的。我認為這是區分C程式設計師和嵌入式系統程式設計師的最基本的問題。嵌入式系統程式設計師經常同硬體、中斷、RTOS等等打交道,所用這些都要求volatile變數。不懂得volatile內容將會帶來災難。
假設被面試者正確地回答了這是問題(嗯,懷疑這否會是這樣),我將稍微深究一下,
看一下這傢伙是不是直正懂得volatile完全的重要性。
1). 一個引數既可以是const還可以是volatile嗎?解釋為什麼。
2). 一個指標可以是volatile 嗎?解釋為什麼。
3). 下面的函式有什麼錯誤:
int square(volatile int *ptr) {
return *ptr * *ptr;
}
下面是答案:
1). 是的。一個例子是隻讀的狀態暫存器。它是volatile因為它可能被意想不到地改變。
它是const因為程式不應該試圖去修改它。
2). 是的。儘管這並不很常見。一個例子是當一箇中服務子程式修該一個指向一個buffer的指標時。
3). 這段程式碼的有個惡作劇。這段程式碼的目的是用來返指標*ptr指向值的平方,但是,
由於*ptr指向一個volatile型引數,編譯器將產生類似下面的程式碼:
int square(volatile int *ptr) {
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。
結果,這段程式碼可能返不是你所期望的平方值!正確的程式碼如下:
long square(volatile int *ptr) {
int a;
a = *ptr;
return a * a;
}
Volatile 關鍵字告訴編譯器不要持有變數的臨時性拷貝。一般用在多執行緒程式中,
以避免在其中一個執行緒操作該變數時,將其拷貝入暫存器。
請看以下情形: A執行緒將變數複製入暫存器,然後進入迴圈,反覆檢測暫存器的值是否滿足
一定條件(它期待B執行緒改變變數的值。在此種情況下,當B執行緒改變了變數的值時,
已改變的值對其在暫存器的值沒有影響。所以A執行緒進入死迴圈。
volatile 就是在此種情況下使用。
120、如何防止同時產生大量的執行緒,方法是使用執行緒池,執行緒池具有可以同時提高排程效率和
限制資源使用的好處,執行緒池中的執行緒達到最大數時,其他執行緒就會排隊等候
121、main()
{
char *p1=“name”;
char *p2;
p2=(char*)malloc(20);
memset (p2, 0, 20);
while(*p2++ = *p1++);
printf(“%s\n”,p2);
}
答案:Answer:empty string. 因p2++已經指到了'\0'了;
122、作業系統的記憶體分配一般有哪幾種方式,各有什麼優缺點?
定長和變長。
變長:記憶體時比較靈活,但是易產生記憶體碎片。
定長:靈活性差,但分配效率較高,不會產生記憶體碎片
123、全域性變數可不可以定義在可被多個.C檔案包含的標頭檔案中?為什麼?
答:可以,在不同的C檔案中以static形式來宣告同名全域性變數。可以在不同的C檔案中宣告同名的全域性變數,
前提是其中只能有一個C檔案中對此變數賦初值,此時連線不會出錯
124、確定模組的功能和模組的介面是在軟體設計的那個隊段完成的?概要設計階段
125、#define N 500
unsigned char count;
for(count=0;count < N;count++)
{
printf("---%d---\n",count);
}死迴圈,因為unsigned char 最大為255
126、給定結構struct A
{
char t:4; 4位
char k:4; 4位
unsigned short i:8; 8位
unsigned long m; // 偏移2位元組保證4位元組對齊
}; // 共8位元組
127、ICMP(ICMP協議對於網路安全具有極其重要的意義)功能主要有:
· 偵測遠端主機是否存在。
· 建立及維護路由資料。
· 重導資料傳送路徑。
· 資料流量控制。
單向、雙向連結串列操作、寫一個快速排序演算法(原理:找一個基準值,分別將大於和小於基準值的資料放到基準值左右兩邊,即一次劃分。由於處在兩邊的資料也是無序的,所以再用同樣的劃分方法對左右兩邊的序列進行再次劃分,直到劃分元素只剩1個時結束,)
/******************************************************************/
1、單向連結串列逆序
LONDE *link_reverse(LNODE *head)
{
LNODE *pb,*pt;
if(head == NULL)
return head;
pb = head->next;
head->next=NULL;
while(pb != NULL)
{
pt = pb->next;
pb->next = head;
head = pb;
pb = pt;
}
return head;
}
2、快速排序
void quick_sort(int num,int start_num,int end_num)
{
if(start_num < end_num)
{
int i = start_num;
int j = end_num;
int temp = num[start_num];
while(i < j)
{
while(i < j && num[j] < temp)
j--;
if(i < j)
num[i++] = num[j];//把小於基準值放在左邊
while(i < j && num[i] >= temp)
i++;
if(i < j)
num[j--] = num[i];//把大於基準值放在右邊
}
num[i] = temp;
quick_sort(num,start_num,i-1);
quick_sort(num,i+1,end_num);
}
}
3、//二分擦找
int binary_search(int array[],int value,int size)
{
int low=0,high=size-1,mid;
while(low<=high) //只要高低不碰頭就繼續二分查詢
{
mid=(low+high)/2;
if(value==array[mid]) //比較是不是與中間元素相等
return mid;
else if(value > array[mid]) //每查詢一次,就判斷一次所要查詢變數所在範圍,並繼續二分
low=mid; //如果大小中間值,下限移到中間的後一個位,上限不變,往高方向二分
else
high=mid; //上限移到中間的前一個位,往低方向二分
}
return -1;
}
/*雙向迴圈連結串列插入函式*/
TYPE *insert_link(TYPE *head,TYPE *p_in)
{
TYPE *p_mov = head,p_front = head;
if(head == NULL)
{
head = p_in;
p_in->next = head;
p_perior = head;
}
else
{
while((p_in->[] > p_mov->[]) && (p_mov->next != head))
{
p_front = p_mov;
p_mov = p_mov->next;
}
if(p_in->[] <= p_mov->[])
{
if(head == p_mov)
{
p_in->prior = head->prior;
head->prior->next = p_in;
p_in->next = p_mov;
p_mov->prior = p_in;
head = p_in;
}
else
{
pf->next = p_in;
p_in->prior = p_front;
p_in->next = p_mov;
p_mov->prior = p_in;
}
}
else
{
p_mov->next = p_in;
p_in->prior = p_mov;
p_in->next = head;
head->prior = p_in;
}
}
return head;
}
相關推薦
嵌入式軟體工程師經典面試題
printf("Maxlen is %d\n", maxlen); printf("Output is %s\n", output);}112、寫出螺旋矩陣 void Matrix(int m,int n) //順時針 { int i,j,a=1; int s[100][100]; int sm
【嵌入式基礎】嵌入式軟體開發——嵌入式軟體工程師經典筆試題
從CSDN各個部落格上摘選的一些容易做錯的嵌入式軟體的筆試題,做一下記錄,讓自己記住。 1、用預處理指令#define 宣告一個常數,用以表明1年中有多少秒(忽略閏年問題) 解答:這一題主要容易錯的地方就是:意識到這個表示式將使一個16位機的整型數溢位,因此要用到
嵌入式軟體工程師經典筆試題
> 前處理器(Preprocessor) 1. 用預處理指令#define 宣告一個常數,用以表明1年中有多少秒(忽略閏年問題) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在這想看到幾件事情: 1).
嵌入式工程師經典面試題
前兩個的作用是一樣,a是一個常整型數。第三個意味著a是一個指向常整型數的指標(也就是,整型數是不可修改的,但指標可以)。第四個意思a是一個指向整型數的常指標(也就是說,指標指向的整型數是可以修改的,但指標是不可修改的)。最後一個意味著a是一個指向常整型數的常指標(也就是說,指標指向的整型數是不可修
Linux 運維工程師經典面試題合集(不斷更新中 ...)
type ESS 9.png aux 比較 服務器 var 命令 如何 寫在前面的話 做運維以來,關註了很多關於互聯網技術,培訓等亂七八糟的公眾號,時不時的就會推一些各種公司的面試題過來。 大致看了一下,發現自己很多知識要麽遺忘了,要麽很難說出個所
嵌入式軟體工程師【面經:第一部分-C語言基礎】
1、關鍵字static的作用是什麼? 這個簡單的問題很少有人能回答完全。在C語言中,關鍵字static有三個明顯的作用: 1). 在函式體,一個被宣告為靜態的變數在這一函式被呼叫過程中維持其值不變。 2). 在模組內(但在函式體外),一個被宣告為靜態的變數可以被模組內所用函式訪問,但不能被模組外
嵌入式軟體工程師【面經:第二部分-指標】
指標簡單型別分析: int p; //這是一個普通的整型變數 int *p; //首先從P 處開始,先與*結合,所以說明P 是一個指標,然後再與int 結合,說明指標所指向的內容的型別為int 型.所以P 是一個返回整型資料的指標 int p[3]; //首先從P 處開始,先與[]結
軟體測試經典面試題(面試必看)
引用與指標有什麼區別? 1) 引用必須被初始化,指標不必。 2) 引用初始化以後不能被改變,指標可以改變所指的物件。 3) 不存在指向空值的引用,但是存在指向空值的指標。 Internet.採用哪種網路協議?該協議的主要層次結構?Internet.實體地址和IP.地址轉
MIS軟體工程師的面試題
一、 軟體工程的一般知識(1) 說說您所知道的軟體開發的有關國家標準或國際標準。(2) 一般軟體專案要做哪些文件?(3) 在您從事過的專案裡,團隊是如何組成的?有哪些主要開發階段?這些開發階段一般各佔用整個開發週期的百分比是多少?(4) 什麼是基線BASELINE?(5) 什
軟體測試經典面試題(1)
1.主鍵、外來鍵的作用,索引的優點與不足? 答:主鍵:是表中的唯一標示鍵。作用:保證實體的完整性;加快資料庫的操作速度;增加新的表記錄時,資料庫會自動檢索新記錄的主鍵值,不允許該值與其他表中記錄的主鍵重複;資料庫會按主鍵值的順序顯示記錄,如果沒有設定主鍵,則按輸入的順序顯示
練一練,嵌入式Linux工程師作業系統面試題三道
題一,同步和非同步有啥區別? 題二,TCP與UDP有啥區別? 題三,程序和執行緒有啥區別? 題一答案: 同步(Sync):所有的操作都做完,才返回給使用者。這樣使用者線上等待的時間太長,給使用者一種卡死了的感覺(比如系統遷移中,點選了遷移,介面就不動
嵌入式軟體工程師經典筆試
> 前處理器(Preprocessor) 1. 用預處理指令#define 宣告一個常數,用以表明1年中有多少秒(忽略閏年問題) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在這想看到幾件事情: 1).
嵌入式軟體工程師面試題
1、int a[10]={1,2,3,4,5,6,7,8,9,0}; int *p=&a[1]; 則p[6]等於8 2、整數陣列清零:bzero(),memset()。 3、siezof();測試變數所佔地址的位元組數 4、 main() {
華為 嵌入式軟體工程師面試題
(1)什麼是預編譯,何時需要預編譯: 答案: 1、總是使用不經常改動的大型程式碼體。 2、程式由多個模組組成,所有模組都使用一組標準的包含檔案和相同的編譯選項。在這種情況下,可以將所有包含檔案預編譯為一個預編譯頭。 預編譯指令指示了在程式正式編譯前就由編
16道經典面試題(嵌入式軟體)
#define MIN(A,B) ((A) <= (B)? (A) : (B)) 這個測試是為下面的目的而設的: 1). 標識#define在巨集中應用的基本知識。這是很重要的,因為直到嵌入(inline)操作符變為標準C的一部分,巨集是方便產生嵌入程式碼的唯一方法,對於嵌入式系統來說,為了能達到要求的
嵌入式工程師基礎面試題
工作好幾年了,C語言功底有些都生疏了,羅列一些C語言基礎,也是常見的面試考點。 1 . 用預處理指令#define 宣告一個常數,用以表明1年中有多少秒(忽略閏年問題) #define SECONDS_PER_YEAR (60 * 60 * 2
嵌入式軟體工程師C語言經典筆試
一. 前處理器(Preprocessor) 1.1. 用預處理指令#define 宣告一個常數,用以表明1年中有多少秒(忽略閏年問題) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 1.1.1. 我在這想看到幾件事情:
運維工程師分享7道經典面試題,看完輕鬆拿Offer
首先,獵頭或者公司人資會把公司的介紹及崗位要求發到你郵箱(或者QQ、微信),下面這份是獵頭髮給我的崗位說明,為了職業道德操守,公司的介紹和麵試通知資訊我就不貼出來了,我就把崗位要求貼出來:職位描述:1、 負責應用伺服器的安裝、配置、優化與維護;2、 負責應用系統的日誌資訊備份
嵌入式經典面試題---C中有關預處理,關鍵字const、volatile、static,位操作,等等
紅色是我標註的重點,綠色是自己新增的內容 C語言測試是招聘嵌入式系統程式設計師過程中必須而且有效的方法。這些年,我既參加也組織了許多這種測試,在這過程中我意識到這些測試能為帶面試者和被面試者提供許多有用資訊,此外,撇開面試的壓力不談,這種測試也是相當有趣的。 從被
Linux下C語言的幾道經典面試題
ref 使用 linu 學習資源 chan ima 什麽 img c語言 本篇文章整理了幾道Linux下C語言的經典面試題,相信對大家更好的理解Linux下的C語言會有很大的幫助,歡迎大家探討指正。 1、如果在Linux下使用GCC編譯器執行下列程序,輸出結果是什麽? 答