Introduction to Embedded Systems
這份筆記主要是參考 交大開放式課程: 嵌入式系統設計概論與實作 的為主,大部份的內容都是錄影內容的筆記,範圍是 第一週 、第二週 的內容。然後加入一些我個人的筆記、複習一些知識、還有一些新的想法。
摘要
- 計算機結構摘要
- 簡介嵌入式系統 (What, Why, How)
- 嵌入式硬體開發
- 嵌入式軟體開發
- 一些好玩的應用
1. 計算機結構摘要
嵌入式系統是電腦系統的應用概念,所以結構和一般電腦是類似的,所以先復習基本電腦的架構。現代電腦的結構差不多都會有以下這些東西:
- CPU: x86, ARM, MIPS, SPARC, PowerPC
- Cache: L1, L2, L3
- Memory
- Storage: HD, ROM, EEPROM, Flash
- I/O, BUS: PCI, PCIe, AGP, ISA, SATA, eSATA, USB
1-1. CPU 設計模式
- CISC 複雜指令集
- 一開始 CPU 架構,不斷的加指令,但常用的只有 20%
- 好處是工程師下簡單的指令,CPU 執行複雜的事情,減少設計師的時間。
- CISC CPU: Intel x86, Motorola 68000, PDP-11, System/360
- RISC (Reduced Instruction Set Computing, 精簡指令集)
- 優點:指令長度固定、電晶體數量少,易於提升運作時脈、耗電量較低
- 缺點:複雜指令需要由許多的小指令去完成,程式變得比較大。
延伸閱讀:
- 完全看懂 ARM 處理器:RISC 與 CISC 是什麼?歷史、架構一次看透
- IBM System/360 就是專案管理聖經 人月神話 的案例分析
1-2. 快取 Cache
- 指存取速度比一般隨機存取記憶體(RAM)快的一種RAM。
- L1, L2, L3
- 貴
1-3. 記憶單元 (Memory)
唯讀記憶體: ROM
- ROM (Read-Only Memory): 唯讀記憶體。ROM被儲存在一個非揮發性晶片上,也就是說,即使在關機之後記憶的內容仍可以被保存,所以這種記憶體多用來儲存特定功能的程式或系統程式。
- PROM (Programmable ROM): 可程式唯讀記憶體。其內部有行列式的鎔絲,可依使用者(廠商)的需要,利用電流將其燒斷,以寫入所需的資料及程式,鎔絲一經燒斷便無法再恢復,亦即資料無法再更改。
- EPROM (Erasable Programmable Read Only Memory): 可抹除, 可編程唯讀記憶體。可利用高電壓將資料編程寫入,但抹除時需將線路曝光於紫外線下一段時間,資料始可被清空,再供重複使用。
- OTPROM (One Time Programmable Read Only Memory): 一次編程唯讀記憶體。內部所用的晶片與寫入原理同EPROM,但是為了節省成本,封裝上不設置透明窗,因此編程寫入之後就不能再抹除改寫。
- EEPROM (Electrically Erasable Programmable Read Only Memory): 電子抹除式可複寫唯讀記憶體。運作原理類似 EPROM,但是抹除的方式是使用高電場來完成,因此不需要透明窗。
- Flash memory: 每一個記憶胞都具有一個「控制閘」與「浮動閘」,利用高電場改變浮動閘的臨限電壓即可進行編程動作。快閃記憶體主要分為NAND型與NOR型。
以上資料主要來自:唯讀記憶體
隨機存取記憶體: RAM
RAM: Random Access Memory
- 速度很快,通常作為作業系統或其他正在執行中的程式的臨時資料儲存媒介。
- 隨機存取
- 揮發性
- 對靜電敏感
- 價格不斷下降
2. 簡介嵌入式系統
2-1. 啥是嵌入式系統?
- 有硬體、有軟體,軟硬體會有做高度的整合
- 在特定的環境和特定的情境、特定目的使用
- 系統最佳化
- 系統具備一定可靠度
2-2. 哪裡有嵌入式系統?
- 家庭
- 冷氣, 電風扇, 冰箱, 電話
- 手機, 平板
- 相機:光學和感應技術
- 鍵盤, 滑鼠
- 床頭音響, MP3 player
- 電視, 遙控器, LCD
- Gamer: XBox, PS2, PS3, PS4
- 辦公室
- Projector, Printer, Fax
- Hub, Switch, Router, App, NAS
- IPCam
- 戶外大型
- 紅綠燈
- 捷運買票機, iBon
- 捷運刷卡機
- LED 廣告看板
- 捷運: 文湖線 - False alarm
- 高鐵
- 電梯
- 工廠自動化
- 汽車導航、汽車控制電腦、安全系統、公車定位
- 醫療系統
- 醫院, 郵局排隊
- 武器系統: 風力, 溫度, 座標, 高度, 重量, 雷達, 速度, 燃料 - Robust 控制
- 氣象監測站,監測儀
- 衛星/航太
- CPS: 模擬環境, ex 模擬土星, 木星
- 核能發電廠
2-3. 為啥需要嵌入式系統?
嵌入式系統主要的需要源自於應用場景的考量。
真實的世界裏,實際的應用不同於個人電腦,像是工業電腦需要高可靠度,有些要耐震,有些則要具備 DSP 運算能力等。
- 適當的、切中要點的設計 (Design in requirement)
- 可靠性 (Reliablity)
- 強韌性 (Robust)
- 即時性 (Realtime)
- 安全性 (Security)
- Cost
- 手機 IC: 成本 2USD
- NB: 7000 NTD
- 洗衣機: 不會放 Intel core-i7
Over design or under design 是 embedded design 的原則,也是其難度。設計時,就有很清楚的目的以及用途、應用。不會有額外的用塗,通常不會讓使用者來 program (早期)。
嵌入式系統單一個原件設計要小而美,且可以透過參數調教行為。很多小而美的原件放在一起聯動,構成功能強大的系統。就像是 unix 裡面工具的設計精神一樣。
2-4. 如何開發嵌入式系統?
嵌入式系統開發包含硬體開發、軟體開發。硬體開發有系統晶片、CPU 設計、開發板設計等;軟體開發則分成系統程式和應用程式兩種,系統程式一般就是韌體 (Firmware),包含 Bootloader 以及作業系統、開發工具 Toolchain。
用來設計 CPU 的開發工具: FPGA (Field Programmable Gate Array, 現場可編輯邏輯閘陣列)
硬體描述語言:Verilog
成熟的 開發時間 分配:
- 40% design
- 20% coding
- 40% testing
- 測試方法, tracking bug 機制
- 元件測試, 整合測試, 壓力測試
- 成熟的公司: bug 收斂的速度
- 解問題: 在精準, 不在快
- 國外: test engineer 比 design engineer 還貴. tester > RD (55% > 45%)
開發週期
- Requirement
- Design / Implement
- 設計和需求很容易一直循環
- Test: EVT/DVT/PVT
- 測試環境的建置是很大的挑戰
- 測試永遠不嫌多
延伸閱讀:軟體開發流程
3. 嵌入式系統硬體開發
主要介紹硬體設計的商業分工模式,如下:
- 晶片設計生產
- IC 設計
- 晶片生產 / 代工
- 封裝 / 測試廠
- 開發版,工具提供
- 系統整合廠 (SI)
3-1. 晶片設計 (IC Design House, Fabless)
- 設計 SoC (System on Chip): CPU + RAM + 其他雜七雜八
- 設計特定功能晶片: CPU, Bluetooth, DSP, 2D/3D Graphic, Video Encode/Decode, Network.
- 是無廠半導體公司 (Fabless IC 設計公司), 也就是 IC 負責設計, 銷售, 將生產測試外包其他公司.
- 販售 Licensing 智慧財產權 (智財權, Intellectual Property, IP) 給其他 IC Design House
- 也會買其他公司的 IP
- Tapeout : IC 設計公司將電路交給生產公司生產,這動作叫做 Tapeout。早期電路圖 layout 是存在磁帶 ,所以現在沿用這個名稱,即使現在都電子化了。
這跟編曲完工後要 過帶,英文是 Tracking,意思是雷同的,年代差不多,都是用帶子 Tape,所以當時中文翻譯成過帶。
一些有名的 IC 設計公司:
- ARM: 英國公司, 擅長設計 RISC CPU
- Apple: 這不用介紹了 … A7, A8
- MediaTek 聯發科
- Realtek
- HiMAX
- Richtek
- More see: 台灣十大IC設計公司
3-2. 晶圓代工
- 生產 IC 晶圓為主業
- 八寸晶圓一片價值 20~30 萬 TWD
- 從沙子到處理器的全程
著名的晶圓代工廠:
Source: https://zh.wikipedia.org/zh-tw/%E6%99%B6%E5%9C%93%E4%BB%A3%E5%B7%A5
3-3. 封裝測試廠
- 切割晶圓
- 封裝成 IC
- 拉線
- 測試驗證
南部某家污染河川的無良封裝廠就不說了。
3-4. 系統整合廠 (System Integration)
- 面對的客戶是品牌公司 (Branding Company)
- 品牌公司不見得會懂 IC 設計
- 品牌公司負責定義產品、定義功能、提出需求
- 系統整合廠找晶片設計廠
- 獲利模式
- 成熟的品牌公司, 像是 Apple
- IC 設計公司也獲利的很多, 像是台積電
- 系統廠獲利相對有限, 大多都是靠量來支撐, 像鴻海.
4. 嵌入式系統軟體開發
嵌入是軟體分成兩大類:
- 系統程式:Bootloader, OS, libraries, toolchain, 跟硬體有關的
- 應用程式:iOS app, Android app, web console / admin
系統軟體程式開發
會開發嵌入式軟體的人:
- 開發嵌入式軟體的第一個就是 IC 設計公司。
- OEM/ODM 廠,拿 public 的重新包裝,或者拿 SoC 的來包裝
- 只有 CPU/SoC 是不夠的,還要有 系統開發版、系統工具程式 (Toolchain)、基本的應用程式 等
程式語言也是: Compiler, Language, Libraries, Document, Framework 缺一不可
開發環境
開發環境如下:
目標版/評估版 (Target Platform) <-—ICE/JTAG –> 主機 (Host)
Source: http://ocw.nctu.edu.tw/course/di992/003.pdf, Page 10
- ICE, in-circuit emulator: 在現模擬器
- JTAG, Joint Test Action Group: 聯合測試工作群組。1990 年 JTAG 正式由 IEEE 的 1149.1-1990 號文件標準化,在 1994 年,加入了補充文件對邊界掃描描述語言(BSDL)進行了說明。從那時開始,這個標準被全球的電子企業廣泛採用。邊界掃描幾乎成為了 JTAG 的同義詞。
目標版通常運算能力不多,記憶體不多,target 沒有軟體,所以需要用 host 開發軟體。問題來了:
- 如何在 host 產生可以在 target 可以執行的程式?
- 如何把程式放到 target board?
- 如果程式在 target 有問題,要怎麼讓使用者知道?
接下來針對這三個問題做整理。
1. Cross Compiler
Q1: 在 Linux compile 的 Hello World 可不可以放到 M$ Windows 執行?反之呢?
Q2: 如何在 host 產生可以在 target 可以執行的程式?
通常 target 不會和 host 有一樣的 CPU,所以 host 的 hello world 無法在 target 是無法跑的
, 因為你不能用到 target 上可能沒有的資源,像是 printf().
需要先複習基本的 C 編譯流程:
- preprocess -> compile -> assemble -> link (連結其他 libraries) -> 執行擋
- preprocess 處理 macro
- compiler 處理
*.c
, 產生.as
(assemble), ex:gcc -S hello.c -o hello.asm
- assembler 處理
*.as
, 產生.o
or.obj
- linker 將 obj files 串起來, 產生可執行的檔案
在 Linux 底下產生組合語言,以 hello.c
為例:
1 |
|
一般的編譯:gcc hello.c
這個編譯出來的執行擋只能在 host 機器跑,而無法放到 target 跑,所以要在 target 上跑的程式需要用 cross compiler 編譯才可以:
- Host compiler: 吃
.c
,.h
但是吐出 host 的 instruction set, ex x86 - cross compiler: 吃
.c
,.h
但是吐出 target 版的 instruction set, ex ARM - cross libraries / assembler 同上
這些 cross compiler / libraries / assembler / linker 統稱 toolchain.
那請問 toolchain 是怎麼來的? (下載來的,老闆給的,撿到的 XD)
- cross compiler 本身還是一個 x86 的執行擋, 他產生 ARM 的執行擋
- cross libraries 呢?大多拿到的也是 build 好的
.o
- 那如果是拿到 cross compile 地 source code 呢?
- 這時候就要 build cross compile。
- 就是拿 host compile 去 build “cross compile source”,產生出 x86 cross compiler,
- 然後再拿 cross compiler 去編譯 target libraries source 產生出 target board 的
.o
問題與思考
- 如果沒有 host 上沒有 compiler, 但是只有 ccompiler source code? 那怎麼辦? (雞生蛋蛋生雞的問題)
- 為什麼在 XCode 編譯出來的 ipa 無法裝在 XCode 上的模擬器跑?
- 同上提,那 android 的 apk 呢?
- VM 概念為啥會流行,包含 JVM, LLVM, CLR (.NET)
2. 如何把程式放在 Target Board?
用 Bootloader 程式來說明。
一般電腦是這樣的關聯:CPU –開–> bootloader —開—> embedded OS —> application
CPU 需要知道去哪一個位址執行 bootloader,bootloader 需要知道去硬碟哪一個 sector 開始作業系統。所以已 Bootloader 為例,意思就是說 CPU 知道 (或者說 CPU 設計者指定) 到哪一個位址執行 bootloader,所以用 cross compiler 編譯好的 bootloader 要放在這個指定的位址:
- 燒 到 Chip -> 讓程式留在 target board -> 要放在關電不會不見的 EEPROM
- 需要一個足夠的空間,用來擺放程式
- CPU 怎麼知道要去哪裡 (就是位址) 拿指令跟 CPU 的設計者有關,例如 0x5566
- CPU 第一個指令會去抓一個開機時有資料的地方 —> 就是 boot loader
嵌入式系統不見得都是 bootloader, 也有可能是 OS, OS 是放在硬碟.
OS 是被 Bootloader 叫起來的。
- IBM PC 架構: Windows 擺的位置是固定的, 所以很容易自己寫 OS
- 但是嵌入式系統,bootloader 位址不見得是公開,所有的 CPU 定址也不見得一樣。
- bootloader / embedded OS / application 都要擺在 EEPROM/ROM/Flash Memory
- 燒得位址:bootloader 問 CPU, OS 問 bootloader
- 除了直接燒晶片,另外就是透過外面的介面燒,不用拔 IC,
- 另一種是燒在硬碟,然後裝到 target board
- 放在網路: NFS / TFTP
現代嵌入式開發版
- Raspberry Pi (完整的小電腦)
- Arduino
- PieceDuino
- Microduino
- Lego EV3
結論
創新是什麼?以前我的答案在這裡,現在我有新的想法: 新的科技/方法 + 舊的學問 = 創新
參考資料
- 嵌入式系統設計概論與實作 - 交大開放課程
- 計算機架構 - 交大開放課程
- 計算機組織 - 交大開放課程
- 完全看懂 ARM 處理器:RISC 與 CISC 是什麼?歷史、架構一次看透
- 從沙子變成晶片 處理器製作全程揭秘
- FPGA 基本概念
- Verilog
- 新產品開發的三個驗證階段(EVT/DVT/PVT)