Introduction to Embedded Systems


這份筆記主要是參考 交大開放式課程: 嵌入式系統設計概論與實作 的為主,大部份的內容都是錄影內容的筆記,範圍是 第一週第二週 的內容。然後加入一些我個人的筆記、複習一些知識、還有一些新的想法。

摘要

  1. 計算機結構摘要
  2. 簡介嵌入式系統 (What, Why, How)
  3. 嵌入式硬體開發
  4. 嵌入式軟體開發
  5. 一些好玩的應用

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 設計模式

延伸閱讀:

  1. 完全看懂 ARM 處理器:RISC 與 CISC 是什麼?歷史、架構一次看透
  2. 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 運算能力等。

  1. 適當的、切中要點的設計 (Design in requirement)
  2. 可靠性 (Reliablity)
  3. 強韌性 (Robust)
  4. 即時性 (Realtime)
  5. 安全性 (Security)
  6. 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

成熟的 開發時間 分配:

  1. 40% design
  2. 20% coding
  3. 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. 晶圓代工

著名的晶圓代工廠:

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 設計
    • 品牌公司負責定義產品、定義功能、提出需求
  • 系統整合廠找晶片設計廠
  • 獲利模式
    1. 成熟的品牌公司, 像是 Apple
    2. IC 設計公司也獲利的很多, 像是台積電
    3. 系統廠獲利相對有限, 大多都是靠量來支撐, 像鴻海.

4. 嵌入式系統軟體開發

嵌入是軟體分成兩大類:

  1. 系統程式:Bootloader, OS, libraries, toolchain, 跟硬體有關的
  2. 應用程式: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 開發軟體。問題來了:

  1. 如何在 host 產生可以在 target 可以執行的程式?
  2. 如何把程式放到 target board?
  3. 如果程式在 target 有問題,要怎麼讓使用者知道?

接下來針對這三個問題做整理。

1. Cross Compiler

Q1: 在 Linux compile 的 Hello World 可不可以放到 M$ Windows 執行?反之呢?
Q2: 如何在 host 產生可以在 target 可以執行的程式?

通常 target 不會和 host 有一樣的 CPU,所以 host 的 hello world 無法在 target 是無法跑的
, 因為你不能用到 target 上可能沒有的資源,像是 printf().

需要先複習基本的 C 編譯流程:

  1. preprocess -> compile -> assemble -> link (連結其他 libraries) -> 執行擋
  2. preprocess 處理 macro
  3. compiler 處理 *.c, 產生 .as (assemble), ex: gcc -S hello.c -o hello.asm
  4. assembler 處理 *.as, 產生 .o or .obj
  5. linker 將 obj files 串起來, 產生可執行的檔案

在 Linux 底下產生組合語言,以 hello.c 為例:

hello.c
1
2
3
4
#include <stdio.h>
int main() {
printf("Hello!\n");
}

一般的編譯:gcc hello.c

這個編譯出來的執行擋只能在 host 機器跑,而無法放到 target 跑,所以要在 target 上跑的程式需要用 cross compiler 編譯才可以:

  1. Host compiler: 吃 .c, .h 但是吐出 host 的 instruction set, ex x86
  2. cross compiler: 吃 .c, .h 但是吐出 target 版的 instruction set, ex ARM
  3. 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

Cross Compiler

問題與思考

  • 如果沒有 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 要放在這個指定的位址:

  1. 到 Chip -> 讓程式留在 target board -> 要放在關電不會不見的 EEPROM
  2. 需要一個足夠的空間,用來擺放程式
  3. CPU 怎麼知道要去哪裡 (就是位址) 拿指令跟 CPU 的設計者有關,例如 0x5566
  4. 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

現代嵌入式開發版


結論

創新是什麼?以前我的答案在這裡,現在我有新的想法: 新的科技/方法 + 舊的學問 = 創新


參考資料


Comments