嵌入式常用見筆試題

1.實現strcpy

不調用庫函數實現字符串拷貝函數:strcpy.
  /**********************
  * C語言標準庫函數strcpy的一種典型的工業級的最簡實現
  * 返回值:目標串的地址。
  * 對於出現異常的情況ANSI-C99標準並未定義,故由實現者決定返回值,通常爲NULL。
  * 參數:
  * strDestination 目標串
  * strSource 源串
  ***********************/
char *strcpy(char *strDestination,const char *strSource)
  {
  assert(strDestination!=NULL && strSource!=NULL);
  char *strD=strDestination;
  while ((*strD++=*strSource++)!='\0');
  return strDestination;
  }
 /*
  GNU-C中的實現(節選):
  */
char* strcpy(char *d, const char *s)
  {
  char *r=d;
  while((*d++=*s++));
  return r;
  }
/* while((*d++=*s++)); 的解釋:兩層括號是爲了取賦值表達式的值,而賦值表達式的值爲左操作數,所以在複製NULL後,循環停止 */

2.絕對地址跳轉

一般在bootloader跳轉到App是通過絕對地址跳轉的方式完成跳轉的。比如bootloader位置flash地址0xA0000000處,App位於flash地址0xA0002000處,可使用以下程序片段跳轉到App:
bootApp = (void(*)())(0xA0002000);
 (*bootApp)();  //jump to App

3.編寫冒泡排序

參考例程
void my_sort(char *data ,int len)
{
	int i,j,temp;
	for(i=0;i<len-1;i++)
		for(j=1;j<len-i;j++)
			if(data[j]<data[j-1])
			{
				temp = data[j];
				data[j] = data[j-1];
				data[j-1] = temp;

			}

}


4.linux筆試題參考答案

(僅供參考,只是個人見解)

1、255.255.254.0網段最多能支持多少主機?

答: 256 

2、10M網卡傳輸過程中物理層採用什麼編碼?

答: 曼徹斯特編碼

3、棧與隊列的特點?

答: 棧是先進後出,只能操作尾節點,隊列是先進先出。

4、Cache的工作方式劃分?

答: write-none,write-all,write-through( 寫通 cache ,執行寫操作時同時寫入主存與cache)  write-back (寫回 cache ,執行寫操作時不寫入主存,除非需要替換)

5、什麼叫NMI中斷?

答: 不可屏蔽中斷

6、RISC主要性能及特性?

答: 精簡指令集, RISC 微處理器不僅精簡了指令系統,採用超標量和超流水線結構;它們的指令數目只有幾十條,卻大大增強了並行處理能力  性能特點一:由於指令集簡化後,流水線以及常用指令均可用硬件執行;

性能特點二:採用大量的寄存器,使大部分指令操作都在寄存器之間進行,提高了處理速度;

性能特點三:採用緩存— 主機—外存三級存儲結構,使取數與存數指令分開執行,使處理器可以完成儘可能多的工作,且不因從存儲器存取信息而放慢處理速度。

7、在嵌入式系統中,所謂的北橋指的是什麼?

答: “ 南北橋  主要適用於 INTEL  X86 結構體系,和嵌入式系統沒有直接的關聯。 北橋  主要指母板上 CPU 和內存等高速核心部分的控制和通訊橋接芯片,而  南橋 則指和擴展總線和 IO 的控制和通訊橋接芯片。所謂南北的涵義主要體現在其芯片組在母板上的位置(相對於 CPU  —— 上北下南。在嵌入式系統中通常叫 AHB/APB 
實際上就是高速總線和低速總線

(2)簡答題:

1、說說輪巡任務調度與搶佔式任務調度的區別?

答: 輪詢任務調度與搶佔式任務調度的區別在於搶佔式調度可以因爲優先級高的任務搶佔 cpu ,而輪詢的不能。

2、什麼叫存儲器高速緩存技術,其主要目的?

答: 高速緩存英文是 cache 。一種特殊的存儲器子系統,其中複製了頻繁使用的數據,以利於 CPU 快速訪問 。

3、畫出計算機組成的最小邏輯框圖。(哼,這道題竟然10分)

4、談談Volatile與Register修飾符的作用? 答: volatile 是純程序與在硬件上運行的程序的最大區別,在 linux 系統中編譯時必須進行優化 的,加上 volatile 關鍵詞的變量是讓編譯器不對其優化。

register 是建議 編譯器使用寄存器來優化對變量的存取

1.      linux內核裏面,內存申請有哪幾個函數,各自的區別?

答: kmalloc  get_free_page  get_free_pages 

kmalloc 函數申請的內存可以任意大小,但是 kmalloc 最大隻能開闢 128k-16  16 個字節是被頁描述符結構佔用了。

 get_free_page  get_free_pages 是申請的內存以頁的大小爲基準,大小爲頁的整數倍。

get_dma_pages, 這個函數除了以上功能外還能支持 DMA 傳輸。

2.      IRQ和FIQ有什麼區別,在CPU裏面是怎麼做的?

答: IRQ 是普通中斷, FIQ 是快速中斷,在 ARM 體系中,對於快速中斷模式,有 8 個獨立的寄存器,轉換模式時無需將數據保存起來,而 IRQ 則不能,這樣 FIQ 的速度就大大地提高了。

3.

int *a;

char *b;

a和 b本身是什麼類型?

答: 是指向整型的指針, b 是指向字符型的指針 。

a、b裏面本身存放的只是一個地址,難道是這兩個地址有不同麼?

4.中斷的上半部分和下半部分的問題:

講下分成上半部分和下半部分的原因,爲何要分?講下如何實現?

答: (見《中斷上下文》一文)

5.內核函數mmap的實現原理,機制?

答: 原型: void  *mmap  (struct file *  struct vm_area_struct *)

實現原理:

a. 先通過文件系統定位要映射的文件; 
b. 
權限檢查 , 映射的權限不會超過文件打開的方式 , 也就是說如果文件是以只讀方式打開 , 那麼則不允許建立一個可寫映射; 
c. 
創建一個 vma 對象 , 並對之進行初始化; 
d. 
調用映射文件的 mmap 函數 , 其主要工作是給 vm_ops 向量表賦值; 
e. 
把該 vma 鏈入該進程的 vma 鏈表中 , 如果可以和前後的 vma 合併則合併; 
f. 
如果是要求 VM_LOCKED( 映射區不被換出 ) 方式映射 , 則發出缺頁請求 , 把映射頁面讀入內存中 .

在中斷缺頁機制中實現的。

6.驅動裏面爲什麼要有併發、互斥的控制?如何實現?講個例子?

答: 在驅動程式中,當多個線程同時訪問相同的資源時(驅動程式中的全局變量是一種典型的共享資源),可能會引發 " 競態 " ,因此我們必須對共享資源進行併發控制。Linux 內核中解決併發控制的最常用方法是自旋鎖和信號量(絕大多數時候作爲互斥鎖使用)。

而互斥是指任何時刻只允許一個進程使用某一共享資源,其他進程等待。實現是利用臨界區。

7.spinlock自旋鎖是如何實現的?

答: 最多隻能被一個可執行單元持有,不會引起調用者睡眠,它會一直忙循環,如果對應的資源不釋放鎖。實現過程是:

spin_lock_init(x):初始化自旋鎖x

spin_lock(lock):獲取自旋鎖

spin_trylock(lock):也是獲取自旋鎖,但不忙等待。

spin_unlock(lock):釋放自旋鎖。

8.任務調度的機制?

答:從調度策略、調度時機、調度步驟來講


陸續更新...


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章