jserv: hack myself

我和台中的緣份

| Comments

六月份受邀到台中大里高中 (現為中興大學附屬高級中學) 對全校師生發表演說,想到台下很大比例的聽眾是高中一年級學生,不自覺突然焦慮起來,我就讀高中時,這些學生甚至還沒出生,到底要跟他們談什麼呢?

說來我跟台中很有緣,儘管一開始不喜歡這都市。我第一次在大學演講,在台中;第一次在大專院校講課,在台中;第一次在高中演講,也是在台中。第一次遇到動心的女孩,在台中;第一次談戀愛,對象是個台中女孩。

高中聯考後,本來的計畫是拿台中一中的錄取通知,留在苗栗就讀一間私立高中以領取 50 萬元的獎學金 (當然一部分動機要拿來買新電腦),沒想到一切都談好時,一向支持我的家父,在暑假某夜將我喚醒 (我當時應該在 386 電腦前沒日沒夜地寫程式),和我說:「爸爸想了好幾個晚上,怕你以後會後悔沒去念台中一中,你真的念不下去時,可以轉學回苗栗念」

我本來就是很平凡的人,不過在高中聯考排名在中區前 150 名 (第一段組距),只想待在苗栗鄉下,安靜地活著,難道在鄉下唸書的人,不能考上醫學系 (截至高三前,我一直以來的心願) 嗎?既然如此,念什麼名校有意思嗎?本來我總覺得家父那句話是好心提醒,沒想到之後幾天,不時收到各方來電,勸我去台中唸書。最後我妥協了,規劃先去台中一中念一學期,然後再轉學回苗栗。後來,家父跟我說:「選擇了,就不要後悔」

或許是抱持這樣的心態,我幾乎沒攜帶什麼物品就準備去學校報到,父母親不放心,堅持要陪我一同搭車,於是我們三人搭乘台灣汽車客運 (國光客運前身) 從苗栗到台中 (此路線已停駛)。我望著窗外風景,一點都開心不起來,沒多久,聞到很嗆鼻的味道,那是強力膠嗎?是的,真有人在客運密閉空間吸食強力膠,實在令人費解。下高速公路時,司機才把那位乘客趕下去。

抵達台中一中時,我被學生宿舍前大排長龍的人潮嚇到,原來新生約有兩百餘位申請住宿,然後多數家長會陪同,有買棉被、盥洗用具,還有一堆大小不一的用品,不過我都沒買,跟家父推說不想排太久,開學後還可買,心中真正想法是:「反正只念一學期,根本就不必浪費錢買這些」

高中三年級的國文老師說,台中就是「風火城」,風化區和火災特多的地區,此言不虛,而且我還沒報到時,就在搭乘客運途中,從大雅路看過來,各式風化場所的招牌令人好不眼花撩亂。而開學第一周,竟然遇到在台中一中附近發生槍殺案,讓我一整個傻眼,這都市怎麼了?而且高中畢業前夕,還發生台中廣三 SOGO 百貨槍擊案。

開學前後與其說想家,還不如說是我想逃離這奇怪的都市,我本來就是苗栗來的鄉巴佬,台中對我來說,落差實在太大。晨間打掃時,被人問及從哪間學校畢業時,我回說苗栗縣通霄國中,同學一臉沒概念的模樣,之後又說「你一定是苗栗縣第一名考進來的吧?」這樣看不起人的話 (雖然那位同學大概不覺得),這樣的對話好像重複了很多次。

但上了幾堂課後,我發現台中一中的老師上課很認真,是我的運氣特好嗎?數學授課教師是簡秋蓉老師,擁有數學和電腦科學雙碩士學歷的她 (沒記錯的話,是當時學歷最高的教師,好幾位老師都稱讚過),第一週上課就教到超時,下課還回答同學的提問,她還贈送書本並題字給班上最高分和進步最多的同學,我很榮幸能收到老師的贈書幾次,在人生地不熟的台中,讓我覺得很溫暖,所以日後在大學教書時,我在能力所及,也比照簡老師的作法。國文課的周柏詳老師是師大畢業的國學泰斗,英文課的黃麗珍老師上課非常認真,課本寫滿了各式註解並不時補充多樣英文用語。

從我那一屆開始有美術班,自然這二十位女同學成為全校的焦點,結果我一天就因為擔任班級幹部,能和美術班女生一起出公差,記得那時候害羞到臉紅啊。我在學生宿舍住了整整三年 (包含畢業後回學校幫忙打掃),一年級上學期宿舍的寢室學長時任古典吉他社社長,很有才華,不時會在宿舍演奏,至今,我還常想起〈愛的羅曼史〉(Romance De Amor) 的旋律。

新生一屆約有一千人 (我那年據說還超收),來自苗栗的同學大概只有 10 位左右,不過這也不錯,趁機認識來自各地的同學,除了台中縣、南投縣、彰化縣、雲林縣,甚至還有人從台北、高雄過來的。唸書的空檔,聽同學們的成長背景,真的很有趣,也逐漸讓我對台中這都市慢慢改觀。我記得當時宿舍的寢室編號是 107,一個質數,跟 109 是孿生質數,入夜後,會有來自中友百貨的霓虹燈透入寢室,睡不著的時候,我就望著窗外,對著自己說:我要考上台北醫學院。

就這樣,原本只打算念一學期的我,出沒於學校榮譽榜、被票選為模範生,擔任了六個學期的班級幹部,擔任了五個學期的學生宿舍自治幹部 (由學生自主管理的宿舍,比照軍事制度,包含區隊長、正副大隊長,還有總隊長,全台灣僅台中一中有此制度),參加了校際競賽,談了很純的戀愛,甚至無聊到去競選畢聯會會長 (只是吃飽太閒),為了抗議黨國教育的「三民主義」,我在考試中點火燃燒試卷 (事後卻拿到 90 分,老師說我已經理解這門學科了)。這三年結交了很多好朋友,至今還有聯繫,甚至是工作夥伴。

後來陸續認識幾位中部的女生,他們無論個性、才華,或樣貌都挺好,雖然最終沒什麼結果,但他們充實我的生命,或許是愛屋及烏,我對台中的印象變好了,有一度我還想在台中工作。記得某年考慮過一份台中的工作,薪資只有當時我在台北任職公司給出待遇的三分之一到四分之一,那我為何考慮呢?因為辦公室在台中科博館附近,我上班可隨時去科博館找靈感。

回憶有如潮水,頻頻湧入腦際,罷了,我真的要對高中生談這些風花雪月嗎?

TEDxNTHU 2014年會:BINGO

| Comments


上午在 TEDxNTHU 2014 年會中,我以「改善台灣資訊教育的實做訓練」為題,分享過去兩年來,我這個普通的中年大叔利用工作之餘的時間,投身高等教育並陪著學生動手做點東西的心得,尾聲引用美國作家 Eric Hoffer 的話語:
「在劇烈變動的時代,善於學習的人們將會擁有未來。那些自認已經不需要學習的人們常常會發現自己的能力只適用於那不再存在的過去」

當今資訊教育面臨很大的環境變革,基本上都圍繞在 open source 精神,有開放課程、異常豐富的開放原始碼專案、價格彈性又多元的開放硬體,以及過往難以想像的網路傳播能力 (一如此次 TEDxNTHU 年會),更加彰顯 Hoffer 的說法,而從實做中學習、反省中求進步,始終是走向未來最踏實的路。

我不曾寫學術論文,也沒什麼大智慧,「動手做」大概是能為學生帶來的核心訴求,一如我在演講中提到:
「我不是要跟你說大道理,只是要帶你做出實際的東西。我們可以實作中得到反省。」

感謝大會的張羅,這次也和頗多不同領域的朋友交流。

莫忘初衷

| Comments

12 年前,我被告知家母罹患癌症,當時我在空軍服役,由於精實案之後,任務很吃緊,我又在極機密的作戰單位,沒辦法及時探視母親,那時我許了一個心願,要是母親能好轉,我每年要作一點事情。

陸續捐了大概三百萬元出去,有協助開放原始碼專案開發,也有部份是醫療研究,這其實沒辦法作什麼事,三百萬元連作臨床測試都不夠。

但現在我回學校教書,若能夠提昇畢業生的薪資,而且讓學生知道施比受有福的道理,即便教了幾年,只有 30 位學生,但每人平均捐 10 萬元,不就超過我過去累積的金額?更何況,在資訊科技領域的機會如此多,我相信從嵌入式系統課程的訓練,讓同學薪資提昇的幅度應該是很樂觀的。

心境轉變後,看待事物的方式也不同了。

以前我在大學翹了多少堂課,現在就要在大學講多少課。

以前為了學習電腦技術但手頭沒錢,就去偷了學校附近的書店 (好幾次還是穿著台中一中的制服過去,對店員佯稱書本未消磁),現在每年要送幾十本書給學生、捐書給圖書館致歉。

過去十年,在工作面試場合,直接或間接地,我刷掉超過 100 位畢業生,以前刷掉幾個,我就要教回來幾個,這可能要作很多年。

這些事情想起來很難,但做起來卻沒這麼難,持續進行就好。

我印象中的成功大學工學院一直很強調實作,光是電機系就在師生的投入下,從無打造出 Intel 80486 相容核心、ARM9 相容核心,以及相關的系統軟體。這十年來大環境改變,連帶課程要求也下修 (大概就是在我入學的時候),現在學生很難想像在一門課程期末專題就是要做出一個 ARM7 相容核心,然後讓 uClinux 正確運作起來,否則直接死當,這樣貌似嚴苛但卻實際的要求。

將心比心,要是 Apple, Microsoft, Samsung 的工程師也跟同學一樣,對專業知識似懂非懂,這樣做出來的手機,到底誰敢用?

從四月中旬以來,2014 年嵌入式作業系統設計與實作課程就進入期中報告,與其說「報告」,不如說是「專題」,相當於每位修課同學都會作兩次專題,只是一次是延展既有的作業系統,另一次是開發出自己的系統。為何除了寫程式,我們還要特別要求口頭報告呢?在 21 世紀,光有撰寫程式的技能,不足以讓各位在全球化的競爭中脫穎而出,必須能夠充分展現個人特質,從而進行團隊合作。

蔡志浩先生說過:
「台灣的教育向來不重視理解,只在意短期成效,例如成績。所以當你還是小孩子的時候爸媽看到你的成績單上有幾科表現不太好,第一個反應通常是送你去補習補到好。很多人成年後還是有這種求速成的心態,他們求助專家得到的反應通常會是需要時間累積經驗。」

我們的教育過去有太多問題,本課程只能概括承受,但作正確的事情永遠不嫌晚,與其空談「競爭力」,不如讓各位同學在畢業前真正做出會動的系統,讓日後工作場合的同事、老闆,甚至客戶折服於這些畢業生的專業。

同時,本人在交大資工授課的 FOSSAPC (自由開源軟體與專案協作) 也依循這個模式,也一起作實驗,看效果如何。

我希望同學經歷過這些訓練後,可以很有自信地面對種種技術和工程考驗。

開發作業系統有什麼意義?

| Comments

雖然已是第四學期在大學資訊系教書,但不免有無力感。首先,電機資訊相關科系的學生為何對我們每天都會接觸到的資訊系統無感呢?每天都接觸的 Android, iOS, Windows 等作業系統,難道不會好奇裡頭的運作,甚至動手去改變這些系統嗎?

「開發作業系統有什麼意義?」

Steve Jobs 說過:
「並不是每個人都需要種植自己的糧食,也不是每個人都需要做自己穿的衣服,我們說著別人發明的語言,使用別人發明的數學 ... 我們一直在使用別人的成果。使用人類的已有經驗和知識來進行發明創造是一件很了不起的事情。」

身為電機資訊科系的學生,帶著責任感過生活,嘗試為這個世界帶來點改善的作為,而持續貢獻。開發作業系統不是為了取代既有的作業系統,反而,正因為敬仰過去累積的成果,所以我們才更要延展這些經驗和知識,持續發明和創造,從根本原理到整體架構的掌握,不就是我們學習資訊技術的動機嗎?

我常問學生,為何不想搞懂每天用的手機背後的運作原理,從圖形處理、應用程式框架、通訊系統、作業系統,到處理器和硬體週邊呢?有同學說,自己只在意能否寫個小程式出來,也有人說,我只想當 "end user",更有人說,這不關我的事... 難道不就是因為對自己相關的項目無感,頂多只跟著科技媒體去哄抬那些用不著我們操心的商業產品。

如果只想依據興趣玩自己認定「好玩」的科技產品或者軟體專案,真的需要來資訊工程接受完整的訓練嗎?換個角度說,工程訓練絕對不是讓學生「找到興趣」就可以收工了,相反,應該要把「工程」視為自身對整體環境的使命。

當我們聽到遠通 ETC、戶政系統的弊端時,不免會恥於其低劣的品質,但不就因為我們對細節的輕忽、對工程原理的漠視,以及沒有把工程影響當作一回事,才有這些悲劇嗎?遠通 ETC 系統,實際上已經剝奪國道收費員的工作,甚至讓一些人走上不歸路,這些人的犧牲,結果換就了有如垃圾一般的資訊系統,這多荒謬呢?

繼續思考如何調整課程。

一個約砲軟體竟然價值百億美元

| Comments

日前 Facebook 宣佈收購手機通訊軟體 WhatsApp,歐盟委員會最終批准這筆交易,Facebook 以 218 億美元的高價收購 WhatsApp。依據報導文章〈Intel 90億元入股紫光 展訊如何超越聯發科?〉的數據,2013 年,Qualcomm 收入為 172 億美元,聯發科收入為 45.9 億美元,這兩家為全球最具實力的通信晶片設計公司,先後將 Broadcom, Renesas, Ericsson 等國際晶片巨頭擠出通信晶片市場。以 2014 年八月份來說,MediaTek 市值約 268 億美元,而 WhatsApp 的價值已是不相上下。

這讓我不禁在 Twitter 上帶著戲謔的口吻感嘆
「每次 Facebook 併購新創公司,我都不知道該怎麼面對學生。畢竟一個相簿竟然比好幾家電子公司值錢,一個約炮軟體竟然價值百億美元,叫我們這些搞系統的人,情何以堪?」

這引發了許多網友回應,摘錄幾句:

一個教育門外漢的反省

| Comments

下午蘇文鈺教授來辦公室找我談未來的計畫,並轉述聖嚴師父說,讓自己兒女有更好生活的方法,就是讓這個環境更好,這也是蘇老師想藉由對小孩子進行電腦程式設計教學,他一直相信,所謂教育,無非愛,關懷,陪伴與榜樣,從而改變弱勢局面的方式,誠然,教育的初衷不就是如此嗎?

剛瞥見查查寫了一句值得反覆咀嚼的話:

「經常聽家長說: 都為孩子活了。我認為合格的懂教育的家長,一定不是把所有的人生目標都放在孩子身上。智慧的家長一定是活出自己的精彩,以此影響孩子也走向人生精彩之路。家長經歷的人生,是孩子最好的成長教科書。記住: 精彩不是大富大貴,把你的價值觀擺正了啊!~~橋上聽風雨」

把家長換成教師,特別是投身於高等教育中的從業人員,感覺更是要以自身的「精彩」來影響孩子。倒也不是要追求物質的豐沛,而是要讓孩子得以走向自己的路。

我受正規教育的時間,算來和在資訊科技產業的長度相仿,算不上「精彩」,但自認還算多元,現在沒有什麼特別的規劃,只求和同學們一同成長。引用洪士灝教授稍早的文字:

「要做自己的教育部長,得從不畏懼改變開始。但台灣現有的教育文化似乎一直在拒絕改變,教育當局、老師、家長、學生,多方在教改的過程中或顯或隱地不斷拉扯,又是一個類似以上所講的悖論,似乎得靠個體的突變來慢慢突破僵局,西方的現代化不是一天造成的。不畏懼改變,有嘗試過改變,才有可能真切懂得變的道理。」

打從來學校教書起,以前我從來不感興趣的教育議題,現在竟常花心思去想,儘管還是不確定該如何「靠個體的突變來慢慢突破僵局」。

整整十年前,家母甫自癌症化療告一段落,就以贏弱身軀,堅持要把國中導師班的學生教到畢業,才放心退休,念茲在茲的,不是那三十多年的春風化雨,想必是「活出自己的精彩」的身教吧。

作業系統演化歷程

| Comments


(挑這張照片除了看起來比較瘦以外,還有 "My Love grow more with the passing time" 這句很美的話)

今天下午在 MOSUT -- Meet Open Source User in Tainan 聚會時,我分享作業系統演化的歷程,企圖涵蓋以下變遷: (大致符合時間順序)

  • Version 6 Unix (或稱 "V6", 1975 年五月,首個由 Bell Labs 廣泛散佈的作業系統)。澳洲的電腦科學家 John Lions 採用 UNIX v6 作為在 UNSW (新南威爾斯大學) 授課教材,並撰寫《Lions' Commentary on UNIX 6th Edition, with Source Code》(簡稱 Lions Book),這本書對電腦科學的影響,猶如普羅米修斯將火種 (UNIX v6 的運作奧秘和程式碼) 帶到人類世界,從而影響位於澳洲的 UNSW,連帶激發起作業系統的研究。2006 年,為了紀念 John Lions 的貢獻,在 UNSW 電腦科學系特別設立 "John Lions Chair"
  • BSD: 1980 年代到 90 年代,特別是加州大學柏克萊分校的 Computer Systems Research Group (CSRG) 維護下,引領的種種創新,奠定今日技術的基礎,中間還有 DARPA 的資助。始自 Bill Joy 在 1978 年釋出的 1BSD
  • UNIX 派系的競爭: UI (Unix International) vs. OSF (Open Software Foundation)。注意:OSF 與 open source 完全無關。這些商業廠商的競爭,由於 Microsoft 在伺服器市場的崛起,而由主要的 UNIX 系統供應商握手言和,抵抗共同敵人。爾後這些廠商將 UNIX 通用技術標準的制定,改組為 The Open Group
  • CMU 發展 Mach microkernel,這對先進作業系統有極大的影響 (部份設計考量的前衛程度,甚至超越目前主流作業系統),今天的 Microsoft Windows 和 Apple Mac OS X,都有 Mach 的影子在其中。這開創了第一代 microkernel。Mach 一些先進的設計,如 virtual memory,直接影響了 BSD,之後的 Linux 也採納相關研究成果
  • Andrew S. Tanenbaum 教授在 1987 年釋出的 MINIX,基於教育用途,microkernel 架構,而且系統呼叫與 UNIX v7 相容。注意:Douglas Comer 教授在 1984 年釋出 Xinu,但充其量只能說類似 UNIX,但本質上還跟 UNIX 有落差。MINIX 以低廉的 IBM PC 為主要平台,這創造了 Linux 崛起的基礎環境和社群
  • BSD 的浴火重生 (NetBSD, FreeBSD, OpenBSD)
  • 德國的 Jochen Liedtke 博士基於過去發展 L3 microkernel 的經驗,提出 L4 microkernel,這被視為是第二代的 microkernel。主導 NICTA::L4-embedded (NICTA 是澳洲類似台灣工研院的單位,致力於產學合作,並著重於系統軟體的影響力), OKL4, 以及 seL4 發展的 Gernot Heiser 教授則成為 UNSW John Lions Chair

我和日本的系統軟體前輩 Hideo Yamamoto 試圖將上述作業系統類比為演化樹的物種:

  • V6: 長臂猿 (Gibbon)
  • 2BSD: 紅毛猩猩 (Orang)
  • 4.2BSD: 黑猩猩 (Chimpanzee)
  • Solaris: 大猩猩 (Gorilla)
  • Linux: 人 (Man)
  • seL4: 超人 (Superman)

在 OSDC.tw / COSCUP 介紹嵌入式系統課程

| Comments


二十餘年前,台灣的電腦產業大老施振榮先生喊出「科技島」的口號,在一定程度上激勵不少學子,於畢業後投入資訊科技產業,造就了多元的發展。然而,大專院校的資訊教育本該培養學生獨立思考,卻因沒有充分規劃,為數可觀的實作課程往往淪為特定商業軟體的教育訓練。為了避免國家教育資源淪為單一廠商的行銷工具,我嘗試在國立成功大學資訊工程研究所中,大幅引進自由軟體或開放原始碼軟體,作為嵌入式系統課程的教具,不僅可自網際網路合法又免費取得,而在技術層面更較眾多版權私有的軟體有極大優勢,也就是學生能洞悉底層技術的原理,並透過豐富的開發社群而強化學習。

在 2013 年的 OSDC.twCOSCUP 議程中,我分享在成功大學和中正大學的「進階嵌入式系統開發與實作」與「嵌入式作業系統設計與實作」授課經驗,並以實際的實驗證明,多數的同學就算是首次接觸 GNU/Linux, GNU Toolchain, QEMU, Git, FreeRTOS, OpenOCD 等等廣泛使用的開放原始碼軟體,還是能在短暫的時間內學習到嵌入式開發的概念並參與實習。原本要向廠商購買所費不貲的軟體授權費用,則全數回饋給學生,使其可購買電子零件,進而動手實作出一系列電子半成品。

即使我只是一位新手教師,但藉由善用由軟體或開放原始碼軟體的途徑,就破除過往嵌入式系統教學所費不貲的陳見,全程使用開放原始碼軟體,大幅縮減了開課成本,並且讓修課的學生,得體洞悉系統運作的奧義。

願我能不忘初衷,堅持開發系統軟體,並將經驗分享給更多的有志學習者,像在進階嵌入式系統開發與實作 (2013 秋季; 成功大學)課程,和學生們一同學習。當然,我每年都要開發出一套作業系統,2013 年的 F9 Microkernel 希望是個好的開始。在 COSCUP 2013 上,我總共有四場演說,其實都提到一樣的議題:企盼找到更多朋友,一同熱血地開發系統程式,這領域在台灣貌似很孤單,但絕對能把深度帶給我們,這也是改變身處環境的一股沉默的力量。

投影片可見: 中輟生談教育: 完全用開放原始碼軟體進行 嵌入式系統教學,YouTube 上有 COSCUP 2013議程錄影,可一併參考。

做中玩,玩中做

| Comments

蘇文鈺教授提到的一席話
「人生很長,看遠一點,玩還是要玩,不要過火,工作要做,但是要學會欣賞與 enjoy 你在研究的事,而不是老是想學位與賺錢,作中玩,玩中做,慢慢的,路在哪裡就清楚了」

令我頗有共鳴,我記得剛成為大學新鮮人時,總是想賺錢以擺脫家裡的約束和證明自己 (多麼空泛又自憐的話啊),無論去打工、販售軟體服務,還是與人合夥創業 (最後失敗,面對沈重債務的壓力,差點在成大研究生宿舍頂樓就自殺了),除了唸書以外的事,多少都沾了一些,但最後呢?不僅學業中輟,還賠上親友師長對我的信任和期許。

我很慶幸,自己還能符合兵役標準,在部隊裡待了 21 個月,那是我真正接受高等教育的地點,不僅靠自修,也是認真思考老師提及「解決 open 問題」的時候。以前作任何事沒有很認真想,直到這幾年才有機會去反省。

開發作業系統一直是我的興趣和堅持,儘管這件事早已超過技術問題,不是你有專業就能堅持下來,我們得面對第一項質疑:「自己開發的作業系統要用在哪裡?誰要用你開發的作業系統?」,為此,可能還要去開創嶄新的應用型態,只為了讓自己開發的作業系統有所發揮。

電腦科學家 Alan Kay 在 1970 年代說過:
「真正認真開發軟體的人,應該自己做硬體」(People who're serious about software should make their own hardware.)
這精神在 2007 年於 iPhone 發表會上,再次發揚光大,

大到一套完整軟體系統的工作流程,小到細部算法的優劣評估,都需結合底層 (電子、電機、物理原理、數學方法等等) 的基礎進行,而一旦脫離開此等「基礎知識」所作所為,不僅不科學,對於實際的工作情形來說也非最合理。

具體來說,每一行程式碼,無論高階語言、低階語言,最後也都要轉變成電子電路的 On 或 Off 這兩種工作狀態,而即便是數位邏輯也僅是模擬電路在連續工作狀態中的一些極端情況,最終的電路運作方式,仍是一連串的電器信號在半導體材料中「流動」。

這句話背後的含義和知識,是每位電腦科學或資訊工程從業者都該去瞭解、掌握並付諸實踐的,換言之,就是「基本功」的訓練,並且永不過時 —— 重提這種經典而紮實的學習觀念。

在 TI OMAP4 控制 ARM Cortex-M3

| Comments

TI OMAP 系列除了內建 ARM Cortex-A 處理器以外,OMAP33x 搭配 ARM Cortex-M3 系列處理器,OMAP4 搭配兩個 Cortex-M3,OMAP5 則搭配兩個 Cortex-M4,用途是低功耗處理和針對多媒體系統的即時反應需求,輔助 ARM Cortex A8 (OMAP3) / A9 (OMAP4) / A15 (OMAP5) 進行底層相關控制。本文以 Pandaboard ES 為參考硬體平台,說明如何對 TI OMAP4460 內建的兩個 Cortex-M3 進行控制。


Pandaboard ES 的網站可得知硬體規格:

  • Core Logic OMAP4460 applications processor
    • Dual-core ARM® Cortex™-A9 MPCore™ with Symmetric Multiprocessing (SMP) at upto 1.2 GHz each

其中兩個 Cortex-M3 單元特稱為 "Ducati Cortex-M3 sub-system",詳細的運作可參考 wiki:Ducati For Dummies,主要控制 Ducati Imaging Sub System (ISS) 和 Ducati Image Video Accelerator - High Definition (IVA-HD) 這兩個子系統,運作圖例如下:

任職於 IBM 的 Linux 核心工程師 Alistair Popple 日前在 GitHub 發布了 Pandaboard-FreeRTOS,展示從 u-boot 或 Linux (都運作於 Cortex-A9 之上) 環境中,將特製的 FreeRTOS 載入到其中一個 Cortex-M3 中並執行。

Pandaboard-FreeRTOS 具體原理是,預先整合 FreeRTOS 和示範程式碼到 Demo.bin 檔案中,隨後交由 u-boot 載入到記憶體,一個名為 loader.img 的檔案運作於 Cortex-A9 並且為 Cortex-M3 設定 L2 MMU,之後將稍早由 u-boot 載入到記憶體的 Demo.bin 之位址映射到 Cortex-M3 虛擬位址 0x0,而 GPIO 位址也連同映射到 Cortex-M3 虛擬位址中,這樣示範的程式碼可藉由每秒閃爍 LED 來確認已控制 Cortex-M3。

目前的程式碼中,作為示範性質,並沒有太多處理,只是簡單地從物理位址的 0xb0000000 映射 1 M 範圍到裝置位址的 0x0,這樣的用意是保存 Cortex-M3 程式的 text 和 data section,而為了能讓 LED 閃爍,系統也映射包含 GPIO1 週邊暫存器 (實體位址 0x4a300000) 的 1 M 空間到裝置位址的 0xfff00000

以下是我在 Ubuntu Linux 上測試的指令:

export PATH=/usr/local/csl/arm-2013.11/bin:$PATH
cd /tmp
git clone git@github.com:apopple/Pandaboard-FreeRTOS.git
cd Pandaboard-FreeRTOS
make

這裡選用 Sourcery CodeBench 的 ARM EABI Release 2013.11 (Lite edition),預先安裝於 /usr/local/csl 目錄。將 Demo.binloader.img 兩個檔案複製到 SD 卡的第一個分割區 (boot):

cp -f Demo.bin loader.img /media/$USER/boot

當然,我們需要一個可正確運作的 u-boot,注意,在 OMAP4 的架構下,除了 Boot ROM 外,還有 X-loader 或 SPL 作為第二階段的 boot loader (檔名: MLO),而 u-boot 本體則是第三階段。筆者在 2009 年發表 Qi -- Lightweight Boot Loader Applied in Mobile and Embedded Devices 則縮減到兩階段啟動,但為了簡便起見,這裡仍沿用 u-boot,只要參照 wiki:Panda How to MLO & u-boot,就可很容易建構 MLOu-boot.img 這兩個檔案。操作指令如下:

cd /tmp
git clone git://git.linaro.org/boot/u-boot-linaro-stable.git
cd u-boot-linaro-stable
make CROSS_COMPILE=arm-none-eabi- omap4_panda_config
make CROSS_COMPILE=arm-none-eabi-

同樣複製到 SD 卡的第一個分割區:

cp -f MLO u-boot.img /media/$USER/boot

接著就準備要測試了。

我使用 Openmoko 開發的 neocon 工具來操作 Pandaboard ES 對外的終端機連線:

neocon /dev/ttyUSB0

以下是參考的執行輸出:

[Open /dev/ttyUSB0]

U-Boot SPL 2013.01.-rc1-00003-g43ee87a (Jan 01 2014 - 21:38:53)
OMAP4460 ES1.1
OMAP SD/MMC: 0
reading u-boot.img

U-Boot 2013.01.-rc1 (Jan 24 2013 - 09:32:22)

CPU  : OMAP4460 ES1.1
Board: OMAP4 Panda
I2C:   ready
DRAM:  1 GiB
MMC:   OMAP SD/MMC: 0
Using default environment

In:    serial
Out:   serial
Err:   serial
Net:   No ethernet found.
mmc0 is current device
reading boot.scr
159 bytes read
Loaded script from boot.scr
Running bootscript from mmc0 ...
## Executing script at 82000000
reading loader.img
752 bytes read
reading Demo.bin
12828 bytes read
## Booting kernel from Legacy Image at 82000000 ...
   Image Name:   
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    688 Bytes = 688 Bytes
   Load Address: 83000000
   Entry Point:  83000244
   Verifying Checksum ... OK
   Loading Kernel Image ... OK
OK

Starting kernel ...

然後應該可見 D2 這個 LED (SD 插座旁) 以每秒一次的頻率閃爍。讓我們來看看運作於 Cortex-M3 的 FreeRTOS 程式作什麼,可參見 Application/main.c 檔案,首先是 LedFlash 這個 FreeRTOS task 實作:

volatile int *GPIO1_DATAOUT;
volatile int *GPIO1_OE;
static void LedFlash(void *Parameters)
{
    portTickType LastWake;
    *GPIO1_OE &= ~(1 << 8);
    LastWake = xTaskGetTickCount();
    while (1) {
        *GPIO1_DATAOUT ^= (1 << 8);
        vTaskDelayUntil(&LastWake, 1000);
    }
}

藉由呼叫 vTaskDelayUntil,達到等待的效果,而本範例中,已在 FreeRTOSConfig.h 定義 configTICK_RATE_HZ 的值為 1000,期中 ledFlash task 將會持續等待,直到一秒過後,才會 unblock。

main 函式的實作相對單純,主要是建立前述 task:

int main()
{
    volatile int i;
    GPIO1_DATAOUT = (int *) 0xfff1013c;
    GPIO1_OE = (int *) 0xfff10134;
    *GPIO1_OE &= ~(1 << 8);
    if (*GPIO1_DATAOUT & (1 << 8)) {
        while(1);
    }
    *GPIO1_DATAOUT |= (1 << 8);
    xTaskCreate(LedFlash, (signed char *) "LedFlash", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
    vTaskStartScheduler();

    /* Just sit and flash the LED quickly if we fail */
    while (1) {    
        for (i = 0; i < 100000; i++);
        *GPIO1_DATAOUT ^= (1 << 8);
    }
}

注意:if (*GPIO1_DATAOUT & (1 << 8)) 是避免兩個 Cortex-M3 的 race condition 所作的 hack。

除了透過 u-boot,事實上也能在 Linux 環境下,藉由 remoteproc (Remote Processor Framework) 來載入針對 Cortex-M3 的程式,其設計就是針對 OMAP4 這樣的 AMP (asymmetric multiprocessing) 環境,允許相互存取資源。以下引述 Linux 核心文件:

The remoteproc framework allows different platforms/architectures to control (power on, load firmware, power off) those remote processors while abstracting the hardware differences, so the entire driver doesn't need to be duplicated. In addition, this framework also adds rpmsg virtio devices for remote processors that supports this kind of communication. This way, platform-specific remoteproc drivers only need to provide a few low-level handlers, and then all rpmsg drivers will then just work.

關於低階處理的部份,又涉及另一個 framework: Remote Processor Messaging (rpmsg),我們必須確保 Cortex-A9 上運作的 Linux 的 remoteproc / rpmsg 定義與 Cortex-M3 上的 FreeRTOS 程式相符,為此需要修改 Application/startup.c