# 資訊科技產業專案設計課程作業 4
###### tags: `2021 成大 資訊科技產業專案設計`
>貢獻者:強尼 Jony
[2021 年「資訊科技產業專案設計」課程第 4 次作業](https://hackmd.io/@sysprog/info2021/https%3A%2F%2Fhackmd.io%2F%40sysprog%2Finfo2021-homework4?fbclid=IwAR3_MYAlkdyk3Tmw8zrASerr9TYloQ-hue2oNgZllsYF4BNwXdSrtqVNSok)
## 1. 找出較符合自身興趣/規劃的職務描述
### MTK Wlan/WiFi 軟體工程師 - 台北-行善
**(在2021/11/16 已關閉職缺,為了這職缺準備很久了,很想面試進入此職缺)**
> **分公司地點 台北-行善**
> 職類 Software
> 工作經驗 無工作經驗
> 教育程度 碩士
>
> 職缺說明
> 1. Wi-Fi 驅動程式/韌體開發設計及驗證
> 2. Wi-Fi 等無線晶片之跨層架構介面設計
> 3. 維護量產的產品
> 4. 協助研發軟體新技術與新工具
> 5. 產品量產問題分析與解決以及Tier-1客戶支援
>
> 職缺需求
> 1. 碩士以上;電機、電機與控制、資訊科學、資訊工程相關科系畢業為主
> 2. 熟悉嵌入式系統、C/C++ programming
> 3. 具兩年以上嵌入式系統程式開發經驗
> 4. 具Linux/Unix 環境程式開發經驗者
> 5. 具下列任一相關經驗者為佳
> a.對Wi-Fi/Wlan 802.11通訊協定有相關經驗
> b.有peripheral device相關經驗,例如**SPI/I2C/USB/SDIO**
### [WIFI系統設計工程師C3](https://recruit.realtek.com/zh/index.php?option=com_content&view=article&id=10443)
> 工作項目:
> 1. Wifi HAL_API development.
> 2. Wifi Firmware development.
>
> 應徵條件:
> 1. 熟System C, C++, python.
> 2. wifi background(802.11) or experience.
## 2. 探討自己在專業上匹配的程度
選這兩個職位原因,是因為本人具有
嵌入式系統韌體工作經歷:
1. 維護 MCU 韌體產品
包括
* FreeRTOS
* LWIP (ethernet driver)
* SD卡功能: SDIO 介面+FatFs
2. 使用 STM32F103 MCU 開發
* USB HID+鍵盤模擬雙介面輸出
* ESP8266 WIFI: TCP UDP 功能
* SPI: RFID 模組溝通
* I2C: EEPROM功能
符合
> **b.有peripheral device相關經驗,例如SPI/I2C/USB/SDIO**
目前缺的是
> a.對Wi-Fi/**Wlan 802.11通訊協定有相關經驗**
在做老師的 [vwifi.c](https://hackmd.io/@sysprog/linux2021-summer-quiz3) 作業,準備當成 side project 面試
## 3. 面試題目
[面試心得(M/P/R)](https://www.dcard.tw/f/tech_job/p/237530341)
公司:瑞昱
職務說明: BT FW
面試題目:
```
一面:
白板題 :
Linked list 找最大值,找到最大值後在前面加new node
(需考慮只有一個node和NULL的狀況)
Ex. 395 -> 3695
答出後延伸,若只有一個node 9->69
答出後再延伸,若本來就是NULL ->6
二面:
白板題:Sort linked list
```
公司:瑞昱
職務說明: DHC 數位IC
面試題目:
```
一面:
口頭問答:
解釋 synchronous & asynchronous、
blocking & non-blocking
```
公司:聯發科
職務說明: 5G NR 通訊軟體(modem L1)
面試題目:
```
一面:
口頭問答:
tcp/udp、
通訊系統方塊圖、
決策方法(MD, ML, MAP)、
OFDM優缺點&缺點如何解決
```
公司:聯發科
職務說明: 5g multi-mode 通訊協定軟體開發
面試題目:
```
一面:
主管問答:
tcp/udp、pipeline、
白板題:
sort array
```
公司:聯發科
職務說明: wct/cd1 5g、6g modem數位ic
```
面試題目:
主管問答:
取樣定理、
非基頻取樣定理、
錯誤更正碼
```
TODO
- [x] 作答上述的面試題目
公司:瑞昱
職務說明: BT FW
面試題目:
```
一面:
白板題 :
Linked list 找最大值,找到最大值後在前面加new node
(需考慮只有一個node和NULL的狀況)
Ex. 395 -> 3695
答出後延伸,若只有一個node 9->69
答出後再延伸,若本來就是NULL ->6
二面:
白板題:Sort linked list
```
:::info
白板題 :
Linked list 找最大值,找到最大值後在前面加new
```c
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* add_node_before_Max_node(struct ListNode* head,struct ListNode* node){
int max_node_index=0,index=1,max_val=0;
struct ListNode* tem_node=NULL;
if(head==NULL)
{ //答出後再延伸,若本來就是NULL
head=node;
return head;
}
if(head->next==NULL)
{ //答出後延伸,若只有一個node
node->next=head;
head=node;
return head;
}
tem_node=head;//
max_val=head->val;
while(tem_node->next!=NULL)
{ //尋訪 linked list一遍,找出最大值所在節點index
tem_node=tem_node->next;
index++;
if(tem_node->val>=max_val)
{
max_val=tem_node->val;
max_node_index=index;
}
}
tem_node=head;
for(index=1;index<=(max_node_index-1);index++)
{ //鎖定(max_node_index-1)的位址,就相當於在"最大值節點"的前一步節點位址
tem_node=tem_node->next;
}
//將資料插入到 "最大值節點"的前一步節點位址
node->next=tem_node->next;
tem_node->next=node;
return head;
}
```
:::
:::info
白板題:Sort linked list
[148. Sort List](https://leetcode.com/problems/sort-list/)
[花花酱 LeetCode 148. Sort List](https://zxi.mytechroad.com/blog/divide-and-conquer/leetcode-148-sort-list/)
參考用 Merge Sort 寫法
Time complexity: O(nlogn)
Space Complexity: O(log n)
```c=
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* merge(struct ListNode* list1, struct ListNode* list2) {
struct ListNode dummyHead;
dummyHead.val=0;
struct ListNode* ptr = &dummyHead;
while (list1 && list2) {
if (list1->val < list2->val) {
ptr->next = list1;
list1 = list1->next;
} else {
ptr->next = list2;
list2 = list2->next;
}
ptr = ptr->next;
}
if(list1) ptr->next = list1;
else ptr->next = list2;
return dummyHead.next;
}
struct ListNode* getMid(struct ListNode* head) {
struct ListNode* midPrev = NULL;
while (head && head->next) {
midPrev = (midPrev == NULL) ? head : midPrev->next;
head = head->next->next;
}
struct ListNode* mid = midPrev->next;
midPrev->next = NULL;
return mid;
}
struct ListNode* sortList(struct ListNode* head){
if (!head || !head->next)
return head;
struct ListNode* mid = getMid(head);
struct ListNode* left = sortList(head);
struct ListNode* right = sortList(mid);
return merge(left, right);
}
```
:::
---
公司:瑞昱
職務說明: DHC 數位IC
面試題目:
```
一面:
口頭問答:
解釋 synchronous & asynchronous、
blocking & non-blocking
```
:::info
參照
[I/O 事件模型](https://hackmd.io/@sysprog/fast-web-server#IO-%E4%BA%8B%E4%BB%B6%E6%A8%A1%E5%9E%8B)
[I/O Models 中文解說](https://rickhw.github.io/2019/02/27/ComputerScience/IO-Models/)
> ## 阻塞 (Blocking) 與非阻塞 (Non-Blocking)
> 阻塞 (Blocking) 與非阻塞 (Non-Blocking) 描述的是 **請求 在等待結果時的 狀態。**
>
> * 阻塞 (Blocking):調用的程序或者應用程式發起請求,在獲得結果之前,調用方的程序會懸 (Hang) 住不動,無法回應,直到獲得結果。
> * 非阻塞 (Non-Blocking):概念與阻塞相同,但是調用方不會因為等待結果,而懸著不動。後續通常透過輪詢機制 (Polling) 機制取得結果。
>
> ## 同步 (Synchronous) 與 非同步 (Asynchronous)
> 同步 (Synchronous) 與 非同步 (Asynchronous) 描述的是:**使用者執行緒與 Kernel 的 通訊模式。**
>
> * 同步 (Synchronous):使用者執行緒發出 I/O 請求後,要等待、或者輪詢 Kernel I/O 的操作完成後,才能繼續執行。
> 等待 Kernel 回覆:Blocking IO,縮寫成 BIO
> 輪詢類似於 Non-Blocking IO,縮寫成 NIO
> * 非同步 (Asynchronous):或稱 異步,使用者執行緒發出 I/O 請求後仍然繼續執行下一個操作,當 Kernel I/O 操作結束後,會通知執行緒,或者呼叫 callback 函數。
:::
公司:聯發科
職務說明: 5G NR 通訊軟體(modem L1)
面試題目:
```
一面:
口頭問答:
tcp/udp、
通訊系統方塊圖、
決策方法(MD, ML, MAP)、
OFDM優缺點&缺點如何解決
```
:::info
**Q: tcp/udp**
ANS:
TCP:通訊前要先建立三方交握,**和對方建立連線後才能傳送封包**
UDP:封包指定 destination IP後,**不用先和對方建立連線,就能直接發送封包**,沒有保證是否成功送達,UDP 常用在廣播發送封包
:::
:::info
**Q : 通訊系統方塊圖**
ANS:
[解析通訊元件:由基頻、中頻、射頻零組件讓你一次看懂手機晶片](https://m.moneydj.com/f1a.aspx?a=c5265d2c-eaab-4b3c-a58d-7a8630a46d24)
> ## 通訊系統架構示意圖
> 
> ## 無線通訊系統架構示意圖
> 
:::
:::info
**Q : OFDM優缺點&缺點如何解決**
ANS:
[解析通訊技術:3G、4G、5G 背後的科學意義(上)](https://technews.tw/2015/10/06/3g%E3%80%814g%E3%80%815g-meaning/)
[解析通訊技術:3G、4G、5G 背後的科學意義(下)](https://technews.tw/2015/10/12/3g%E3%80%814g%E3%80%815g-meaning-part-two/)
[解析通訊元件:由基頻、中頻、射頻零組件讓你一次看懂手機晶片](https://m.moneydj.com/f1a.aspx?a=c5265d2c-eaab-4b3c-a58d-7a8630a46d24)
> ### 「調變技術(Modulation)」與「多工技術(Multiplex)」
> **數位訊號調變技術(ASK、FSK、PSK、QAM)**:**將類比的電磁波調變成不同的波形來代表 0 與 1 兩種不同的數位訊號。**
> * ASK 用振幅大小來代表 0 與 1、
> * FSK 用頻率大小來代表 0 與 1、
> * PSK 用相位(波形)不同來代表 0 與 1、
> * QAM 同時使用振幅大小與相位(波形)不同來代表 0 與 1。
>
> **多工技術(TDMA、FDMA、CDMA、OFDM):將電磁波區分給不同的使用者使用。**
> * TDMA 用時間先後來區分是你的還是我的,
> * FDMA 用不同頻率來區分是你的還是我的,
> * CDMA 用不同密碼(正交展頻碼)來區分是你的還是我的,
> * **OFDM 用不同正交子載波頻率來區分是你的還是我的。**
[OFDM和OFDMA的主要優缺點](https://www.itread01.com/content/1544515264.html)
[OFDM是正交分頻多工有什麼優缺點](https://www.stdans.com/a/202101/164509.html)
:::
---
公司:聯發科
職務說明: 5g multi-mode 通訊協定軟體開發
面試題目:
```
一面:
主管問答:
tcp/udp、pipeline、
白板題:
sort array
```
:::info
**Q: tcp/udp**
ANS:
TCP:通訊前要先建立三方交握,**和對方建立連線後才能傳送封包**
UDP:封包指定 destination IP後,**不用先和對方建立連線,就能直接發送封包**,沒有保證是否成功送達,UDP 常用在廣播發送封包
:::
:::info
**Q: pipeline**
[面試整理](https://hackmd.io/@g9tdU4gDSTiEZrerd0g7-w/SyCXEfsSE#9)
`什麼是pipeline? 用pipeline有什麼好處/壞處?`

`IF:讀取指令,ID:指令解碼,EX:執行,MEM:記憶體存取,WB:寫回暫存器`

`一個氣泡(hiccup)在編號為3的時脈週期中,指令執行被延遲`
```
是為了讓計算機和其它數位電子裝置能夠加速指令的通過速度(單位時間內被執行的指令數量)而設計的技術。
沒pipeline的架構產生的效率低,因為有些CPU的模組在其他模組執行時是閒置的。
如果一條pipeline能夠在每一個cpu clock週期接納一條新的指令,
被稱為完整管線化(fully pipelined)。
因pipeline中的指令需要延遲處理而要等待數個cpu clock,被稱為非完整管線化。
在執行相同的指令時,非pipeline的指令傳輸延遲時間(The instruction latency)比pipeline處理器明顯較短。
這是因為pipeline的處理器必須在資料路徑(data path)中添加額外正反器(flip-flops)
```
:::
:::info
**Q: 白板題 sort array**
Ans:
[912. Sort an Array](https://leetcode.com/problems/sort-an-array/)
[花花酱 LeetCode 912. Sort an Array](https://zxi.mytechroad.com/blog/algorithms/array/leetcode-912-sort-an-array/)
:::
---
公司:聯發科
職務說明: wct/cd1 5g、6g modem數位ic
```
面試題目:
主管問答:
取樣定理、
非基頻取樣定理、
錯誤更正碼
```
:::info
**Q:取樣定理**
ANS:
[一、取樣定理(Sampling Theorem)](https://mropengate.blogspot.com/2015/04/sampling-theoremaliasing-effect.html)
如果有一個**有限頻寬(band-limited)之訊號**,並且**採樣頻率大於最高頻率的2倍**,**那麼原來的連續信號可以從採樣樣本中完全重建出來。**
:::
:::info
**Q:非基頻取樣定理(Nonuniform sampling)**
ANS:
[**非均勻採樣**](https://zh.wikipedia.org/wiki/%E9%9D%9E%E5%9D%87%E5%8B%BB%E6%8E%A1%E6%A8%A3)
非均勻取樣(Nonuniform sampling)是取樣定理下的產物,
藉由[拉格朗日插值法( Lagrange polynomial )](https://zh.wikipedia.org/wiki/%E6%8B%89%E6%A0%BC%E6%9C%97%E6%97%A5%E6%8F%92%E5%80%BC%E6%B3%95)及均勻取樣理論的關係,來達成滿足取樣定理的概括化型態。
取樣定理限制了在對連續訊號取樣時的條件,如[奈奎斯特準則(Nyquist–Shannon sampling theorem)](https://zh.wikipedia.org/wiki/%E9%87%87%E6%A0%B7%E5%AE%9A%E7%90%86),以避免取樣後的重構時產生訊號缺陷。
而**非均勻取樣則是在不同時間有不同的取樣間隔,但平均下來,整段取樣滿足取樣定理的限制,根據取樣定理的回推,這樣的作法在有限頻寬訊號重構時不會造成缺陷。**

:::
:::info
**Q:錯誤更正碼(Error Correction Codes)**
ANS:
[What is Error Correction Codes?](http://ctld.nthu.edu.tw/bookclub/blog/?update_id=2084)
[錯誤檢測與糾正](https://zh.wikipedia.org/wiki/%E9%94%99%E8%AF%AF%E6%A3%80%E6%B5%8B%E4%B8%8E%E7%BA%A0%E6%AD%A3)
**傳輸一筆資料封包時,會帶一個檢查碼**,用來**驗證這筆封包資料內容是否正確而沒損毀。** 常見的檢查碼,驗證方式有
* [parity bit](https://zh.wikipedia.org/wiki/%E5%A5%87%E5%81%B6%E6%A0%A1%E9%AA%8C%E4%BD%8D) : UART 傳輸的封包格式中,有個 parity bit,該 bit 就是用這方法驗證封包正確性
* [Checksum](https://zh.wikipedia.org/wiki/%E6%A0%A1%E9%AA%8C%E5%92%8C)
* [CRC](https://zh.wikipedia.org/wiki/%E5%BE%AA%E7%92%B0%E5%86%97%E9%A4%98%E6%A0%A1%E9%A9%97)
:::