自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

11道嵌入式筆試題,看下你會幾道?

系統(tǒng) Linux
本篇和大家探討11道嵌入式筆試題,希望對你有所幫助。

[[383625]]

 筆試題

筆試題

1. ARM指令和中B和BLX的區(qū)別?

B:跳轉(zhuǎn)執(zhí)行 B 指令的格式為:

  1. B{條件} 目標地址 

B 指令是最簡單的跳轉(zhuǎn)指令。一旦遇到一個B 指令,ARM 處理器將立即跳轉(zhuǎn)到給定的目標地址,從那里繼續(xù)執(zhí)行。

注意存儲在跳轉(zhuǎn)指令中的實際值是相對當前PC 值的一個偏移量,而不是一個絕對地址,它的值由匯編器來計算(參考尋址方式中的相對尋址)。

它是 24 位有符號數(shù),左移兩位后有符號擴展為 32 位,表示的有效偏移為 26 位(前后32MB 的地址空間)。

舉例:

  1. B Label ;   程序無條件跳轉(zhuǎn)到標號 Label 處執(zhí)行 
  2. CMP R1 ,# 0 ;  當 CPSR 寄存器中的 Z 條件碼置位時,程序跳轉(zhuǎn)到標號 Label 處執(zhí)行 
  3. BEQ Label 

BLX

帶鏈接和狀態(tài)切換的跳轉(zhuǎn)。結(jié)合了BX與BL功能。BLX 指令的格式為:

  1. BLX 目標地址 

BLX 指令從ARM 指令集跳轉(zhuǎn)到指令中所指定的目標地址,并將處理器的工作狀態(tài)由ARM 狀態(tài)切換到Thumb 狀態(tài),該指令同時將PC 的當前內(nèi)容保存到寄存器R14 中。

因此,當子程序使用Thumb 指令集,而調(diào)用者使用ARM 指令集時,可以通過BLX 指令實現(xiàn)子程序的調(diào)用和處理器工作狀態(tài)的切換。

總結(jié)

1、BL 和 BLX 指令可將下一個指令的地址復制到lr(r14,鏈接寄存器)中。2、BX 和 BLX 指令可將處理器的狀態(tài)從 ARM 更改為 Thumb,或從 Thumb 更改為ARM。3、BLX label 無論何種情況,始終會更改處理器的狀態(tài)。4、BX Rm 和 BLX Rm 可從 Rm 的位 [0]推算出目標狀態(tài)。5、如果 Rm 的位 [0] 為 0,則處理器的狀態(tài)會更改為(或保持在)ARM 狀態(tài)。如果 Rm 的位 [0] 為 1,則處理器的狀態(tài)會更改為(或保持在)Thumb 狀態(tài)。

2. ARM處理器體系結(jié)構(gòu)中IRQ發(fā)生時,處理器將執(zhí)行哪些操作?

中斷發(fā)生后,ARM核的操作步驟可以總結(jié)為4大步3小步。

1. 4大步3小步

保存執(zhí)行狀態(tài):將CPSR復制到發(fā)生的異常模式下SPSR中;

模式切換:

  • CPSR模式位強制設置為與異常類型相對應的值,
  • 處理器進入到ARM執(zhí)行模式,
  • 禁止所有IRQ中斷,當進入FIQ快速中斷模式時禁止FIQ中斷;

保存返回地址:將下一條指令的地址(被打斷程序)保存在LR(異常模式下LR_excep)中。

跳入異常向量表:強制設置PC的值為相應異常向量地址,跳轉(zhuǎn)到異常處理程序中。

2. 步驟詳解

1.保存執(zhí)行狀態(tài)

當前程序的執(zhí)行狀態(tài)是保存在CPSR里面的,異常發(fā)生時,要保存當前的CPSR里的執(zhí)行狀態(tài)到異常模式里的SPSR里,將來異常返回時,恢復回CPSR,恢復執(zhí)行狀態(tài)。

2.模式切換

硬件自動根據(jù)當前的異常類型,將異常碼寫入CPSR里的M[4:0]模式位,這樣CPU就進入了對應異常模式下。不管是在ARM狀態(tài)下還是在THUMB狀態(tài)下發(fā)生異常,都會自動切換到ARM狀態(tài)下進行異常的處理,這是由硬件自動完成的,將CPSR[5] 設置為 0。同時,CPU會關(guān)閉中斷IRQ(設置CPSR 寄存器I位),防止中斷進入,如果當前是快速中斷FIQ異常,關(guān)閉快速中斷(設置CPSR寄存器F位)。

3.保存返回地址

當前程序被異常打斷,切換到異常處理程序里,異常處理完之后,返回當前被打斷模式繼續(xù)執(zhí)行,因此必須要保存當前執(zhí)行指令的下一條指令的地址到LR_excep(異常模式下LR,并不存在LR_excep寄存器,為方便讀者理解加上_excep,以下道理相同),由于異常模式不同以及ARM內(nèi)核采用流水線技術(shù),異常處理程序里要根據(jù)異常模式計算返回地址。

4.跳入異常向量表

該操作是CPU硬件自動完成的,當異常發(fā)生時,CPU強制將PC的值修改為一個固定內(nèi)存地址,這個固定地址叫做異常向量。

3. ARM狀態(tài)與Thumb狀態(tài)的切換指令是什么?舉例說明

概念

ARM狀態(tài) arm處理器工作于32位指令的狀態(tài),所有指令均為32位

thumb狀態(tài) arm執(zhí)行16位指令的狀態(tài),即16位狀態(tài)

切換指令

由arm狀態(tài)切換到thumb 狀態(tài)將寄存器的最低位設置為1

BX指令:R0[0]=1,則執(zhí)行BX R0指令將進入thumb狀態(tài)

由thumb狀態(tài)切換到ARM狀態(tài) 寄存器最低位設置為0

BX指令:R0[0]=0,則執(zhí)行BX R0指令將進入arm狀態(tài)

舉例

  1.  AREA Arm_to_Thumb,CODE, READONLY 
  2.  ENTRY 
  3.  CODE32 
  4. start 
  5.  ldr r0,=aaa+1 
  6.  mov r3,#18 
  7.  bx r0 
  8.  CODE16 
  9. aaa  
  10.  mov r1,#12 
  11.  mov r2,#10 
  12.  END 

4. 請問ARM支持哪幾種異常類型,請列出其中斷向量地址。

異常源分類

要進入異常模式,一定要有異常源,ARM規(guī)定有7種異常源:

異常向量表是一段特定內(nèi)存地址空間,每種ARM異常對應一個字長空間(4Bytes),正好是一條32位指令長度,當異常發(fā)生時,CPU強制將PC的值設置為當前異常對應的固定內(nèi)存地址。

異常向量表:

異常向量表

跳入異常向量表操作是異常發(fā)生時,硬件自動完成的,剩下的異常處理任務完全交給了程序員。由上表可知,異常向量是一個固定的內(nèi)存地址,我們可以通過向該地址處寫一條跳轉(zhuǎn)指令,讓它跳向我們自己定義的異常處理程序的入口,就可以完成異常處理了。

正是由于異常向量表的存在,才讓硬件異常處理和程序員自定義處理程序有機聯(lián)系起來。異常向量表里0x00000000地址處是reset復位異常,之所以它為0地址,是因為CPU在上電時自動從0地址處加載指令,由此可見將復位異常安裝在此地址處也是前后結(jié)合起來設計的,不得不感嘆CPU設計師的偉大,其后面分別是其余7種異常向量,每種異常向量都占有四個字節(jié),正好是一條指令的大小,最后一個異常是快速中斷異常,將其安裝在此也有它的意義,在0x0000001C地址處可以直接存放快速中斷的處理程序,不用設置跳轉(zhuǎn)指令,這樣可以節(jié)省一個時鐘周期,加快快速中斷處理時間。

存儲器映射地址0x00000000是為向量表保留的。在有些處理器中,向量表可以選擇定位在高地址0xFFFF0000處【可以通過協(xié)處理器指令配置】,當今操作系統(tǒng)為了控制內(nèi)存訪問權(quán)限,通常會開啟虛擬內(nèi)存,開啟了虛擬內(nèi)存之后,內(nèi)存的開始空間通常為內(nèi)核進程空間,和頁表空間,異常向量表不能再安裝在0地址處了。

比如Cortex-A8系統(tǒng)中支持通過設置CP15的C12寄存器將異常向量表的首地址放置在任意地址。

5. 在Linux中與外設的通信是層次化的,請畫出外設尋址的分層模型。

本題有點沒整明白在問什么,如果分析有誤,歡迎給我留言。

Linux下一切皆文件,應用程序訪問外設都需要通過驅(qū)動來操作外設。

Linux下設備類型分為:字符設備、塊設備、網(wǎng)絡設備。

架構(gòu)圖參考下圖:


此外題目問畫出外設尋址的分層模型,我想可能是想問如何訪問SDRAM。

如下圖所示,CPU要訪問SDRAM或者flash需要先通過AHB總線,然后再通過外存接口控制器對外存尋址,然后進行數(shù)據(jù)的讀寫。

訪問外存

6. 中斷是嵌入式中重要的組成部分,中斷服務程序通常需要滿足哪些要求?

中斷是嵌入式系統(tǒng)中重要的組成部分,很多外設和cpu的交互都是通過中斷的方式進行。衡量一個OS的實時性很重要的一個特性就是中斷的響應時間,長時間處于中斷狀態(tài)所以中斷反應。一旦進入中斷狀態(tài),cpu是在占用的,所以必須快速的出中斷,否則會影響整體性能。

中斷服務程序需要滿足如下要求:

  1. 不能返回值;
  2. 不能向ISR傳遞參數(shù);
  3. ISR應該盡可能的短小精悍;
  4. 要盡快出中斷;
  5. 耗時的中斷要放到中斷的底半部;
  6. 中斷不要調(diào)用會因其休眠的函數(shù);
  7. 通常中斷中不做浮點操作;
  8. 中斷函數(shù)中不可調(diào)用不可重入的函數(shù),會引起意想不到的問題。

7. 使用共享資源時,為了使之滿足互斥條件,通常有哪些方法?

共享資源也叫臨界資源,在進程和線程、內(nèi)核下都有自己的同步互斥機制, 僅考慮互斥的話,分開來看:

進程:信號量(值設置為1) 線程:互斥體、信號量(也叫信號燈) 內(nèi)核:原子操作,自旋鎖,信號量,互斥鎖

8. 嵌入式操作系統(tǒng)有哪些同步通信服務?

Linux進程間通信方式主要有

  1. 信號
  2. 信號量
  3. 管道
  4. 消息隊列
  5. 共享內(nèi)存
  6. 套接字(本地的還有域套接字)

9. 請舉例說明什么是可重入函數(shù)與不可重入函數(shù)。

1. 不可重入函數(shù)

在實時系統(tǒng)的設計中,經(jīng)常會出現(xiàn)多個任務調(diào)用同一個函數(shù)的情況。如果有一個函數(shù)不幸被設計成為不可重入這樣:那么不同任務調(diào)用這個函數(shù)時可能修改其他任務調(diào)用這個函數(shù)的數(shù)據(jù),從而導致不可預料的后果。這樣的函數(shù)是不安全的函數(shù),也叫不可重入函數(shù)。

滿足下列條件的函數(shù)多數(shù)是不可重入的

  1. 函數(shù)體內(nèi)使用了靜態(tài)的數(shù)據(jù)結(jié)構(gòu);
  2. 函數(shù)體內(nèi)調(diào)用了malloc()或者free()函數(shù)(malloc和free為不可重入函數(shù));
  3. 函數(shù)體內(nèi)調(diào)用了標準I/O函數(shù)。

2. 可重入函數(shù)

可重入函數(shù)可以被一個以上的任務調(diào)用,而不必擔心數(shù)據(jù)被破壞。可重入函數(shù)任何時候都可以被中斷,一段時間以后又可以運行,而相應的數(shù)據(jù)不會丟失??芍厝牒瘮?shù)或者只使用局部變量,即保存在CPU寄存器中或堆棧中;或者使用全局變量,則要對全局變量予以保護

如何寫出可重入函數(shù)在函數(shù)體內(nèi)不訪問那些全局變量,不使用靜態(tài)局部變量,堅持只使用缺省態(tài)(auto)局部變量,寫出的函數(shù)就將是可重入的。如果必須訪問全局變量,記住利用互斥信號量來保護全局變量?;蛘哒{(diào)用該函數(shù)前關(guān)中斷,調(diào)用后再開中斷。Linux常見的可重入函數(shù)

3. 舉例A) 可重入函數(shù)

  1. void strcpy(char * dest, char * src) { 
  2.  while(*dest++=*src++); 
  3.  *dest = 0; 

B) 不可重入函數(shù)1

  1. char temp;//全局變量 
  2. void swapchar(char * x, char * y) { 
  3.  temp = *x; 
  4.  *x=*y; 
  5.  *y=temp;//訪問了全局變量 

C) 不可重入函數(shù)2

  1. void swapchar(char * x, char * y) { 
  2.  char temp;//局部變量 
  3.  temp = *x; 
  4.  *x=*y; 
  5.  *y=temp;//使用了全局變量 

4. 不可重入函數(shù)的使用注意事項

  1. int Exam = 0;   
  2. unsigned int example( int para )    
  3. {    
  4.     unsigned int temp;   
  5.     Exam = para; // (**)   
  6.     temp = Square_Exam( );   
  7.     return temp;   
  8. }  

Exam 是 int 型全局變量,函數(shù) Squre_Exam() 返回 Exam 平方值,所以函數(shù)example()不具有可重入性。

此函數(shù)若被多個進程調(diào)用的話,其結(jié)果可能是未知的,因為當 Exam = para語句剛執(zhí)行完后,另外一個使用本函數(shù)的進程可能正好被激活,那么當新激活的進程執(zhí)行到此函數(shù)時,將使 Exam 賦與另一個不同的 para 值,所以當控制重新回到 “temp = Square_Exam( )” 后,計算出的temp很可能不是預想中的結(jié)果。

此函數(shù)應如下改進:

  1. int Exam = 0;   
  2. unsigned int example( int para )    
  3. {   
  4.     unsigned int temp;   
  5.     [申請信號量操作] //(1)  加鎖   
  6.     Exam = para;   
  7.     temp = Square_Exam( );   
  8.     [釋放信號量操作] //     解鎖    
  9.     return temp;   
  10. }  

申請不到“信號量”,說明另外的進程正處于給 Exam 賦值并計算其平方過程中(即正在使用此信號),本進程必須等待其釋放信號后,才可繼續(xù)執(zhí)行。

若申請到信號,則可繼續(xù)執(zhí)行,但其它進程必須等待本進程釋放信號量后,才能再使用本信號。

5. 可重入函數(shù)

可重入函數(shù)

10. int *fun(void)與int (*fun)(void)區(qū)別?

int *fun(void) fun是一個函數(shù)名,該函數(shù)的參數(shù)是void型,返回值是 int *

int (*fun)(void) fun是一個函數(shù)指針,該指針用于指向一個函數(shù),函數(shù)的參數(shù)是void型,返回值是 int 即類型如下:

  1. int function(void) 
  2.  return 0; 

11. 32位系統(tǒng)上有如下C程序:

  1. struct person 
  2.  int a; 
  3.  unsigned short int m; 
  4.  char b; 
  5.  char *q; 
  6.  char c; 
  7. }; 
  8. char str[]="yikoulinux"
  9. char *p = str; 
  10. int n = 10; 

則sizeof(str)、sizeof(p)、sizeof(n)、sizeof(int)、sizeof(struct person)的值分別是:

編寫測試程序

  1.  1 #include <stdio.h> 
  2.  2  
  3.  3 int main(int argc, const char *argv[]) 
  4.  4 { 
  5.  5     struct person 
  6.  6     { 
  7.  7         int a; 
  8.  8         unsigned short int m; 
  9.  9         char b; 
  10. 10         char *q; 
  11. 11         char c; 
  12. 12     }; 
  13. 13     char str[]="yikoulinux"
  14. 14     char *p = str; 
  15. 15     int n = 10; 
  16. 16  
  17. 17     struct person pe; 
  18. 18  
  19. 19     printf("sizeof(str):%d sizeof(p):%d sizeof(n):%d sizeof(int):%d sizeof(struct person):%d\n",si 
  20. 20  
  21. 21     printf("%p\n %p\n %p\n %p \n %p \n"
  22. 22             &pe.a,&pe.m,&pe.b,&pe.q,&pe.c); 
  23. 23     return 0; 
  24. 24 } 

編譯執(zhí)行:

  1. sizeof(str):11 sizeof(p):4 sizeof(n):4 sizeof(int):4 sizeof(struct person):16 
  2.  0xbf917d18 
  3.  0xbf917d1c 
  4.  0xbf917d1e 
  5.  0xbf917d20  
  6.  0xbf917d24  

解釋:

 

責任編輯:姜華 來源: 一口Linux
相關(guān)推薦

2021-01-20 07:28:34

嵌入式筆試面試

2021-01-15 07:49:01

嵌入式筆試面試

2021-01-14 10:24:33

嵌入式筆試面試

2021-01-19 07:16:25

嵌入式筆試面試

2021-01-22 07:17:14

嵌入式筆試面試

2021-01-21 08:00:50

嵌入式筆試面試

2010-01-07 10:06:53

2011-01-14 13:13:23

嵌入式Linux開發(fā)

2021-12-26 18:30:56

嵌入式ARM鏈接

2009-12-09 10:12:28

嵌入式Linux

2009-07-17 16:06:59

ARM嵌入式開發(fā)

2024-06-04 14:52:28

2010-01-05 15:22:06

嵌入式微軟應用優(yōu)勢

2010-06-09 19:58:32

嵌入式開發(fā)Windows 7微軟

2011-04-18 11:34:34

嵌入式軟件測試

2009-12-17 10:33:05

嵌入式Linux

2009-12-16 15:41:40

嵌入式Linux入門

2014-04-29 14:58:24

筆試題微軟筆試題

2010-04-20 13:56:37

微軟嵌入式WindowsEmbe

2009-11-30 16:54:28

微軟
點贊
收藏

51CTO技術(shù)棧公眾號