# 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