發表文章

目前顯示的是 2月, 2024的文章

文章總列表

天璣9000通訊規格詳解

圖片
緣起 身為電信從業人員,搞清楚天璣9000 通訊規格 極速7Gbps的邏輯,還有通訊規格用途,還是頗重要的 計算機 打開 NR速率計算機 ,照下圖點,順便科普每個選項,可以算出2.33Gbps 現代通訊系統有多種參數,可以偏好正確率或是速度。MCS表格(Modulation and Coding Scheme)紀錄這些選擇,一般MCSx數字越大,代表越偏好速度。在實驗室先用最好解的MCS0測試連線;東西都調好了,再上MCS27拼速度 MCS表格具體選以下參數,他們的細節可以在"通訊原理"書籍找到 錯誤更正碼,投資多少資源做錯誤更正,越多速率越慢 多天線,拿來拼信號強度,或是拼傳輸速度 調變規格,單位時間256QAM傳8bits,64QAM傳6bits 速度拉到最高,表格選38.214-Table 5.1.3.1-2,調整MCS27上256QAM 選頻寬,5G有FR1(0-6G)和FR2(28G-71G)。FR2頻譜標金只有FR1的百分之一,商業價值差距應該很明顯 5G FR1頻寬一條最大100M,計算最高傳輸速率選100M如下圖 高速5G網路(100M頻寬)只有TDD,改成全部下行讓速度滿血 最後算出100M頻寬是2337Mbps=2.337Gbps 所以天璣9000能跑3CC-300M,極限速度是2337Mbps*3 ~= 7011Mbps ~= 7Gbps 實際的體驗 規格標上去,代表晶片規格有做上去;實際使用情境讓電信從業人員翻譯一下 TDD網路一般80%給下行,20%上行,速度打8折:5.6Gbps 運營商頻寬100M就很多了,再降三分之一:1.86Gbps 離基地台遠一點信號爛,速度只剩六分之一,所以是320Mbps ~ 1860Mbps 我小時候撥接上網速度只有33.6Kbps,5G傳輸速率簡直是天文數字! 具體的用途 根據中華電信導入 5G 2CA + 4G 4CA 新聞稿,中華電信可以用N1頻段(FDD, 2100M,  20M )是4G-LTE頻段改(refarm)成NR,以及競標買的N78頻段(TDD, 3500M, 90M )組網。用在高階手機晶片,同時連上N1/N78總計110M頻寬,同時用低頻拼覆蓋率和高頻拼速度 插入中華SIM卡後,用2CC連線能力還剩下1CC;支援雙卡手機,用剩餘的連線能力待機收另一張卡。有些商務人士

嵌入式工程師瑞士刀 (3) 編譯器命令簡明解析,前處理器,定義,include搜尋路徑

圖片
緣起 我們團隊比Aerith妹妹還正的 Tifa姊姊 ,有一次用編譯器指令,幫忙處理compile guard重名的問題!這篇總結一般查問題,需要和編譯打交道的命令 The problem     #ifndef __SOME_HEADER_H__ // 這東西,跨檔案同名,會產生悲劇     #define __SOME_HEADER_H__     ...     #endif 先找出建構指令 建構專案的指令稿會印出編譯指令,可以複製貼上到終端機單獨編譯某個檔案。清理build error一輪10秒。如果改壞這個功能,會有人氣噗噗。編譯命令看起來像這樣     gcc -c hello.c -o hello.o -c代表編譯,-o代表輸出檔案名稱,把hello.c編譯成hello.o。後者是object file,已經變成一堆指令了。一堆object透過連結器(linker)會變成執行檔,以後有空再寫 如果基礎設施不能產生編譯指令,也不能複製貼上執行,請拯救萬民於水火之中吧... 前處理器,C preprocessor 更細緻拆解編譯步驟:把-c改-E,挖掉-o讓輸出導向到檔案,觀察前處理器輸出     gcc -E hello.c >  hello_pre.c     gcc -c  hello_pre.c  -o hello.o 下圖 b.c 紅框,因為沒有定義FUNC2,後續沒輸出。 Tifa姊姊 當時在header file塞奇怪的字串觀察前處理器輸出,很快就定位問題了。如果團隊用前處理器做些框架,前處理器輸出絕對是開發的好麻吉 從命令列塞定義(#define) 透過命令列塞定義#define很方便,下圖 -DFUNC2 等效 #define FUNC2,於是func2()跑出來了 這招用來管理"外界需求"很有效,切換平台,開關功能,選擇外部元件,都很適合 Switch platform -DPLATFORM1 -DPLATFORM2 Switch feature -DSOME_FEATURE_ENABLE Switch component -DEXT_COMPONENT1 -DEXT_COMPONENT2 Inclusion Search Path 另外軟體編譯時,可以用-I指定外部函式庫放哪裡,下圖多塞了-I/home當作

嵌入式工程師瑞士刀 (2) C語言函數,為什麼0代表成功,非0代表失敗

圖片
緣起 我們Team長得比下圖 Aerith妹妹 還正的女生問,為什麼C函數回傳值是0代表成功?他覺得回傳1(True)比較符合直覺。所以我決定寫下這篇文章,好好解釋理由傳教用 UNIX命令EXIT Code,以及用途 下圖執行ls用echo $?觀察EXIT code。慣例是:正確執行回傳0;否則回傳非0 ls的手冊 也有數值說明 具體EXIT code只是main function回傳值,修改 Hello World 做實驗,沒什麼神秘 按照此慣例,MAKEFILE執行完指令檢查EXIT code,非0會停下。所以MAKEFILE成功跑完代表大家都回傳0沒遇到錯誤,簡單易懂 回到學妹的問題,為什麼C函數用0代表成功 最嚴謹的寫法,每個函數都要定義自己的enum標示成功失敗,長得像下面這樣 enum {     SUCCESS = x     FAIL1 = y     FAIL2 = z } 每個函數的回傳值都要定義對應的enum {},這樣軟體寫起來顯然有點長 假如只有成功或失敗,大家也接受UNIX慣例,這樣能寫得很精簡 return 0; // SUCCESS return -1; // FAIL 一般CPU做完運算更新狀態暫存器,內部zero flag代表結果是否為0,所以判斷0是免費的,效能也好。在眾多數值裡也有獨一無二的意義:正確只有一種,但是錯誤卻可能有N種。所以UNIX慣例用0作為成功,也不是隨便亂選 在組合語言的層級,判斷0與非零會差一道指令,起碼這麼多年,我是這麼認為 // 0 as SUCCESS, 2 instructions needed bl some_function cmp r0 beq  some_label // branch if r0 == 0 // 1 as SUCCESS, 3 instructions needed bl some_function ldi r1, #1 sub r0, r0, r1 // r0 = r0 - r1, extra instruction beq some_label // branch if r0 == 0 下圖在樹莓派做實驗,比對#1,或是#0,指令數一樣多。原因是 ARM的cmp指令 能把常數編碼進去,不需要多一道指令。現代CPU一般都有這種指令,所以差距不明顯。假如不考慮指令集特異功