|Jobs| 系統廠軟體工程師生存守則

  1. 一開始的 domain knowledge 問同事
  2. 環境建置問同事 + 文件囉
  3. Unit Tests 可以幫助你了解這產品做什麼
  4. 了解文件從哪取得
  5. 縮寫很多 要去查出來並理解
  6. 先知道做什麼 -> 看文件與流程 -> 對照 log 去 Trace code
  7. 以事件為單位 去 trace code
  8. 文件盡量直接從原廠找最新的,自己家的設計才是問同事或 PM
  9. 看懂 function pointer, macro
  10. 注意晶片廠自己定義的 structure 與 型別
    例如: bool v.s. boolean
  11. 各層之間傳遞, 都是用 command (message)
    要弄清楚幾個詞的意義與方向:
    Indicator(單純從底層報訊息上來的東西)
    Request(從上層要問底層資訊的)
    Response(底層回給上層的)
    Unsolicited(單方向的發送)
    Solicited(有一問一答的)
    Notification(單方向的發送)

另外,Open source library 使用時要注意權限。

系統廠就是要學會如何用原廠資源兜出客戶要的東西。各種組合出神奇的產品。

Code 兜的好,生存沒煩惱。

|Design| Make a cache in your program.

Cache 原意是指存取速度比一般隨機存取記憶體(RAM)快的 SRAM。
但在軟體中,就是指:暫存的機制。
目的是:降低存取一些值的代價。

你可以不用為了某個值,每次都要去問底層。
或者,某些 indicator 更新太頻繁,但你不希望上層跟著一直做無意義的更新,就會需要一個 Cache (很像 Temp 去接著它)。

 
比較常見的例子:
瀏覽器的 Cache 功能是可以減少你抓取資料的時間。

|Jobs| LTE 是如何拿到位置和時間的?

先介紹一個詞:System Information Block

LTE 的系統資訊,會廣播到手機端,其中,

SIB16: GPS Related Informatin,

    包含位置及世界標準時間 (Coordinated Universal Time, UTC) 資訊

 

所以手機時間的來源有:

LTE 網路、NTP Server、或是電信商可能會支援 NITZ

延伸:

NTP (Network Time Protocol) Server?

NITZ (Network Identity and Time Zone)?

|Code| 如何在 C++ 程式使用 C api ?

C++ 可以引用其他 C語言寫的 api,這不意外。

但要怎麼做?

C++:

請在把要使用的 C api 的 header 用 extern “C” 包起來

extern "C"
{
#include "demo_c_api_A.h"
#include "demo_c_api_B.h"
}

 

而要被使用的 C api 的 header:

demo_c_api_A.h:

#ifndef DEMO_C_API_A_H
#define DEMO_C_API_A_H

#include "aaa.h"
#include <bbb.h>

#ifdef __cplusplus
extern "C"
{
#endif

...

(C 的 header 原本該寫的東西)

...

#ifdef __cplusplus
}
#endif

#endif

 

你也可以不要直接用 extern 標全部,單獨寫:

#ifndef DEMO_C_API_A_H
#define DEMO_C_API_A_H

#include "aaa.h"
#include <bbb.h>

extern int c_api_A_init();


(C 的 header 原本該寫的東西)

#endif
#endif

 

 

延伸:extern 是什麼?

ref. Why use #ifndef CLASS_H and #define CLASS_H in .h file but not in .cpp?

|NEWS| What is Rich Communications Services (RCS) ?

有錢的通訊服務,提升之後更能從使用者身上刮錢提高使用手機服務的品質。

主要提升三項手機的基本服務:簡訊、電話簿、通話品質。

是說這年代誰還在用手機講電話?

RCS 簡訊,可以直接傳送圖片影音,甚至是完成購物的流程,這樣難道不夠噱錢嗎?

這行為是不是讓我們很熟悉?LINE!!! 最近還開通了轉帳服務呢!

也就是說,到時候可能這些 APP 會跟 RCS 正面衝突呢?

不過,RCS 最重要還是依賴電信商 (Mobile Network Operator,MNO) 支援與否 (因為需要 IMS core system),所以這一天還有一段時間。(軟體服務這邊,Android Framework 這邊看來是提供支援了,那對於手機設備應該難度就大幅降低了)

YouTube:6 0:54 / 1:15 Android Messages: The messaging app built for Android

也許可以整合:SMS (Short Message Service,簡訊服務) 及 MMS (Multimedia Messaging Service,多媒體簡訊)?

BTW. 也就是說,現在在台灣,如果看到手機上有 RCS 可以先關掉或停用 (反正台灣用不了),以免耗電。可以自己打 keywords 問辜狗我在說什麼 XD

 

ref.

GSMA:rcs-documentation

Google’s support for RCS

新一代RCS多媒體簡訊更普及了,Google公布43家支援業者清單,只發簡訊就內嵌購物按鈕!

Wiki – RCS

Google開始部署RCS,Android傳訊服務升級至多媒體 (2016)

|NEWS| 什麼? WiFi 跟 LTE 有可能會干擾?

呃 …… 不要緊張 沒那麼容易啦!

禮拜五有 RF 同事打電話跟我們部門說要測 WiFi(我們部門在此案子沒負責 WiFi),當然要問為什麼阿!聽說是要測看看會不會干擾??!!

 

查了一下,還真的是有可能耶!
Wlan + Bluetooth Channels:2400 – 2483.5 MHz
LTE band 7:2500 to 2570 MHz (UL), 2620 to 2690 MHz (DL)

兩個靠的還蠻近的。
(我只列 FDD 的,參考資料裡面也有列出 TDD)

BTW. LTE band 13 會干擾 GNSS (Global Navigation Satellite System)

ref.

In-Device Coexistence Interference – Rohde & Schwarz

 

延伸問題:TDD v.s. FDD?

最大差異大概就是使用國家:台灣與美國都是 FDD (學把拔,不是很正常嗎?)

ref.

LTE frequency bands

Wiki – LTE-TDD

Wiki – LTE

 

延伸問題:台灣的頻段?

電信商通常會說是多少 Mhz 來表示 LTE 所支援的頻道,

但是手機商通常用 band 來表示。所以最大效益就是:

針對你的門號,去挑選手機(反過來也可以)。

同樣 700Mhz 有 Band 12/13/14/17/28,不過台灣只有亞太有 band 28 …… 以此類推

對照表可以找 Wiki 或電信商官網或是
台灣4G LTE各業者頻寬頻段與使用技術整理比較

|Design| 非同步的施工方式:等待,Callback,Polling

剛入行時,完全不懂 Polling 是什麼意思。查字典會發現解釋為:投票之類的 XDDD
不能理解阿阿阿!!!

不過後來程式看久比較懂一點點點。(系統場優點之一:拿到晶片廠的程式碼都是高手寫的 XD)

非同步的設計,要如何問到資料呢?

 

1. 等待:

就是 …… 都不做事,等在那邊直到有結果 XD

 

2. Callback:在 C/C++ 會利用 function pointer,寫成 callback function(A),以參數的方式傳入需要用到此函式(A)的函式(X)。等到函式X 執行到需要使用 A的動作時,才會啟動 A。由於在 A需要呼叫 callback 時所需要的東西是固定的(就是在設計 A 時候寫的參數),能給的東西也是固定的!

可以參考:

CallBack Function

|Code| 使用 function pointer 建立 Handler

 

3. Polling:就是一直去問,問到得到答案為止。

缺點很明顯:浪費力氣,浪費資源。
優點 …… 很好寫(?
ref.

程式設計該同步還是非同步?

|Issue| dlopen ERROR: undefined symbol

我們可以利用 dlopen 載入動態函式庫,然後使用 dlsym 取得裡面的函式來使用。

這兩個方法使用方式可以參考:dlopen&dlsym 用法

有遇到載入失敗,出現:undefined symbol

後面接著一串很像函式名稱的東西。

那時候我猜測是有兩種可能:我函式有問題 (可是 compiler 應該不會過才對),或者,

沒有正確連結?

我使用 nm 去驗證我的想法。

nm 可以列出目標的所有 symbol,看是不是那個函式有在裏面,但有問題?還是那個函式真的沒有在裡面?

在 cmd line 執行:nm -C -D bad_lib.so

就會列出全部的 symbol。其中,-D 指的是察看的對象是動態檔唷!

 

還有一個小工具:ldd 順便介紹一下。

ldd (List Dynamic Dependencies) 可以尋找所使用的函式庫!

執行:ldd (選項) (參數)

就可以列出全部被用到的函式庫啦!

 

ref.

解決 undefined symbol / reference

 

WordPress.com.

Up ↑