星期三, 5月 06, 2009
Bootable USB Image
前幾天,不務正業的幫公司處理工廠生產的問題,作為代工廠,系統影像檔是由客戶提供,所以測試程式不可能讓你包在出貨用的 Image 裡,一來是因為「髒」,再者是程式自身的需求或許需要某些套件的搭配,比較好的方式為測試程式量身打造一個系統。
要求很簡單,Boot From USB、越小越好、開機後直接執行測試程式,且可以簡單、快速的大量複製該測試系統,Moblin Image Creator 可以幫助我們簡化整個過程,把整個框架建好,我們可以專心在整合測試程式,同時安裝程式需要的套件、modules,接著手動修改設定檔,整個過程就像在拼圖一樣。即便有了 MIC,手動的地方還是不少,最後作出來的影像檔大小 300 MB,雖然還可以縮減,但以現在隨身碟的容量及 USB 2.0 的傳輸速度,其實意義不大;對於大量複製的要求,工廠只要執行 dd bs=1024 if=usb.img of=/dev/sd? 便可以做好測試用的隨身碟。
學習應該是這樣,首先你找到黑盒子幫你解決問題,接下來要去了解黑盒子,最後你試著做出一個很陽春但可以用的透明盒子。我將整個過程抽出重新寫成 Scripts,一樣可以作出符合要求的檔案 ;)
重點是,這樣的過程,你必須不斷地把做好的 Image 寫到隨身碟,關機,重新開機(Boot From USB),檢查作出來的隨身碟能不能正常開機,如果你真的不斷重複這樣的過程,我只能說連猩猩都會利用工具釣魚了... ;)

透過 QEMU,不必重新開機,就可以測試我們做好的隨身碟,利用 lsusb 得到 usb flash drive 的 vendor 及 product id 後,利用 qemu 模擬整個開機的過程


不務正業,我就是討厭 Notebook...
要求很簡單,Boot From USB、越小越好、開機後直接執行測試程式,且可以簡單、快速的大量複製該測試系統,Moblin Image Creator 可以幫助我們簡化整個過程,把整個框架建好,我們可以專心在整合測試程式,同時安裝程式需要的套件、modules,接著手動修改設定檔,整個過程就像在拼圖一樣。即便有了 MIC,手動的地方還是不少,最後作出來的影像檔大小 300 MB,雖然還可以縮減,但以現在隨身碟的容量及 USB 2.0 的傳輸速度,其實意義不大;對於大量複製的要求,工廠只要執行 dd bs=1024 if=usb.img of=/dev/sd? 便可以做好測試用的隨身碟。
學習應該是這樣,首先你找到黑盒子幫你解決問題,接下來要去了解黑盒子,最後你試著做出一個很陽春但可以用的透明盒子。我將整個過程抽出重新寫成 Scripts,一樣可以作出符合要求的檔案 ;)
重點是,這樣的過程,你必須不斷地把做好的 Image 寫到隨身碟,關機,重新開機(Boot From USB),檢查作出來的隨身碟能不能正常開機,如果你真的不斷重複這樣的過程,我只能說連猩猩都會利用工具釣魚了... ;)

透過 QEMU,不必重新開機,就可以測試我們做好的隨身碟,利用 lsusb 得到 usb flash drive 的 vendor 及 product id 後,利用 qemu 模擬整個開機的過程
sudo qemu usb.img -no-acpi -usbdevice host:3538:0050


不務正業,我就是討厭 Notebook...
星期三, 4月 22, 2009
BeagleBoard
農曆年後拿到的板子,到手後作了基本的測試就因為其他的事情而停頓...
左邊是 Type A 轉 mini B 的 USB 線,可以供電給 Beagleboard,下方白色接頭的線則是 USB OTG,有了它,板子可以變成 USB Host 的角色,這時就需要外接電源了(左二),另外,一張 4GB SD 卡是用來儲存 rootfs,最右邊則是 HDMI2DVI cable,有了它才能外接電腦螢幕。

自己花錢買的東西當然要好好珍惜(手上還有一片 JTAG Port 有問題的 QT2410),為了預防使用中板子被靜電打死,所以在購買時順便加買了壓克力外殼避免外力直接去接觸到硬體,開孔處也處理的很好,整體質感不錯,不會給人很粗糙的隨便感 ;)


板子上的 JTAG 是 14 PIN 的,但是我手上的 JTAGKey 是標準的 20 PIN,所以我先跑去光華商場買了一個接頭,順便做了一條線,看過電路圖後,我猜測只要把一些 PIN 接地後應該就可以用了,等有空的時候再試。

整個接好就像這樣,透過 USB Hub 外接鍵盤、滑鼠,功能的擴展性是很夠的,要有網路或無線網路也不會是問題。

最後,這是前幾天把 QT-Embedded 4.5 放到板子上的跑 Demo 程式的執行畫面,應該很熟悉吧,但是好像收不到鍵盤或滑鼠的 event,rootfs 是 based on Angstrom。(我已經把 Configure / Build Qt-Embedded 4.5 的 Scipt 及 Log 放上去,有興趣的人可以參考)
左邊是 Type A 轉 mini B 的 USB 線,可以供電給 Beagleboard,下方白色接頭的線則是 USB OTG,有了它,板子可以變成 USB Host 的角色,這時就需要外接電源了(左二),另外,一張 4GB SD 卡是用來儲存 rootfs,最右邊則是 HDMI2DVI cable,有了它才能外接電腦螢幕。
自己花錢買的東西當然要好好珍惜(手上還有一片 JTAG Port 有問題的 QT2410),為了預防使用中板子被靜電打死,所以在購買時順便加買了壓克力外殼避免外力直接去接觸到硬體,開孔處也處理的很好,整體質感不錯,不會給人很粗糙的隨便感 ;)
板子上的 JTAG 是 14 PIN 的,但是我手上的 JTAGKey 是標準的 20 PIN,所以我先跑去光華商場買了一個接頭,順便做了一條線,看過電路圖後,我猜測只要把一些 PIN 接地後應該就可以用了,等有空的時候再試。
整個接好就像這樣,透過 USB Hub 外接鍵盤、滑鼠,功能的擴展性是很夠的,要有網路或無線網路也不會是問題。
最後,這是前幾天把 QT-Embedded 4.5 放到板子上的跑 Demo 程式的執行畫面,應該很熟悉吧,但是好像收不到鍵盤或滑鼠的 event,rootfs 是 based on Angstrom。(我已經把 Configure / Build Qt-Embedded 4.5 的 Scipt 及 Log 放上去,有興趣的人可以參考)
標籤:
BEAGLEBOARD
星期一, 4月 13, 2009
園藝樂
上星期一因為心情不爽上班,ㄟ,我是說身體不舒服,莫名地得了星期一症候群,請了一天假一大早就跑到附近的內湖花市裡閒晃,第一次逛花市,即便我已經生活在內湖三年了。
老實說,這種別人在上班,我卻在外面蹓達又有錢領的感覺比大家都放假的感覺還開心。
很快買好東西後,就開始我的園藝樂,不知道有多少人聽過倒地鈴這植物,我在台北的山區晃了幾次沒看過,中南部很常見,所以趁著回南部掃墓順便摘了幾株,準備種在窗台邊希望能移植成功。

我覺得最好玩的地方在於它的種子,成熟的種子是黑色,中間會有一個白色的小愛心,很特別,就像小孩子收集星砂送給喜歡的人,有人也會收集種子,裝在小玻璃瓶裡當作禮物 ;)

因為瓶罐蟋蟀一書,特地買了幾個玻璃瓶回來建立自己的瓶中世界,植物就從老姐送的銅錢草移植過去,至於將蟋蟀養在瓶子裡就不必了 ;)



就像在水族箱種水草一樣,會有分前景、中景及後景,根據植物的高低來種植,使用箝子可以幫助更容易的將植物植入,以之前種水草的經驗,因為水族箱比較大的關係,這個難多了,比較難控制。

一個早上的成果,我連吃不完的地瓜都拿去種了 ;)
老實說,這種別人在上班,我卻在外面蹓達又有錢領的感覺比大家都放假的感覺還開心。
很快買好東西後,就開始我的園藝樂,不知道有多少人聽過倒地鈴這植物,我在台北的山區晃了幾次沒看過,中南部很常見,所以趁著回南部掃墓順便摘了幾株,準備種在窗台邊希望能移植成功。
我覺得最好玩的地方在於它的種子,成熟的種子是黑色,中間會有一個白色的小愛心,很特別,就像小孩子收集星砂送給喜歡的人,有人也會收集種子,裝在小玻璃瓶裡當作禮物 ;)
因為瓶罐蟋蟀一書,特地買了幾個玻璃瓶回來建立自己的瓶中世界,植物就從老姐送的銅錢草移植過去,至於將蟋蟀養在瓶子裡就不必了 ;)
就像在水族箱種水草一樣,會有分前景、中景及後景,根據植物的高低來種植,使用箝子可以幫助更容易的將植物植入,以之前種水草的經驗,因為水族箱比較大的關係,這個難多了,比較難控制。
一個早上的成果,我連吃不完的地瓜都拿去種了 ;)
Complex C Declarations
因為 olv 丟了一個複雜的 C 語言宣告給我:
The "right-left" rule is a completely regular rule for deciphering C declarations. It can also be useful in creating them.
First, symbols. Read
* -- as "pointer to" ----------- always on the left side --- 指標, 指向...
[ ] - as "array of" -------------- always on the right side - 陣列, 其陣列元素為...
( ) - as "function returning" - always on the right side - 函式, 回傳值為...
as you encounter them in the declaration.
利用 "right-left rule" 可以幫助我們正確地解讀 C 語言的宣告,不論是多麼複雜,即便是不合法的宣告。在解讀的過程中,若是遇到了上述表格裡的 * [ ] ( ) 符號,則將它們視為其後相對應的解釋。
STEP 1
------
Find the identifier. This is your starting point. Then say to yourself, "identifier is." You've started your declaration.
步驟一、先把識別子(變數名或函式名稱)找出來,這時候你可以說:xxx 是一個 ...,例如 int *p[ ]
識別子是 p,翻成「p 是一個...」
STEP 2
------
Look at the symbols on the right of the identifier. If, say, you find "( )" there, then you know that this is the declaration for a function. So you would then have "identifier is function returning". Or if you found a "[ ]" there, you would say "identifier is array of". Continue right until you run out of symbols *OR* hit a *right* parenthesis ")". (If you hit a left parenthesis, that's the beginning of a ( ) symbol, even if there
is stuff in between the parentheses. More on that below.)
步驟二、檢查識別子右邊出現的符號,如果有的話,例如看到 [ ] 我們可以說「xxx 是一個陣列,它的陣列元素是 ...」,若是看到 ( ) 則翻成「xxx 是一個函式,回傳值是 ...」,接著繼續地往識別子的右邊尋找其他符號,直到識別子右邊已經沒有符號或是遇到了 ")",跳到步驟三。
int *p[ ],往識別子 p 右邊遇到了符號 [ ],右邊也沒有其他符號,翻成「p 是一個陣列,其陣列元素是...」
另外,如果遇到的是 [N],也就是帶有陣列大小的陣列宣告,我們可以這樣翻「 xxx 是一個大小為 N 的陣列,它的陣列元素是...」,若是遇到的是 (yyy),我們可以翻成「xxx 是一個參數為 yyy 的函式,其回傳值為...」
STEP 3
------
Look at the symbols to the left of the identifier. If it is not one of our symbols above (say, something like "int"), just say it. Otherwise, translate it into English using that table above. Keep going left until you run out of symbols *OR* hit a *left* parenthesis "(".
步驟三、檢查識別子左邊的符號,如果出現的是 * [ ] ( ) 就照表翻譯,若出現的並不屬於上述的符號,那麼看到甚麼就說甚麼,不需要額外的翻譯,例如看到 int 就直接翻成 int,繼續地往識別子的左邊尋找,直到識別子左邊已經沒有其他符號或是遇到了 "(",接著回到步驟二(若是識別子左右兩邊已經沒有其他符號)
int *p[ ],往識別子左邊先找到了 *,所以翻成「p 是一個陣列,其陣列元素是指標,指向...」,繼續往左邊看,遇到了 int,由於識別子左右兩邊都沒有符號了,所以完整的解讀是「p 是一個陣列,其陣列元素是指標,指向 int」
「p 是一個陣列,其陣列元素是指向 int 的指標」
Now repeat steps 2 and 3 until you've formed your declaration.
重複地套用步驟二、三,直到完成整個宣告的解讀。
我相信剛接觸 C 語言的人很難分辨上述的 int *p[ ] 與 int (*p)[10] 的差別,試著套用 ”right-left-rule” 解讀:
1. int (*p)[10],識別子是 p,翻成「p 是一個」
2. 往p 的右邊看到的符號是 ”)”,根據步驟二的說明,我們跳到步驟三檢查識別子 p 的左邊
3. 往 p 的左邊看到的符號是 ”*”,翻成「p 是一個指標,指向...」
4. 繼續往 p 的左邊檢查,遇到的符號是 ”(”,根據步驟三的說明,我們回到步驟二檢查識別子 p 右邊的其他符號
5. 繼續往 p 右邊我們遇到了 [10],翻成「p 是一個指標,指向大小為10的陣列,其陣列元素是...」
6. 繼續往 p 右邊檢查,已經沒有其他符號了,根據步驟二的說明,接著繼續講查識別子 p 左邊的符號
7. 接著往 p 左邊我們遇到了 int,因為不屬於 * [ ] ( ) 中的一個,所以翻成「p 是一個指標,指向大小為10的陣列,其陣列元素是 int」
8. 識別子左右兩邊已經沒有符號,結束
知道了 p 的宣告,在寫程式的時候,就可以避免 assign 錯誤型態的變數給它的錯誤
回頭看 void (*glXGetProcAddressARB(const GLubyte *procName))( void ),套用 ”right-left-rule”:
1. 先把識別子找出來, glXGetProcAddressARB 是識別子,翻成「glXGetProcAddressARB 是一個」
2. 往識別子右邊看到的符號是 (const GLubyte *procName),翻成「glXGetProcAddressARB 是一個參數為 const GLubyte *procName 的函式,其回傳值為...」
3. 再往右邊看下去,我們遇到了 ”)”,根據步驟二的說明,我們跳到步驟三
4. 往識別子的左邊看到的符號是 ”*”,翻成「glXGetProcAddressARB 是一個參數為 const GLubyte *procName 的函式,其回傳值為指標,指向...」
5. 繼續往左邊看,我們遇到了符號 ”(“,根據步驟三,我們跳回步驟二
6. 回到步驟二,我們繼續往識別子右邊找其他的符號,這時出現的是 “( void )”,所以翻成「glXGetProcAddressARB 是一個參數為 const GLubyte *procName 的函式,其回傳值為指標,指向一個參數為 void的函式,其回傳值為...」
7. 再往右邊找,已經沒有任何符號,跳到步驟三
8. 往左邊找到了 void,直接翻,「glXGetProcAddressARB 是一個參數為 const GLubyte *procName 的函式,其回傳值為指標,指向一個參數為 void的函式,其回傳值為 void」
9. 識別子左右兩邊已經沒有符號了,完成
「glXGetProcAddressARB 是一個參數為 const GLubyte *procName 的函式,其回傳值為指標,指向一個參數為 void的函式,其回傳值為 void」再稍微修飾一下,改成「glXGetProcAddressARB 是一個參數為 const GLubyte *procName 的函式,其回傳值為函式指標,指向一個參數為 void的函式,其回傳值為 void」
void (*glXGetProcAddressARB(const GLubyte *procName))( void )勾起學生時代的回憶,所以把這篇 1991 年出現在 comp.lang.c 的文章挖出來,這裡可以下載完整的內容。
The "right-left" rule is a completely regular rule for deciphering C declarations. It can also be useful in creating them.
First, symbols. Read
* -- as "pointer to" ----------- always on the left side --- 指標, 指向...
[ ] - as "array of" -------------- always on the right side - 陣列, 其陣列元素為...
( ) - as "function returning" - always on the right side - 函式, 回傳值為...
as you encounter them in the declaration.
利用 "right-left rule" 可以幫助我們正確地解讀 C 語言的宣告,不論是多麼複雜,即便是不合法的宣告。在解讀的過程中,若是遇到了上述表格裡的 * [ ] ( ) 符號,則將它們視為其後相對應的解釋。
STEP 1
------
Find the identifier. This is your starting point. Then say to yourself, "identifier is." You've started your declaration.
步驟一、先把識別子(變數名或函式名稱)找出來,這時候你可以說:xxx 是一個 ...,例如 int *p[ ]
識別子是 p,翻成「p 是一個...」
STEP 2
------
Look at the symbols on the right of the identifier. If, say, you find "( )" there, then you know that this is the declaration for a function. So you would then have "identifier is function returning". Or if you found a "[ ]" there, you would say "identifier is array of". Continue right until you run out of symbols *OR* hit a *right* parenthesis ")". (If you hit a left parenthesis, that's the beginning of a ( ) symbol, even if there
is stuff in between the parentheses. More on that below.)
步驟二、檢查識別子右邊出現的符號,如果有的話,例如看到 [ ] 我們可以說「xxx 是一個陣列,它的陣列元素是 ...」,若是看到 ( ) 則翻成「xxx 是一個函式,回傳值是 ...」,接著繼續地往識別子的右邊尋找其他符號,直到識別子右邊已經沒有符號或是遇到了 ")",跳到步驟三。
int *p[ ],往識別子 p 右邊遇到了符號 [ ],右邊也沒有其他符號,翻成「p 是一個陣列,其陣列元素是...」
另外,如果遇到的是 [N],也就是帶有陣列大小的陣列宣告,我們可以這樣翻「 xxx 是一個大小為 N 的陣列,它的陣列元素是...」,若是遇到的是 (yyy),我們可以翻成「xxx 是一個參數為 yyy 的函式,其回傳值為...」
STEP 3
------
Look at the symbols to the left of the identifier. If it is not one of our symbols above (say, something like "int"), just say it. Otherwise, translate it into English using that table above. Keep going left until you run out of symbols *OR* hit a *left* parenthesis "(".
步驟三、檢查識別子左邊的符號,如果出現的是 * [ ] ( ) 就照表翻譯,若出現的並不屬於上述的符號,那麼看到甚麼就說甚麼,不需要額外的翻譯,例如看到 int 就直接翻成 int,繼續地往識別子的左邊尋找,直到識別子左邊已經沒有其他符號或是遇到了 "(",接著回到步驟二(若是識別子左右兩邊已經沒有其他符號)
int *p[ ],往識別子左邊先找到了 *,所以翻成「p 是一個陣列,其陣列元素是指標,指向...」,繼續往左邊看,遇到了 int,由於識別子左右兩邊都沒有符號了,所以完整的解讀是「p 是一個陣列,其陣列元素是指標,指向 int」
「p 是一個陣列,其陣列元素是指向 int 的指標」
Now repeat steps 2 and 3 until you've formed your declaration.
重複地套用步驟二、三,直到完成整個宣告的解讀。
我相信剛接觸 C 語言的人很難分辨上述的 int *p[ ] 與 int (*p)[10] 的差別,試著套用 ”right-left-rule” 解讀:
1. int (*p)[10],識別子是 p,翻成「p 是一個」
2. 往p 的右邊看到的符號是 ”)”,根據步驟二的說明,我們跳到步驟三檢查識別子 p 的左邊
3. 往 p 的左邊看到的符號是 ”*”,翻成「p 是一個指標,指向...」
4. 繼續往 p 的左邊檢查,遇到的符號是 ”(”,根據步驟三的說明,我們回到步驟二檢查識別子 p 右邊的其他符號
5. 繼續往 p 右邊我們遇到了 [10],翻成「p 是一個指標,指向大小為10的陣列,其陣列元素是...」
6. 繼續往 p 右邊檢查,已經沒有其他符號了,根據步驟二的說明,接著繼續講查識別子 p 左邊的符號
7. 接著往 p 左邊我們遇到了 int,因為不屬於 * [ ] ( ) 中的一個,所以翻成「p 是一個指標,指向大小為10的陣列,其陣列元素是 int」
8. 識別子左右兩邊已經沒有符號,結束
知道了 p 的宣告,在寫程式的時候,就可以避免 assign 錯誤型態的變數給它的錯誤
int main(void) {
int array[10];
int (*p)[10] = &array;
array[2] = 111;
(*p)[2] = 222;
printf("%d\n", array[2]);
return 0;
}
回頭看 void (*glXGetProcAddressARB(const GLubyte *procName))( void ),套用 ”right-left-rule”:
1. 先把識別子找出來, glXGetProcAddressARB 是識別子,翻成「glXGetProcAddressARB 是一個」
2. 往識別子右邊看到的符號是 (const GLubyte *procName),翻成「glXGetProcAddressARB 是一個參數為 const GLubyte *procName 的函式,其回傳值為...」
3. 再往右邊看下去,我們遇到了 ”)”,根據步驟二的說明,我們跳到步驟三
4. 往識別子的左邊看到的符號是 ”*”,翻成「glXGetProcAddressARB 是一個參數為 const GLubyte *procName 的函式,其回傳值為指標,指向...」
5. 繼續往左邊看,我們遇到了符號 ”(“,根據步驟三,我們跳回步驟二
6. 回到步驟二,我們繼續往識別子右邊找其他的符號,這時出現的是 “( void )”,所以翻成「glXGetProcAddressARB 是一個參數為 const GLubyte *procName 的函式,其回傳值為指標,指向一個參數為 void的函式,其回傳值為...」
7. 再往右邊找,已經沒有任何符號,跳到步驟三
8. 往左邊找到了 void,直接翻,「glXGetProcAddressARB 是一個參數為 const GLubyte *procName 的函式,其回傳值為指標,指向一個參數為 void的函式,其回傳值為 void」
9. 識別子左右兩邊已經沒有符號了,完成
「glXGetProcAddressARB 是一個參數為 const GLubyte *procName 的函式,其回傳值為指標,指向一個參數為 void的函式,其回傳值為 void」再稍微修飾一下,改成「glXGetProcAddressARB 是一個參數為 const GLubyte *procName 的函式,其回傳值為函式指標,指向一個參數為 void的函式,其回傳值為 void」
void helloworld(void) { return; }
void (*glXGetProcAddressARB(char *procName))( void ) {
return helloworld;
}
int main(void) {
glXGetProcAddressARB("ARB");
return 0;
}
星期二, 3月 31, 2009
石來運轉
石來運轉取其諧音「時來運轉」,因為風水的緣故這類的裝飾品還蠻常見的,今天的故事就發生在我家裡的它。
直徑和深度都比一般的臉盆來的大一些,盆子本身是用整顆石頭下去挖空的,加上那顆不停轉動的石球及球下的底座(石頭做的),在沒有裝水時,普通人已經是很難抱得動,更何況是在盆子裝滿水的情況下,要移動它其難度不難想像。

它的位置就擺放在家裡的一角,安放在桌子上,桌子約莫 100 公分高

某天老爹晚上打電話找我閒聊,告訴我家裡發生一件詭異的事情,吃完晚餐,他們從外面散步回家後,發現地上忽然出現一大攤水,才看到整個石盆裡的水倒的乾乾淨淨的,乾淨到放個十元硬幣進去,剩下的水都沒有辦法淹過硬幣。
我們開始聊可能的原因:
「石盆會不會有破洞?」「本來也這樣想阿,可是重新裝水進去後,也沒有看到漏的地方阿」(台)
「會不會是地震還是家裡的狗撞到桌子?」「水也不會漏的這麼乾淨」(台)
「小偷?」「嘿阿,但是家裡都檢查過了,也沒有東西不見阿」(台)
想不到甚麼合理的解釋,這個話題就這樣結束了
接著,再和我老媽接上電話,聊到這件事,才知道原本我老爹在石盆裡還有放一顆一顆的佛珠(大顆的那種木製佛珠),因為放在水裏面已經有一段時間,表面都發霉了,所以我爸在出門前就先把所有的佛珠從水裡撿起來丟到垃圾桶裡了...
最後再打電話給我爸,聊到佛珠的事情,問他後續的動作
「就再從垃圾桶撿起來,一顆一顆的洗乾淨再放回去」(笑)
現在,它還是待在原來的位置上,石頭繼續不停的轉阿轉,裏面的水也再沒有少過 ;)
直徑和深度都比一般的臉盆來的大一些,盆子本身是用整顆石頭下去挖空的,加上那顆不停轉動的石球及球下的底座(石頭做的),在沒有裝水時,普通人已經是很難抱得動,更何況是在盆子裝滿水的情況下,要移動它其難度不難想像。
它的位置就擺放在家裡的一角,安放在桌子上,桌子約莫 100 公分高
某天老爹晚上打電話找我閒聊,告訴我家裡發生一件詭異的事情,吃完晚餐,他們從外面散步回家後,發現地上忽然出現一大攤水,才看到整個石盆裡的水倒的乾乾淨淨的,乾淨到放個十元硬幣進去,剩下的水都沒有辦法淹過硬幣。
我們開始聊可能的原因:
「石盆會不會有破洞?」「本來也這樣想阿,可是重新裝水進去後,也沒有看到漏的地方阿」(台)
「會不會是地震還是家裡的狗撞到桌子?」「水也不會漏的這麼乾淨」(台)
「小偷?」「嘿阿,但是家裡都檢查過了,也沒有東西不見阿」(台)
想不到甚麼合理的解釋,這個話題就這樣結束了
接著,再和我老媽接上電話,聊到這件事,才知道原本我老爹在石盆裡還有放一顆一顆的佛珠(大顆的那種木製佛珠),因為放在水裏面已經有一段時間,表面都發霉了,所以我爸在出門前就先把所有的佛珠從水裡撿起來丟到垃圾桶裡了...
最後再打電話給我爸,聊到佛珠的事情,問他後續的動作
「就再從垃圾桶撿起來,一顆一顆的洗乾淨再放回去」(笑)
現在,它還是待在原來的位置上,石頭繼續不停的轉阿轉,裏面的水也再沒有少過 ;)
Prex + GTA02 (Cont.)
有兩個 Device Driver 對移植 Prex 是很重要的,分別是 Clock(Timer) 及 Serial(Uart)。
Kernel 負責的工作項目之一就是排程,而 Timer 對於排程則是一個很重要的依據,提到了 Timer 就不得不去面對中斷 (Interrupt) 的處理,Prex 用了一個很簡單的機制及資料結構使其支援 Nested Interrupt 同時利用軟體實作 Interrupt Priority.
而沒有 Serial Driver 就無法和 Prex 有最基本的互動,在 Booting 後,透過 Serial 我們可以在Prompt 下執行命令,這樣才好玩不是嗎。下載完整的 Booting log 及 Image,所有的 Patch 檔和文件會在隨後附上。


另外,對於較 Low Level 的程式的 Trace + Debug,我向來只有使用 JTAG 搭配 Objdump,利用這個方法,我們可以把 Bootloader 及 Kernel 之類的程式很輕鬆也很完整的 Trace (可設中斷點),從 Device Power On 之後系統的每個動作到進入 Kernel 後的一些行為,都會清清楚楚的呈現在面前 ;)
Kernel 負責的工作項目之一就是排程,而 Timer 對於排程則是一個很重要的依據,提到了 Timer 就不得不去面對中斷 (Interrupt) 的處理,Prex 用了一個很簡單的機制及資料結構使其支援 Nested Interrupt 同時利用軟體實作 Interrupt Priority.
而沒有 Serial Driver 就無法和 Prex 有最基本的互動,在 Booting 後,透過 Serial 我們可以在Prompt 下執行命令,這樣才好玩不是嗎。下載完整的 Booting log 及 Image,所有的 Patch 檔和文件會在隨後附上。


另外,對於較 Low Level 的程式的 Trace + Debug,我向來只有使用 JTAG 搭配 Objdump,利用這個方法,我們可以把 Bootloader 及 Kernel 之類的程式很輕鬆也很完整的 Trace (可設中斷點),從 Device Power On 之後系統的每個動作到進入 Kernel 後的一些行為,都會清清楚楚的呈現在面前 ;)
星期日, 3月 22, 2009
Sweet Rain
人生不在於生命的長短,而是在於是否已經活出自己的價值,完成此行目的,而沒有遺憾。
「不過小美才十歲阿」
「目的已經達到,跟壽命長短無關」
如果真能像電影 - 死神的精準度裡一般,死神們會降落凡間化身為人,融入屬於我們自己的故事裡,藉此去判斷一個人從出生到現在的人生內容,再決定執行死亡與否。

就像故事裡的藤木一惠,個性悲觀,周遭所有愛她的人都離她而去,投擲銅板出現的永遠是否定的那一面,不止一次有過死亡的念頭,似乎從來就不曾真正活過,卻在故事的最後被音樂製作人發掘,受人肯定,她的人生是從那一刻才開始,也因此判定的結果是...
不過,電影終歸是電影,事實上,每分每秒在你張口呼吸的當下,遺憾,就在世界各地不斷地發生,沒有人可以給我們第二次的機會,你唯一可以作的就是去行,把握自己的每一刻,不要讓自己在最後一刻後悔抱憾,意外之所以稱之為意外,因為你無法知道它何時發生。我情願承受作卻失敗的痛苦,也不願活在後悔當初為何不的深淵中。
「我已經毫無遺憾,隨時都能死去」
在電影後段出現的一些台詞,所描述的也是我所追求的一種關係,很多場合應該用的到 ;)
「不過小美才十歲阿」
「目的已經達到,跟壽命長短無關」
如果真能像電影 - 死神的精準度裡一般,死神們會降落凡間化身為人,融入屬於我們自己的故事裡,藉此去判斷一個人從出生到現在的人生內容,再決定執行死亡與否。

就像故事裡的藤木一惠,個性悲觀,周遭所有愛她的人都離她而去,投擲銅板出現的永遠是否定的那一面,不止一次有過死亡的念頭,似乎從來就不曾真正活過,卻在故事的最後被音樂製作人發掘,受人肯定,她的人生是從那一刻才開始,也因此判定的結果是...
不過,電影終歸是電影,事實上,每分每秒在你張口呼吸的當下,遺憾,就在世界各地不斷地發生,沒有人可以給我們第二次的機會,你唯一可以作的就是去行,把握自己的每一刻,不要讓自己在最後一刻後悔抱憾,意外之所以稱之為意外,因為你無法知道它何時發生。我情願承受作卻失敗的痛苦,也不願活在後悔當初為何不的深淵中。
「我已經毫無遺憾,隨時都能死去」
在電影後段出現的一些台詞,所描述的也是我所追求的一種關係,很多場合應該用的到 ;)
星期三, 3月 18, 2009
Prex + GTA02
Prex - An Open Source, Royalty-free, Real-time Operating System.
關於 Prex 的介紹,網頁已經有詳細的說明,最吸引我的地方是 - "Written in ANSI C based" "microkernel architecture" "POSIX emulation layer"
週末利用一些時間嘗試將它移植到 GTA02(S3C2442) 上,Prex 自附的 bootldr 已經可以將 kernel 載入並執行,雖說如此,現在的進度仍是落後,還有許多的 device driver 尚待完成,可以在 Download 裡找到相關的資料檔案,包含 kernel image 及 patch,剩下的會再放上,希望能有越來越多的人一起學習,彼此分享 ;)
關於 Prex 的介紹,網頁已經有詳細的說明,最吸引我的地方是 - "Written in ANSI C based" "microkernel architecture" "POSIX emulation layer"
週末利用一些時間嘗試將它移植到 GTA02(S3C2442) 上,Prex 自附的 bootldr 已經可以將 kernel 載入並執行,雖說如此,現在的進度仍是落後,還有許多的 device driver 尚待完成,可以在 Download 裡找到相關的資料檔案,包含 kernel image 及 patch,剩下的會再放上,希望能有越來越多的人一起學習,彼此分享 ;)
訂閱:
文章 (Atom)
