作者 主題: 給想從事 Embedded Linux 開發工作的新手一個方向~  (閱讀 49443 次)

0 會員 與 1 訪客 正在閱讀本文。

andrew

  • 實習板主
  • 懷疑的國中生
  • **
  • 文章數: 69
    • 檢視個人資料


首先,其實在下並不是什麼高手,進這一行的資歷比起版上的高手算是資淺很多,
本身也並非很資深的工程師。
這篇文章是給跟我一樣同為新手的人一點方向,也請熱心的大家一起來補充!

我當初也是跌跌撞撞地進入這一行~
不過我覺得自己還算幸運,好像不小心走對了方向....
版上很多人都在問,要怎樣入門? 需不需要去上課? 有沒有參考的書?

這裡我提一個比較不一樣的觀點,也許實際上很難達到.....但是先不管!
以我工作到現在的感想是,你想近這個領域的話,就去『找一份這樣的工作』
這樣最快! 也最有系統~ 比上一堆課都還有用!

---

你一定會想問? 哪有這麼容易就能找到這樣的工作?

你會發現,只要在討論區上問說『新手要怎麼入門』?
會得到一些五花八門的答案,像是『C語言必備』『組合語言要懂』『電子電路的基礎』
『複習計算機組織』『修單晶片的課程會有幫助』.....等等
不過, 等全部學完, 人都往生了....

其實這些答案都對,但是你可能不知道的是,其實不是每個工作都需要知道這件事情,
一個嵌入式產品從誕生到量產,都需要很多不同職務內容的 RD 來幫忙,
每個 RD 所需具備的知識內容一定是不一樣的。
所以就看你所在的公司,在這個產品開發的流程中,扮演什麼樣的角色!

---

就我目前所在公司(ODM廠)看到的流程來說,假如要做一個網路產品,wireless router 好了,
通常就是先決定 cpu 要用哪一家的,wireless chip 要用哪一家的,switch chip 要用哪一家的?
這些公司,就是我們口中說的 vendors(協力廠)。
決定好了之後,你用的開發環境(SDK),通常 vendors 都會提供(通常是提供 cpu 的那家公司)

我們 ODM 廠要做的事情,就是把這包 SDK 的架構弄懂,
然後把我們要加上去的 service 一一加上去,比方說一台 wireless router 上面會有什麼服務?
dhcp,NAT,routing 總要有吧? 或許還會有 vpn,ddns....等等的服務。

然後負責的工程師可能就會去網路上找 OpenSource 的 dhcpd,iptables...
然後嘗試將它修改後 porting 到 SDK 的環境上,
最後 build 出可以在 target board 上執行的 firmware。

簡單的說,整個開發工作就大致上是這樣,而且遇到比較難解的問題的時候,
vendors 廠的工程師也會來協助!

所以假如你找的公司是 ODM 廠,就是做產品的 software,做系統整合。
通常你要熟悉的就是 C 語言,還有學會在 Linux 上進行編譯的那一套流程(Makefile...等等),
其他的知識,你都可以在工作中慢慢補強~

假如你是我口中所說的那些 vendors 廠,尤其是 cpu 廠(系統晶片廠),
我個人覺得那對技術門檻的要求比較高,你可能真的要懂組合語言,懂 compiler,
懂一堆比較偏底層機制的知識,因為你可能要負責生出 SDK。

說真的,每次 chip vendors 來 support 的時候,
我都覺得他們很厲害,講的東西對我來說是另一個世界講的語言! = ="
不過利用這個 project 的機會,多跟他們打交道,自然會學到一些東西的!

---

所以你只要知道該公司扮演的角色,進入這一行的機會還是有的。
你一定想不到,我當初近這一行的時候,並不是負責很核心的開發工作,而是在負責寫 web UI。
沒錯! 就是寫網頁啦! 看起來我的工作跟 Embedded System 很不相關,
事實上我寫 HTML 的時間比寫 C 還多很多~ 而且我還寫了很久哩....
但是這個工作卻是我覺得入門最好的進入點。

很多網路設備都需要有人寫使用者介面,這也是整個嵌入式產品的一部分。
你放心,還是可以學到東西的; 你知道一支沒有 filesystem 的 wifi-phone 要怎麼弄出 web UI 嗎?
當你從 UI 上填一個值,按 OK 之後,你知道系統偷偷做了哪些事情嗎?
而且你還真得要知道這些事情才行,因為寫系統服務的人會告訴你,從 UI 上傳下去的值要檢查什麼,要注意什麼?
然後你只要花點心思去 trace 整個流程,跟寫 service 的人多聊聊,就會在工作中,漸漸地建立整個系統觀~

只要用心,多思考,總是會有很多有趣的議題的~
到現在我也幾乎不寫 UI 了,已經在做其它更有趣的事情了~

---

書的話,市面上的書也很多,很多書是那種需要搭配板子實習的,假如你沒有板子,說真的也沒什麼用!
而且我覺得我過去買的那些書,我看的時候完全都沒感覺,反而是工作一陣子之後,
在回頭去看看,才會跟現有的經驗做連結,才會有豁然開朗的感覺!

其實在下並非資訊系本科的學生,而且科系還差真遠,
所以我工作後,花了很多時間自己再進修。
關於上課,其實在下也曾去上過一些課,我對上課這件事情,是支持的,
我也覺得我當初上的那些課程給我的幫助是正向的~
但是慎選補習班是很重要的! 一定要有實習, 時數要夠~
不可能會有『快快樂樂無痛學會 Embedded Linux』這種事情~

另外,非常強烈建議你,假如你決定要去上課!
一定一定一定一定一定一定一定一定一定一定要熟悉 Linux 到一定的程度,
不是架 server 這種事情喔, 是至少了解 Linux 的指令,開機流程,和系統設計的邏輯,
因為我之前去上課的時候,總是會發現有些學員連基本的 Linux 使用都有問題,
常常老師已經在繼續講下一段了,他還很困惑於剛剛的指令在做什麼事情~
只是一股腦的想學就來上課,效果是有限的~

這點還好我當初做對了選擇,我先去上了 Linux LPI 的課,
當然不是為了要考證照啦! 只是為了要了解 Linux。

而且我忍不住要提一件事情,我還真他X的幸運!
我在台南念書時,有報名 LPI 的課,沒想到老師是 netman 大大!
後來我到新竹工作後,可以重聽一次,沒想到老師是 小州 大大,你說說我是不是很幸運!

我始終都記得 netman 大大在第一堂上課時所提的金字塔學習觀念~
我一直都非常感謝兩位老師幫我紮下的基礎,他們教會我的是一個學習 Linux 的方法!
這對我後續的學習新東西時,有很大的幫助!

所以一定得把基礎打好,Linux 就像積木一樣,你手中握的積木越多,學習的彈性會越大。
你手中握的都是別人用積木組好的套件時,你會在學習上有一種很虛的不安全感!

---

以上, 只是個人淺見, 也請各位有經驗的大大多多分享與指導囉, 感謝!

順便提一下,之前我翻到一本書,我其實還沒時間去看它,
但是我覺得寫的不錯:『Linux系統架構與目錄之解析。 作者:邱世華 』
它講了很多我覺得不錯的系統觀念,可以參考看看囉~

在此祝各位工作愉快!


find /my_brain type sleepy -exec rm -rf {} \;

ploakimo

  • 可愛的小學生
  • *
  • 文章數: 16
    • 檢視個人資料
不錯的建議方向!

小弟是屬於MIS的職位(LAMP=Linux+Apache+Mysql+PHP)~但開發公司的Web UI (ERP系統+管理系統....等等)居多,也是今年剛踏入Embedded Linux 的新手,剛上完課(108小時)不久,說真的我聽懂上課內容只有30% 剩下的完全聽不懂,我並非抱住上完課就一定要學會,我個人想法是先有個基礎概念跟學習方向,不要讓自己盲目的無頭緒的亂看書籍,畢竟Embedded Linux 很廣, 千萬別把捕習班當成上完課就一定會的想法,補習班真的只是讓自己有好的學習方向+基礎概念 ,剩下的還是要靠自己去深入研究, 實習版是一定要的,

現階段小弟在學習將各種 open source 軟體 porting 到ARM平台上RUN (因為Porting 算是Embedded Liunx最簡單的入門)~持續學習努力中~剛踏入新手們~我們一起加油吧!

未來期盼自己能撰寫DEVICE DRIVER(這真的不好懂~有難度!)

kgwkevin

  • 可愛的小學生
  • *
  • 文章數: 4
    • 檢視個人資料
不知道能不能在這邊問一件事呢?

小弟是比較喜歡有一個實際的東西學習,

所以是否買一個練習版來搭配學習比較好呢?

可以請教一下買哪種的版子比較好呢?

看網路上似手大多都是 ARM 的資料,

請問跟 vortex86DX 這種比較是否有人能夠解說給小弟何種比較合適呢?

thx

  • 鑽研的研究生
  • *****
  • 文章數: 510
    • 檢視個人資料
    • http://www.osslab.com.tw
vortex86DX 是x86 系..目前多用於工控 效能.......
還有另外一顆類似的Soc 叫RDC
http://www.rdc.com.tw/en/news_more.php?Id=13
 
基本上x86 東西是這樣.拿台大台PC開發環境都是一模 一樣的!
頂多是驅動上問題

如果走x86 路線 因為現成軟體多, sources code 也多. 學習方面建議

1.挑定要做啥應用軟體
Firewall, UTM ,IP PBX, 套裝server ,media player,工控等

2.x86 比較大的重點在於 Storage 怎樣處理
量產USB 工具,CF DOM , 要有啥保護或防寫機制等..

請參考
http://wiki.osslab.org.tw/%E5%AF%A6%E9%A9%97%E5%B0%88%E6%A1%88/OSSBox2

anderson1127

  • 訪客
其實,我也是建議先從x86 base Linux 開始瞭解起會好很多,好處是

1. PC硬體零組件取得容易(除非真的要開發ARM driver or porting AP 再考慮買特定的實驗板)
2. 可以藉此瞭解Linux開機流程(想做embedded system必定要瞭解)
3. 練習rebuild kernel for hardware
4. 可以執行emulation
5. DRAM空間大很多,可以免除很多不方便
6. 新手可以練習從HD移轉system到另一個HD/Flash Disk ,然後測試移轉過去的系統開機

如果新手可以將上面這幾個項目玩得很熟,那要跨到ARM series的hardware相信也是很容易的!!

目前我就是在做PC for networking , 最主要的還是將系統放在RAM disk
Flash disk 只是拿來暫存initrd file而已...

andrew

  • 實習板主
  • 懷疑的國中生
  • **
  • 文章數: 69
    • 檢視個人資料
其實,我也是建議先從x86 base Linux 開始瞭解起會好很多,好處是

1. PC硬體零組件取得容易(除非真的要開發ARM driver or porting AP 再考慮買特定的實驗板)
2. 可以藉此瞭解Linux開機流程(想做embedded system必定要瞭解)
3. 練習rebuild kernel for hardware
4. 可以執行emulation
5. DRAM空間大很多,可以免除很多不方便
6. 新手可以練習從HD移轉system到另一個HD/Flash Disk ,然後測試移轉過去的系統開機


非常贊同! 我覺得新手可以做看看這種練習~
用 VMWare 或是 VirtualBox 之類的環境也可以練習歐~

1. 自己在 Linux 建立一個資料夾, ex: rootfs

2. 在 rootfs 資料夾下建立 Linux 開機所需的基本 root filesystem
    (可參閱 Linux From Scratch: LFS 文件)

3. 編譯 linux kernel, 拿掉不需要的東西, 精簡化

4. 利用各種能將 rootfs 封裝成 image 的 tools 進行封裝, ex: genromfs
     (http://freshmeat.net/projects/genromfs/)

5. 修改 grub 的選單

6. 開機測試!

----

Tip: 假如你不想處理 busybox 的話,

有個我以前用過的驗證方式, 因為 Linux kernel 開機時,
會去執行 /bin/init (事實上他有很多選擇啦, 不詳述...)

所以你只要用 C 寫一個無窮迴圈
ex: 每隔 3 sec 一直印 "Hello Linux ~ I'm NOT init"
然後編譯成執行檔之後, 故意把他取名叫做 init, 然後放在 rootfs/bin 下面.

開機之後, 假如你成功  mounted rootfs, 就會執行你的 init (當然是假的 init 辣)
就會一直印

"Hello Linux ~ I'm NOT init"
"Hello Linux ~ I'm NOT init"
"Hello Linux ~ I'm NOT init"
"Hello Linux ~ I'm NOT init"

試試看^^ 很好玩喔~






« 上次編輯: 2009-10-23 16:28 由 andrew »
find /my_brain type sleepy -exec rm -rf {} \;

spocklee

  • 可愛的小學生
  • *
  • 文章數: 11
    • 檢視個人資料
可以考慮一下beagleboard:

http://beagleboard.org/

畢竟ARM在embedded世界裡佔有率遠比x86高,與其學了x86再學ARM還不如一開始就去學ARM好了...假如怕花錢可以考慮QEMU