嵌入式系統有很多種:
- embedded linux
- 使用 rtos, 例如: freertos/vxworks
- bare metal 程式
- 手機
- 其他:
每種都有自己需要修練的功課, 但大概都脫離不了 c 語言, 除了 bare metal 都需要一些 os 相關知識, 也不是 bare metal 不需要 os 相關知識, 而是在 bare metal 要打造 os 機制蠻難的, 例如需要一個 mutex, 可能就難倒很多人, 這和 cpu 相關, 需要使用 cpu 的指令來實作。選一個 os 來用會比較容易。雖然 OS 觀念大同小異, 但大同之中的小異就足夠讓人傷透腦筋。
細節很多, 提一些大方向。自己對於 embedded linux 比較熟悉, 其他只能有「略懂」等級的介紹。
embedded linux:
- porting 到新 chip
- device driver
- user mode 應用程式
device driver 由於和硬體有關, 會和硬體打交道, 需要使用一些硬體相關工具, 示波器之類的。也要熟悉 linux device driver 架構。這個要練習比較麻煩, 書籍大概都過時, 需要自己看第0手資料, 也就是自己要看 device driver souce code, 然後想辦法把自己要 porting 的硬體 driver 寫出來。
user mode 應用程式有很多書籍可以學習, 要看懂他們並不容易, 需要花費不少時間。其是 signal/fork/thread 議題都很難搞懂, 但這只是其中一部分而已。 linux/unix signal 議題可以看看這篇, 知道 signal 有哪些複雜的議題。
推薦書籍:
- tlpi (The Linux Programming Interface)
- 經典的 apue (Advanced Programming in the UNIX Environment)
socket 可能也要略懂, 真的需要時再去學習應該也還可以。
embedded linux 有很大機會碰到的 gui 是 qt 或是直接使用 freamebuffer, 有機會也可以接觸一下, 我也是從 qt 開始接觸 embedded linux。
再來對 linux 基本操作有些熟悉會比較好, 因為大部分都是需要打指令, 用不習慣的人應該會覺得很痛苦, 至少找一本 linux 基本書籍來學習, 一些常用指令要知道。另外能把 vi 學起來會比較好, 真學不來也沒關係, 無需強求。bash script 多少也會有需要, 至少要略懂。
ssh, telent, sftp, minicom 這些東西也需要知道怎麼使用。
GNU toolchain 的使用: gnu toolchain 很原始, 如果你習慣 IDE/RAD 環境, 大概會有點難接受, 可以參考: 用輕鬆的方式來學習編譯程式指令 (gcc/g++), 不一定要靠 IDE 來編譯程式, 體驗一下。gdb 很難用, 但建議還是硬著頭皮學一下會比較好, remote gdb 用法也要知道。
另外 embedded linux 通常用的會是 cross compiler, 也就是在 x86 執行 gcc, 編譯出來的程式碼跑在 arm cpu 上, 沒接觸過應該會不習慣, 大部分人應該是在 x86 編譯, 編譯出來的程式也是跑在 x86 上。和 native compiler 比較起來, 也會有點難度。
如何建立一個 root file system 也很重要, 從 linux kernel 到 root file system mount 起來, 出現 shell 提示符號, 這個過程最好要搞懂, 這些都是基本內容。可以參考: 製作 raspberry pi 2 linux 的檔案系統
rtos 則是看使用那一套, 就需要去學習其中的用法, 使用起來應該會和 linux 有點差異。有 ice 會比較容易 debug, 一般大概也會需要用 ice。
bare metal 程式也是很難, 需要從開機程式開始撰寫, bare metal 就是不在 os 環境下的程式, 也就是說, 連 printf 之類的 ouput function 都要自己打造, 沒體驗過應該會覺得超難。bare-metal for stm32f4 discovery board content 這系列就是在介紹 stm32f4 的 bare metal 程式, 有興趣可以看一下這個難度。
linker script 會是這種程式的重點, 雖然不是程式, 但它會影響程式編譯出來的樣子, 把哪些 section 分配到那些記憶體範圍上。這個有點難哦, 撐過去就好了, rtos 有時候也可能需要改動 linker script。
如果 chip 廠商有給範例或是相關函式庫, 也許會簡單一些。但如果 c 基礎不夠, 可能有 bug 時, 不太容易找到問題。會需要使用 ice 的經驗, 沒 ice 要 debug 猶如登天。
至於課本的演算法, 資料結構, 不能說不重要, 但可以從基本先熟悉, 不用著急學比較難的, 例如 queue, linked list, 基本 tree, avl tree, rbtree 這種超難的可以先緩點。
另外大概都會需要一些反組譯的能力, 所以還需要略懂該 cpu 的組合語言, gnu toolchain 的 objdump, readelf 是你的好朋友, 學會使用他們也很重要, 這些是 binutils 的部份工具, binutils 另外還有很多工具大概也都會用到, 我是在寫 os kernel 時, 才比較頻繁的使用到這些工具。
在沒有 ice 下或是沒有開發版, 可以使用 qemu 來練習開發, 例如可以使用 qemu 模擬 raspberry pi 2/3, 因為通常沒有 ice 來連接 raspberry pi 2/3, 使用 qemn 就可以得到 ice 等級的 debugger, qemu + gdb 來除錯, 一開始應該會覺得很痛苦, 但取得這個能力是很重要的。
我甚至可以用 qemu + gdb 來 debug uefi 程式, 因為都是使用 gdb, 所以只要痛苦過一次, 很多平台都可以用。
toolchain 的選擇, 一般我都使用 gnu toolchain, 這邊介紹的環境我都是用 gnu toolchain, 所以雖然不好學, 但投資性很好, 至於在 mac, windows, 我也都是用 gnu toolchain, mac 現在可能換為 clang, 但還好它的用法和 gcc 一樣。
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。