2009年10月21日 星期三

幾個好用的線上訂房網站

expedia-->全美最大。
priceline-->有個好玩的功能是可以自己去競標旅館。
hotwire-->用匿名的方式去預約旅館,一直到最後一刻才會知道你住的是哪一間,不過如果熟門熟路的已經知道那附近有哪些旅館的話,幾乎可以百發百中。

每一個網站的價格可能稍有不同,多多比較囉。

至於租車的話可以從這裡
http://www.4travelcoupons.com/car-rentals.html
裡面有各大租車公司的coupon

2009年10月6日 星期二

ARM BL instruction

syntax:
   bl function_A;
簡單說就是把下一個要執行的位置(i.e. the return address),
存到LR(r13)之後,
把function_A的位置,
存到PC中。
這樣就會跳到callee function
然後把return address存給caller function。

2009年10月3日 星期六

Businuss trip in San Diego

莫名的就來到了聖地牙哥,
大概是上禮拜三吧,

"你有美簽嗎?"
"有阿" 我說
"那麻煩你下禮拜一去一趟QualComm"
"....."

總之禮拜一的晚上我就到了QualComm在聖地牙哥的總部了。

這次是我第一次來美國出差有租車的經驗
之前都是做人家便車的,

公司規定只能租economic和compact兩種車型,
雖然說我也搞不太清楚有什麼差異
特別跟櫃台強調了要一台日本車
結果他給了我一台 Nissan Versa

我只能說車子還滿可愛的
感覺也還滿好開的
只是不太穩

感忙著去租車是因為周末有一個同事要來
所以要去接機
這個我必須要抱怨一下
為什麼不一起來就好了呢??

為了他我還特地繞了一下機場
看要怎嚜過去
探路ㄟ
又不是大學參加社團@@

下午想去逛個mall的
只是好累我就睡著了@@
不過可能也還好
因為發現要去的那個交流道車好多
大家都忙裡偷閒去買東西就對了

明天再看看吧

2009年9月29日 星期二

防止資料被初始化 in ARM environment

有的時候,資料並不想被初始化,這時候我們需要特別的指定section。在code裡面我們可以用
#pragma arm section zidata = "non_init"
int i, j;    //uninit (in non_init section)
#pragma arm section zidata   //back to default (.bss section)
int k=0, l=0;  //zero-init (in .bss section)
這樣我們就會有一個自己的section名子叫做non_init。之後在execution region中我們可以把它指定成UNINIT,好比說

LOAD_1 0x0{

EXEC_1 +0


{



* (+RO)


* (+RW)


* (+ZI) ;ZI data will be initialized to zero



}



EXEC_2 +0 UNINIT


{



* (non_init) ;ZI data will not be initialized to zero



}



}

這樣我們的i和j就不會就算不給值也不會被初始成0了。

ARM assembly 範例 and 解說

   AREA ARMex, CODE, READONLY ;Name this block of code ARMex
   ENTRY ;Mark first instruction to execute
start
   MOV r0, #10 ; Set up parameters
   MOV r1, #3
   ADD r0, r0, r1 ; r0 = r0 + r1
stop
   MOV r0, #0x18 ; angel_SWIreason_ReportException
   LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit
   SVC #0x123456 ; ARM semihosting (formerly SWI)
END ; Mark end of file

我們可以發現第一行就指定了這個section的名子,叫做ARMex。第一個AREA的意思是表示一個section
的開始,除了明子以外,還會設定這個section的屬性。名子基本上可以隨便取,可是如果不是英文字母開頭的話,就要用兩個bar把它包起來,好比說|1_DataArea|。不然的話會有AREA name missing的錯誤。


ENTRY跟AREA一樣,都是directive,顧名思義是說明一個section的開始,後面的END相對應的就是說明一個section的結束。

start和stop都是function的label。

如果是在C code裡面的話
就是 #pragma arm section [code、rwdata、rodata、zidata] = "label"

ARM assembler online reference

you can find a quick reference online through the following link

http://www.keil.com/support/man/docs/armasm/

2009年8月31日 星期一

有人離職了

一位同事離職了,其實嚴格說來是我的長官。跟他平常並沒有機會交談,一直到很後來才偶然的有機會跟他聊天。 其實,他還滿有想法的,平常也有閱讀的習慣。

這真的很難得,在上班之後還能在閒暇之虞讀點閒書。因為我認識的大部分的上班族回家之後都是發呆或躺平的。

其實想說明的是,有跟他討論到一些他正在閱讀的書,以後有時間也要去買來看。1. 雪球 2. 一個投機者的告白 3. 黑天鵝效應 4. 投資金律

2009年8月5日 星期三

Android radio interface layer

    其實Android很奇怪,明明是linux系統,ap卻偏偏要跑java。也因此,硬要多一層java與底層api間的橋樑,作為轉化劑,其中的目的就是透過android制定好的api去執行不同解決方案的modem。也因此多了很多麻煩。當然也是有他的好處,就是既然介面都訂好了,剩下的就是去配合不同的方案而產生不同的程式碼。

    底下是一張google自己的投影片,搜尋anatomy-google-io就找的到了。

    可以看到jave跟底層的溝通是透過socket和中間一個叫做rild的daemon program,這個daemon到也沒做什麼事情,只是init自己的event thread,這裡的event就是指每個socket listen到的結果,就是用select()去聽socket,有結果就做對應的事情。說穿了也就是收jave來的request和要送給java的request result。然後呢,他會去load oem的radio library並且做library的init,除了初始library的狀態之外,還會得到一組library必須提供的call back function的address然後利用這組call back functino跟library溝通。定義了五支call back。ex: onRequest(); onRequestComplete()之類的。

    如果是我,在這樣的情形之下,我會怎麼設計我的radio library呢?首先一定是來兩個queue,伴隨著相對應的兩支worker thread,一個處理daemon送來的request,然後往下送,另一個則相反,處理底層來的事件然後回送給daemon。這樣雖然複雜,但是萬無一失,屬於標準設計,library自我隔離於外界,專心於處理本份之上。

    所以每個onRequest()都會把資料put到library中處理request的queue然後給library的thread去按照順序楚哩。因為有了queue所以每個request會是mutual exclusive,因為我們可以等該request處理完畢之後,才去處理下一個。這樣也模擬了android原本對底層telephony的精神,也就是at command,而at command是mutual exclusive的。
    否則的話,如果有某個request的執行必須依賴之前的request的執行的結果的話,會有可能的錯誤發生,好比說在end call之後來一個switch call,那這個switch的request要不要被執行呢??
    而這,就會是推託爭執與各說各話的起點了。
    讓我想到夫妻與男女朋友的相處之道。