# MTK 考古題整理 ###### tags: `job` - [心得列表](https://docs.google.com/spreadsheets/d/1v5XikIdLUi8mpmXk2_XCXlv6-nqN-RpZl7xSlmsznCQ/edit?usp=sharing) ## 提問問題 - 這個職位剛上任的新人,通常比較多會碰上什麼樣的技術或非技術的問題?或在初期哪部分是比較無法適應的? - 新人的訓練過程和時間? - 部門是否有出差或是和國外R&D工程師、客戶接觸合作的機會? - 平均工時長短,以及加班頻率? - Code Review 的方式,測試部分? - 部門做的事變動會不會很大 ## 考古題 ### [MTK面試考題](http://gillwei7.pixnet.net/blog/post/334847137) 1. C中為何使用 volatile? 他的意義是甚麼? Reference 和 pointer之間有甚麼關係? > [name=JC] A. volatile 會使得compiler不會對此變數做最佳化,如:放到 register 裡面。使用的情境大多是此變數會被硬體更動,因此希望程式每次都會從記憶體讀取此變數的值,確保此變數被改變後,程式還是從memory讀值以免造成錯誤。 > reference 是C++中才有的概念,代表的是一個變數的別名,pointer則是代表一個記憶體位址 2. 1. const int * a 和 int * const a 有甚麼差別? 2. 對應到 (1) a = 3 (2) *a = 3; 如何對應是無法成立的? >[name=JC]const int * a 代表a是一個指向 const int 的pointer,所以a可以改變但a所指向的int不能改變。`int * const a` 代表a是一個const的pointer且指向一個int,代表a本身的值不能改變但a所指向的int可以改變。 5. 作業系統中, 甚麼是priority inverse? >[name=JC]高優先度的process被低優先度的process preempt,舉例:優先度 T1 > T2 > T3,T1, T3共用同一個資源R,若R先由T3取得,接著T2 preempt T3, T1 preempt T2,由於T1須等T3釋放R,OS會先執行T2,在執行T3,T3釋放資源後T1才會被執行。在這個例子中T1優先度高於T2,T2卻會優先執行,這就是priority inverse。解決方法:priority inheritance,讓T3擁有與T1相同的優先度 7. 為什麼Interrupt 要分成High level ISR 和 Low level ISR? 簡述Interrupt 如何在電腦中運行。 >[name=JC] (level = priority?) 由於不同類型的 isr 對於latency 的要求不同,例如:鍵盤跟滑鼠輸入會影響使用者體驗,因此要有比較高的順位 9. C和C#一個很大的差異, 在於C# 的類別屬性如private等, 是定義在function的前面 10. 簡述SPI的protocol如何運作 11. Linux (Ubuntu 14)中使用何種套件? 12. 傅利葉轉換為什麼可以做轉換? ### [[面試] 聯發科技 MTK (內含考題)](https://wubui.pixnet.net/blog/post/41242054) 1. Explain `#error` >[name=JC] > - defined() : 檢查某的巨集定義是否被定義了,通常與 #if 合用,像是 #if defined(OS) … > - #error : 在編譯時,輸出錯誤訊息,警告使用者某些錯誤,並且不會真的進行編譯,在巨集處理階段就會停止。 > - #warning:在編譯時,輸出警告訊息,警告使用者某些注意事項,但是不會中止編譯,仍然會繼續編譯出目的檔。 > - #pragma: 用來告知編譯器某些特殊指示,例如不要輸出錯誤訊息,抑制警告訊息,或者加上記憶體漏洞檢查機制等。 > > 雖然 #error 與 #warning 後的訊息並不需要加上字串式的引號,但是建議最好還是加上,以避免特殊符號所產生的一些問題,導致巨集處理器的誤解。以下是這兩種狀況。 > - 不好:#warning Do not use ABC, which is deprecated. Use XYZ instead. > - 較好:#warning "Do not use ABC, which is deprecated. Use XYZ instead." > > [name=Ray] > ```cpp > #if defined(BUILD_TYPE_NORMAL) > # define DEBUG(x) do {;} while (0) /* paranoid-style null code */ > #elif defined(BUILD_TYPE_DEBUG) > # define DEBUG(x) _debug_trace x /* e.g. DEBUG((_debug_trace args)) > */ > #else > # error "Please specify build type in the Makefile" > #endif > ``` > When the preprocessor hits the #error directive, it will report the string as an error message and halt compilation; what exactly the error message looks like depends on the compiler. 3. Explain `struct` and `union` >[name=JC] struct 可以包含多種 data type 的成員,而且每個成員都有獨立的記憶體空間。union 與 struct 最大差別就是 union 所有成員共用同一塊記憶體,所以 union 的大小會是最大成員的大小。 5. Explain `volatile`. Can we use `const` and `volatile` in the same variable? Can we use "volatile" in a pointer? >[name=JC] volatile 告訴 compiler 不要優化這個變數的存取,每次都要去記憶體讀,以免變數被其他程式改掉後造成非預期的結果。典型的應用場景為CPU會用到某個IO 的 register 的值,而這個值利用MMIO且會被硬體更新,此時就要用 volatile 確保 CPU每次都會去讀記憶體而不是直接從自己的register拿。 > const 與 volatile 是可以共存的,代表這個程式本身不會去更改此變數,且每次都會去記憶體取值。 >[name=Ray] 假設要(監看)一個 CPU flag 時就是不錯的時機。 7. Q: the final value of v? ```cpp unsigned long v1 = 0x00001111; unsigned long v2 = 0x00001202; unsigned long v; v = v1 & (~v2); v = v | v2; ``` >[name=Frank]first v = 0x00000111 > final v = 0x00001313 5. Q: the value of *(a+1), (*p-1)? ```cpp int a[5] = {1,2,3,4,5}; int *p = (int *)(&a+1); ``` > [name=JC]*(a+1) == a[1] == 2 > (*p-1) == a[5] - 1 7. write a code a. set the specific bit b. clear the specific bit c. inverse the specific bit (0->1; 1->0) >[name=JC]//set a bit > target |= (1UL << position); > //clear bit > target &= ~(1UL << position) > //inverse bit > target ^= 1UL << position 9. Re-write ```cpp void (*(*papf)[3])(char *); typedef__________; pf (*papf)[3]; ``` >[name=JC] > `typedef void (*pf)(char*);` > pf (*papf)[3]; > papf 只是一個"指向array的pointer!!!",且這個array的每一個element都是一個 function pointer 11. write a code that check the input is a multiple of 3 or not without using division or mod >[name=Ray] >```cpp >bool isMultipleOf3(int n){ > if ((n - 3 * (n/3)) == 0 ) > return true; > return false; >} >``` >[name=JC]https://zerojudge.tw/ShowThread?postid=17858&reply=0 13. Explain lvalue and rvalue. >[name=JC]lvalue: 運算完成後仍然會保留其狀態,可出現在等號左右兩邊 > rvalue: 不會保留狀態,通常為常數 > function 若return 一個reference則為lvalue,否則為rvalue ### [2015 研替面試之小小心得](https://www.facebook.com/notes/lee-chao-yuan/2015-%E7%A0%94%E6%9B%BF%E9%9D%A2%E8%A9%A6%E4%B9%8B%E5%B0%8F%E5%B0%8F%E5%BF%83%E5%BE%97/994199820640092/) #### MTK 1. 什麼情況下會產生 stack overflow,如何避免。 >[name=RJ]recursive without stop 2. 講講Interrupt,寫 ISR要注意什麼。 >[name=RJ] 不要占用CPU太久? >[name=Ray] 1、ISR不能有返回值 >2、ISR不能傳遞參數 >3、ISR應該是短而高效的,在ISR中做浮點運算是不明智的 >4、ISR中不應該有重入和性能上的問題,因此不應該使用pintf()函數 3. 什麼時候會產生 race condition。 >[name=RJ] 當有多條thread對同一變數做操作時 4. DMA是什麼,好處是?請簡單在白板上畫出他的架構圖。 > [name=RJ] > https://www.quora.com/What-is-the-function-of-DMA-in-a-computer 5. 講講 memory hierarchy > [name=RJ] stack, heap, bss, data, text > [name=JC] 應該是 register, cache, main memory, disk > [name=HY] 任鈞說的答案是"memory layout" 7. Edge trigger和 level trigger的差別。 > [name=RJ] Edge trigger 狀態改變時觸發 > Level trigger 符合狀態時觸發 > [name=HY] `select`是屬於level trigger。 8. 有沒有寫過Kernel space的程式。 9. 碰過最難的或印像深刻的bug,你怎麼處理的? > 用GDB > [name=Ray] 回去仔細看spec 10. 專題如何分工,介面怎麼切割?是否有版本控管? > #### Synology 1. 在嵌入式平台上面使用過哪些Linux tool、Debug tool、Profiling tool 1. 你說你使用過perf 效能分析工具,那它的原理是什麼,為什麼可以作到。 1. 請講一下你用過GDB的什麼功能,用來解決什麼問題。 1. 在嵌入式平台上開發跟在一般PC上開發有什麼不一樣和要注意的地方。 1. TCP/UDP差別在哪,用途?Socket程式大概怎麼寫?(三向交握那些) 1. Client和Server在做網路通訊時,recv buffer包含了什麼資訊。 1. Critical section是什麼?(之後我提到了Mutex) 1. Mutex程式大概怎麼寫?撰寫時有什麼要注意的地方? 1. Process 和 thread 差別?如果是不同process,如何保護Critical section? 1. 有沒有寫過shared memory,大概怎麼寫,寫的時候要注意什麼。 1. 原本好像要問我fork(),不過之後不知道為什麼就沒問了 1. 講講虛擬記憶體和分頁機制。 1. 現在有兩個整數集合要進行差集,怎麼寫?為什麼用這種資料結構?有沒有更快的方法?時間和空間複雜度各是多少?(我舉了array、linked list、binary search tree、hash table的實作方式) 1. 解釋對稱式和非對稱式加密,為什麼他們可以運作,如何運作。 1. 公鑰跟私鑰的差別跟用途?數位簽署的原理? 1. Linux 系統如何儲存使用者密碼。 1. 為什麼能確保加密資料不會被字典攻擊。 1. 講講SQL injection 跟XSS 攻擊。 1. 為什麼宣告並初始一個超大陣列會crash,而宣告成static就不會,他們的儲存方式有什麼差別。(之後我有講到stack、heap、global) 1. stack 和 heap差別是什麼。 1. function在進行呼叫的時候OS會作什麼事情,組合語言大概怎麼寫。 1. 白板題:給定一個數列和一個數字,請寫出partition的程式,左邊小於此數字,右邊大於等於此數字,要確保所有特殊數列都能通過測試。 1. 白板題:順時鐘旋轉一張 NxN 的灰階圖片,不可以使用額外的二維陣列。 ### [[個人] 2011面試心得 (凌通,勝品電通,聯發科)](http://albert-oma.blogspot.com/2011/12/2011.html) 1. Write a code to swap integer a, b, without temporary variable. >[name=Ray] >```cpp >int a, b; >a = a + b; >b = a - b; >a = a - b; 2. Write 3 function: a) set a bit. b) clear a bit, c) inverse a bit. >[name=Ray] a) | >b) & >c) ^ 3. Write a MARCO to calculate the square of integer a. >[name=Ray]若Square(3+5) = 3+5*3+5 = 23 > [name=HY, Ray, JC] `#define SQUARE(a) ((a)*(a))` 5. Write one line expression to check if a integer is **power** of 2 > [name=HY] `return (target != 0) && ((target & (target-1)) == 0)` > [name=JC] power of 2 減一之後剛好會使全部的 bit 翻轉 7. Write a function to find the middle field of singled-linked list without traverse whole list. 8. Write a code to reverse the linked list. For example: [0] -> [n], [1]->[n-1],…[n]->[0]. >[name=JC]解答:https://juejin.im/post/5d49b25451882504fb3011d0 > ```cpp > struct ListNode* reverseList(struct ListNode* head){ > if(head == NULL) > return NULL; > > struct ListNode* p = head->next; > head->next = NULL; > while(p != NULL) { > struct ListNode* temp = p->next; > p->next = head; > head = p; > p = temp; > } > > return head; > } > ``` > > 延伸:reverse binary trees (https://mp.weixin.qq.com/s/wr8zkLMjoIMYArCLFXLb4g) > 延伸:linked list 面試題大統整 (https://www.jianshu.com/p/490cb181946f) 9. Find the possible error ```cpp int ival; int **p; ival = *p; ``` > [name=RJ]p沒有給定位址就dereference > [name=HY] `ival`是`int`,`*p`是`int *`,型別不一致 8. What is the possible error of below SQR function. ```cpp int SQR(volatile int *a) { return (*a)*(*a); } ``` > [name=HY] 由於`a`為`volatile`,因此在兩次去記憶體取值之間,如果`*a`的值被改掉(例如:ISR改掉的),會導致兩次取的`*a`不一樣,算出來就不是平方的值。 ### [2017聯發科實習面試](http://andersenhuang.blogspot.com/2017/05/2017.html) 1. 介紹一下Thread >[name=JC] thread 也有人叫做 light weight process,thread 與 process 最主要的差別是在有沒有共用記憶體空間,同一個 process 的 thread 會共用記憶體空間 3. C跟C++有什麼差別 >[name=JC] C 可以看做是 C++ 的子集,C++比起 C 多了物件導向的概念。 5. 物件導向的語言有什麼特性?繼承 封裝 多型是什麼? 6. TCP/IP跟UDP有什麼差別? TCP/IP如何知道傳出去的資料對方沒接收到? >[name=JC] TCP 與 UDP 都是建構於 IP 上,只是 TCP 是可靠的傳輸 UDP 則否。TCP receiver 需要回應 ACK 讓 sender 知道有收到資料。 8. Interrupt是什麼? 9. 介紹一下Mutex、Semaphore、Spinlock >[name=JC] 三者皆為保護 critical section 的方法 >mutex: 只容許一個process 進入 critical section,沒拿到 mutex 的人會釋放 CPU >semaphore: 可容許多個 process 進入 CS,進不去的會釋放 CPU >spinlock: 只容許一個 process進入 CS,進不去的不會釋放CPU,會一直繼續執行。適用於context switch cost 很高的狀況。 11. Driver是什麼?他扮演什麼角色? 12. Thread 是怎麼避免 Race Condition 的?把Code寫出來看看 >[name=Ray] use mutex ```= pthread_mutex_t mutex; pthread_mutex_lock(&queue); CS. pthread_mutex_unlock(&queue); ``` 13. 如果有一個變數型態是pointer-to-pointer那代表什麼? 14. 之前大學上作業系統的時候,有沒有寫過Thread相關程式,寫了什麼? 15. 作專題的時候扮演什麼角色? 16. 作專題是怎麼分工的? 17. 作專題有遇到什麼問題? 18. 如果老師出了一個作業,你是會到Deadline前幾天才開始,還是會早點準備? 19. 作過最常的專案是多長? ### [新竹聯發科軟韌一面](http://arc2453.blog.fc2.com/?m2=form&no=31) 1. Global 直接宣告參數不給值,跟function 裡面宣告參數不給值,直接印會印出什麼? > [name=RJ] Global 0 > function stack殘存值 2. 兩個 String還是Char陣列,分別丟同樣的字串,問如果直接`==`會有什麼樣的結果?true,false或不能編譯? > [name=RJ]char 陣列存的是pointer > 若指向位址不同則會false 3. ```cpp SWAP( int* a, int* b){ temp=a; b=a; b=temp; } ``` 問:丟10和20進去求output? 什麼output? 4. a) int a; // An integer b) int *a; // A pointer to an integer c) int **a; // A pointer to a pointer to an integer d) int a[10]; // An array of 10 integers e) int *a[10]; // An array of 10 pointers to integers f) int (*a)[10]; // A pointer to an array of 10 integers g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer 5. 有考extern用法,印象有點模糊,但記得有全域跟區域還有加上extern宣告的x問會輸出哪個值,a丟20之類求output ```cpp int x= 10; //global void func(int a) { int x = 15; if (a > 10) extern int x; cout << x ; } ``` >[name=Ray] >```cpp >cout << "x=" << func(20) >``` >x=15 6. C裡面的memory,程式段(.text)主要存放程式的機器碼,資料段(.data)則是存放全域變數的資料,BSS 段(.bss)存放的是未初始化的全域變數,堆積段(.heap)程式使用 malloc 進行記憶體分配時,可以分配的動態記憶空間,堆疊段(.stack)則存放「參數、函數返回點、區域變數、框架指標」等資料。有出多選題問Stack裡面放什麼資料,感覺算常考建議詳細再上網多查QQ 7. Macro 的陷阱題,這題真的太精彩了看到的時候笑了出來XDDD,跟我之前去聯發科參加活動時的題目完全一樣 ```cpp #define INC(x) x*=2; x+=1 for(i=0,j=1;i<5;i++) INC(j); ``` 求j =? 答案是33,據說答對率3% XDDD > [name=HY] 答案真的是33QQQQQQQQ > 因為for迴圈後面沒有大括號,所以macro還原之後其實是: > ```cpp > for(i=0, j=1; i<5; i++) > j*=2; > j+=1; > ``` > 所以其實只有`j*=2`是算在for迴圈的body,`j+=1`不是。 > 8. 給一個陣列大小 n,跟一串陣列,你要找出連續加起來最大值跟其數字。比方說給 6 [1, 2, -1 ,3, 0, 1],那你就要output連續最大值是 3+0+1=4 跟 [3,0,1] > 為什麼答案不是[1, 2, -1, 3, 0, 1]?這樣加起來不是6嗎?比4還大吧? > bug? ### Misc 1. 用bit operation(xor) 做 swap > [name=RJ] a ^= b > b ^= a > a ^= b 2. 經典題目Maximum Subarray 3. 判斷 int 溢位 4. Maximum Subarray 5. Reverse linked list 6. pipeline 為何不能愈深愈好? Cache 為何不是愈多愈好? >[name=JC] pipline 越深 branch hazard 越大,因為會讀進更多用不到的指令。 >關於cache:https://zhuanlan.zhihu.com/p/32058808 8. OS相關基本題: Interrupt、Process & Thread、Multi-thread、Mutex&Semaphore、Spin lock、Sync相關各類問題、volatile、Pipeline 9. C\C++: Overloading、Virtual Function、Funtion Pointer、各種不同scope的Static用法、Stack/heap/.bss架構 10. 演算法: 特別需要熟悉複習的有 Sorting、Linked list各種implementation (e.g. reverse)、Stack&heap的實現 11. 找某個數字的所有公因數 12. 計算數字化成二進位後總共有多少個1,用bit operation的方式 13. 比較各個sorting複雜度和優缺點以及是如何實作,如果遇到連續分次輸入大量的數字,每次輸入一個數字過後都會進行sorting的話,會使用哪種方式? 14. 給定一篇 paragraph,將它轉成二進位輸出。 15. 給定一個正整數數列進行排列,使其奇數在前,偶數在後。奇數部份由小到大排列,偶數部份由大到小排列。 16. 給定一個正整數n,求出第n個質數。 17. a=3,b=2,a+++b輸出多少? >[name=JC] `a+++b = (a++)+b = 5` 19. string 反轉 >[name=JC]https://matthung0807.blogspot.com/2018/12/leetcode-reverse-string.html 20. 找出一個 array 中只出現過一次的數字,input 只會有一個符合條件的數字。Ex. [2,6,8,2,8,8] -> 6 >[name=JC] https://blog.csdn.net/ouyangyanlan/article/details/72668012