網頁

2015年5月8日 星期五

錯下一個字轉語, 墮五百世野狐身

 

這是一個禪門公案, 又稱野狐禪. 是一個佛教的故事.

唐朝的百丈禪師, 每一次上堂說法, 都會有一個白髮白鬍鬚的老人來聽講. 有一天說法完畢之後, 老人遲不離開, 百丈禪師就問他有什麼事.

老人回答, 我並不是人, 是一隻狐狸, 前身是一個法師, 有一次學僧問我, "大修行人還落因果也無 ?", 我回答 “不落因果”, 答錯了, 因此墮入五百世野狐身. 希望百丈禪師解惑. 於是百丈禪師請他第二天在講堂上提出來.

第二天, 老人在講堂上提問, "大修行人還落因果也無 ?", 於是百丈禪師回答“不眛因果”. 老人告辭之後, 百丈禪師帶領僧眾到後山岩洞中找到一隻野狐的屍體, 於是把它用死去的僧人的方式火葬.

不落因果, 不眛因果的道理, 我不能說明, 不然我就變成野狐了. 但是, 感觸倒是滿深的.

解錯一個字, 罪過有那麼大嗎 ? 初初的看, 好像也沒有什麼. 但是仔細的去想, 這個聽到錯誤答案的人, 會不會一時不小心, 又傳達給其他人, 於是錯誤就這樣擴散出去, 也許五百世都還還在傳播中, 那麼, 這樣的罪過還不大嗎 ?

一缸的自來水, 滴下一滴藍墨水, 要換掉多少水才會看起來不藍 ?

不慎解錯一個字的罪過有這麼大, 那麼, 那些把言論自由當作護身符, 有意無意中, 提出似是而非, 以偏蓋全的言論的人, 又要當多少世的狐狸 ?  戴著學者, 教授的高帽子, 利用學術專業的光環來誤導別人又應該如何呢 ?

西元兩千年的夏天

這是很久以前寫的. 最近在整理東西, 把它搬過來. (可以想見, 這 10 年變化有多大)
 
西元2000年的夏天, 大約是在八月初. 我到深圳出差, 實際上是到客戶那邊裝系統. 這種事沒辦法很準確的估計需要多少時間, 也許機器到那邊水土不服, 十天半個月也搞不定. 沒想到三天就搞定了. 本想提早回來, 但又擔心一走, 系統就出狀況, 就決定多待幾天, 觀察一下. 客戶那邊也希望我多留幾天, 星期天一起出去走走.

星期天, 早上就和他們一起去羅湖商業城. 羅湖商業城在羅湖口岸旁. 口岸也就是海關, 過了羅湖口岸, 就是香港. 我和幾個人逛了一圈, 買了一個指南針. 其他幾個女孩子說有地方要去, 叫我們不要跟. 約 11 點在門口一起去吃午飯.

快11 點的時候, 突然有人叫我. 一個不認識的人, 打扮得像個洋娃娃. 我嚇了一跳. 原來那幾個女孩子是去美容. 頭髮捲起來, 假睫毛, 跟洋娃娃沒兩樣. 連腳趾甲都雕花了. 原來這是她們的消遣. 因為還有人沒到, 我就在門口旁邊走來走去.

門口出來, 是一座陸橋. 我走到陸橋上, 看到有個人趴在垃圾桶上. 走近一看, 原來是個婦人, 背上背個嬰兒, 看起來就是還沒斷奶. 婦人正從垃圾桶裡撿東西塞到嘴裡. 我愣了一下, 停了下來. 婦人轉過頭來, 我看到婦人的堅毅眼神, 和嬰兒純淨的眼神. 雖然是大熱天, 我卻覺得有一股涼意. 幾乎跌倒在地上.

婦人的面容黝黑, 年紀並不大. 但是, 眼神裡沒有一絲卑微, 恐懼. 她轉過頭來看了一下, 又開始自顧自的翻著垃圾桶. 這時同事叫我, 我就走了回去.
後來的行程, 我幾乎沒有印象. 婦人的眼神一直在我心頭徘徊. 我一直在想, 是什麼情況, 會讓一個女人, 背著嬰兒, 在這麼熱鬧的地方, 人來人往的時刻, 在路中間翻垃圾桶.

至今, 我仍不能忘懷, 當時她回望我的眼神. 淒苦但是帶著堅強.

2015年2月10日 星期二

[MPC-HC] Notes for MPC-HC

 

MPC-HC 是一套在 Windows 平台上的 open source 的 media player. 以下是執行檔下載連結

http://mpc-hc.org/downloads/

我們的重點是 open source. 既然是 open source, 那就會需要下載 source code. source code 的下載路徑在同一個頁面. 可以透過 git 下載. 獨立的 source package 在以下頁面的右邊可以找到. 就是那個 “Down ZIP” 的按鍵.

https://github.com/mpc-hc/mpc-hc

下載完, 解開, 用 Visual Studio 打開. 卻沒有辦法完成 build. 因為它需要用到 Visual Studio 2013 的開發環境. 我現在用的是 2010.

等搞定 Visual Studio 2013 再來繼續囉.

2015年2月8日 星期日

[Visual Studio 2010] TRACE shows nothing on output window

 

TRACE 這個 macro (巨集), 在追蹤程式, 偵錯的時候, 非常好用. 但是 Visual Studio 2010 預設的狀況是沒有作用的. 必需要自己打開.

在 Tools/Options/Debugging/General/

取消 “Redirect all Output Window text to the Immediate Window”, 然後 rebuild, 就可以在 “Output Window” 看到 TRACE 的訊息.

 

image

2014年11月25日 星期二

[Tiva] Project Closing Note

 

做了快一年的案子, 終於要結束了. 比預估的時間多了 3 個月. 雖然不是很滿意, 不過還在控制範圍內. 在還沒有完全冷掉之前, 把一些心得和檢討記下來.

承接專案因由

這完全是偶然.

本來在目前的工作準備要離職, 和朋友一起做. 剛好公司也希望我離職 (沒有專案可以做了), 跟我說不調走就資遣. 當時想, 反正要走了, 就領一下資遣吧, 就同意了. 隔一天, 朋友那邊打電話來, 表示產品方向覺得不妥, 叫我先不要過去, 那就好吧, 先不要過去. 一回神, 想到接下來不就沒工作了嗎 ? 剛好有朋友的公司, 需要做一個專案, 但是擔心能力不夠, 所以就找我幫助. 當下就想, 至少有一點收入會進來, 工作再繼續找好了, 就先答應了.

接下來那個星期, 就開始瞭解這個案子的相關資料, 排定 schedule, 簽訂合約, 準備接這個案子.

一個星期過去之後, 公司又來通知說不資遣 (講白了就是不想花這筆錢), 要我自己離職. 真的滿討厭這種專搞檯面下小動作的行為. 那好吧, 把我調走, 我一面做案子, 一面找工作. 原先要一起做的朋友隔天又打電話來, 說有東西要做了, 要我趕快過去!! 是講好一起來亂的嗎 ?! 

結果就是我接了這個案子.

專案內容簡述

這個案子主要是 porting. 客戶有一個 TI Stellaris 已經完成的測試設備專案, 希望 porting 到 TI Tiva (新一代的處理器). 以下說明主要變更的部份

  • 配合硬體的 schedule, 先用 TM4C123 Launch Pad, 再用 TM4C129 Launch Pad, 再換成 實作的 TM4C129DNCPDT
  • Library 從 TI Stellaris 移轉到 TI Tiva
  • 開發環境從 IAR (付費, 而且很貴) 改到 Code Composer Studio ( TI 自己的, 免費用於 TI 的 solutiom)
  • 編譯程式從 IAR compiler 換成 CCS 的 GCC
  • 作業系統從 SafeRTOS 換成 FreeRTOS
  • Embedded Python 調試及修改
  • PC 端 Visual Studio 的 software 配合修改

 

執行中遇到的問題

以下記錄專案執行中, 遇到的問題點

規格定義不明確

只要是程式相關的專案, 大都會遇到這樣的問題. 不過這次遇到的問題不太一樣, 客戶這套系統是國外部門開發的, 移轉到國內來, 國內也沒有人在用. 只能看著 source code 推測. 雖然後來有提供一些設計文件, 不過已經消耗掉一些時間.

Secondary Boot Loader

這套系統需要能 udpate firmware, 因此需要有 secondary boot loader. 之所以稱為 secondary 是因為 IC 本身就有 boot loader, 可以載入 NAND 上面的程式碼. Seconday Boot Loader 就是被 IC 載入的部份. 它負責更新或是執行主要應用程式.

這本來不是太困難的事. 不過為了相容於原有系統, 所以必需在 build 好的映像檔中, 插入一段資料. Tiva 的映像檔的開頭, 固定是 { 堆疊指標 + 重置向量 + 其他中斷向量 }, 檔案最後, 原系統也另外加了 check sum. 在 IAR 中可以指定一個 structure 在 link 的時候, 固定的位置. 其實 CCS (Code Composer Studio) 也可以, 只是文件沒有說明這件事, 因為 CCS 用的 compiler/linker 是 GCC, 所以它在這部份沒有特別說明.

Release/Debug mode switch

這本來是很簡單的一件事. 不過因為實作了 Secondary Boot Loader, 應用程式的映像檔會有兩種. Release mode 的啟始位置不會是 0x00000000 (已經被 Secondary Boot Loader 佔用). 但是用 JTAG debug 的時候, 它的位置是 0x00000000. 在 CCS 的環境下, 它會使用到兩個 configure file. 這其實也還算簡單. 比較麻煩的是, 要如何在切換 debug/release mode 的時候, 自動去切換這兩個 configuration file. CCS 的 pre-build 可以接受的路徑格式是 Linux 風格, 無法存取到 local 的檔案. 最後只是很簡單的設定兩個批次檔來做切換. 不過還是覺得有點遺憾, 感覺滿蠢的.

C/C++ 混用

原系統的程式碼, 有很多 C/C++ 混用的情形. 在 IAR 的設定中, 是可以把 C/C++ 都當作 C++ 來使用. CCS 也是可以這樣做. 不過,有部份的編譯指引 (#pragma) 不能使用. 尤其是中斷向量必須宣告在 data section. C/C++ 的函式的 naming 是不一樣的,  所以常常發生 linker 找不到 object code 的問題, 有時候沒注意到, 繞了一大圈, 才發現又是一樣的問題.

Heap Configuration 

最麻煩的是 heap. 原系統裡面用到了很多 new 這個 operator, 不過我們的記憶體不是很大, 才 256 K, new 一個包含 7 KB 的 buffer 的 object, 就掛了, 而且很不容易查出來問題是什麼, 更不容易聯想到需要調整 heap 的 大小.

Task Stack

所有的 RTOS 都需要一些 stack 來支持不同 task (或是叫做 thread,…) 的切換. SafeRTOS 的 stack 是在建立的時候給定位址及大小. FreeRTOS 則是在 init 的時候, 先配置一大塊, 而後在 create task 的時候, 自行從這一塊中去分配.

USB Update

原本想要用 USB 的 DFU class 來做 firmware update. 不過因為有兩塊 firmware (Boot Loader/Application), DFU 沒有辦法很好的支援這個動作. 最後還是用一般的 Bulk Transfer. Boot Loader 只檢查需不需要 update Application. 如果需要就更新, 否則就執行 Application. Application 負責對應 PC, 接收 firmware image. 如果收到的是 Boot Loader, 就直接更新, 更新完系統 re-boot. 如果是 Application ( 自己是執行中的 image, 不能自己更新), 就先寫到 NAND 的後段, 並且留一個記號給 Boot Loader, 然後 re-boot, 讓 Boot Loader 去處理更新 Application 的動作.

在把 USB device 從 USB bus 上移除, re-boot 重新連線的時候也遇到過一些問題.

這部份 debug 比較困難. Boot Loader/Application 以及 PC 的軟體都需要同時運行. 而且也不能用 JTAG 進行 trace.

Python

Embedded Python 也是第一次遇到. 在 Embedded system 上內建一個 Python 來執行 PC 傳過來的 script, 這部份我是覺得很有趣. 而且在設備的實作,裝機,調整上, 應該是很有發展性. 不過在處理的時候(大多是在看文件找資料), 也是掉了不少頭髮.

結語

整體來說, 滿有挑戰性, 大致上設定的功能也都完成. 也相當疲倦, 不過總算是沒摔了招牌.

接下來, 要開始準備生涯的下一個階段了.

2014年11月18日 星期二

[Android Studio] New Project


Start Android Studio

執行 studio64.exe (studio.exe), 並選擇 “New Project”
image

Fill Project property

填寫 project 相關的資料.
image

Select Platform

image
image
Accept and Next …
image
下載 SDK
image

image
先選擇一個 Blank Activity:
image
Finish 之後, 出現 Gradle ….
不過, 我有遇到 Java 連線被防火牆擋住的狀況. 不確定是不是和這個有關. 同意之後, 它才開始跑了起來.
image
image
That’s it

[Android Studio] 安裝 Android Studio

 

Android Studio, 顧名思義就是開發 Android app 的 IDE (Integrated Developemnt Environment). 是 Google 所開發, 目前已經從 0.1 發展到 0.8. 原本我也是是用 Eclipse + ADT. 但是有一天, 不小心升級 SDK 到 23 之後, 就沒辦法使用. 雖然網路上可以找到很多如何避開這個問題的方法, 但是, Google 推出自己的 Android 開發平台看起來也是必然的. 那麼, 就趁這個機會來熟悉一下吧.

Download Android Studio

參考以下的 link, 下載適合自己的版本. 目前最新是 Beta v0.8.14. 也有 Windows 版本, Mac OS X 版本, Linux 版本.

https://developer.android.com/sdk/installing/studio.html

我下載了 Windows 的版本. android-studio-ide-135.1538390-windows.zip. 解壓縮至目前目錄, 出現 android-studio 目錄.

Android Studio 的執行版本

在解出來的目錄中, 的 bin 目錄下, 有 studio.exe 及 studio64.exe 這兩個是 32/64 的執行檔案.

Install Android Studio

在 android-studio\bin 下, 找到 studio.exe. 執行後出現這個錯誤. 我們需要 JAVA_HOME 這個環境變數.

image

Add JAVA_HOME variable

打開 Windows 的開始/電腦/系統內容/進階系統設定, 進階頁面的環境變數按紐, 如下圖.

image

image

 

image

* 這是一個雙重錯誤. 我應該要執行 studio64.exe (我的 Windows 7 是 64 位元版本). 但是我執行了 32 位元版本, 所以出現了錯誤的錯誤訊息. 正確的錯誤訊息應該是 64 bit-JDK.

總之, 新增環境變數之後, Android Studio 可以正常執行.

執行 Android Studio

執行 studio64.exe 之後, 出現 Android Studio 的歡迎畫面.

image