2010年12月5日 星期日
2010年11月28日 星期日
2010年11月21日 星期日
2010年11月18日 星期四
2010年11月11日 星期四
2010年11月3日 星期三
2010年11月1日 星期一
2010年10月11日 星期一
2010年10月6日 星期三
2010年10月5日 星期二
2010年10月2日 星期六
2010年10月1日 星期五
2010年9月22日 星期三
2010年9月19日 星期日
2010年9月16日 星期四
2010年9月11日 星期六
2010年9月8日 星期三
Issue of adb vendor id
2010年8月29日 星期日
2010年8月25日 星期三
2010年8月22日 星期日
2010年8月16日 星期一
有關init ramdisk 機制的相關文章
http://www.ibm.com/developerworks/cn/linux/l-k26initrd/
Linux initial RAM disk (initrd) overview http://www.ibm.com/developerworks/linux/library/l-initrd.html
Inside the Linux boot process http://www.ibm.com/developerworks/linux/library/l-linuxboot/
Initramfs arrives [LWN.net]
http://lwn.net/Articles/14776/
2010年7月23日 星期五
Git 教學文件
2. Git User's Manual: http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#how-to-check-out
3. Google developer Guide : http://source.android.com/source/git-repo.html
2010年7月21日 星期三
2010年7月17日 星期六
2010年7月10日 星期六
2010年7月9日 星期五
2010年7月6日 星期二
2010年7月4日 星期日
2010年7月1日 星期四
2010年6月30日 星期三
Multi Media Card (MMC) System 研讀
2. MMC 系統可以分為 multi media card 與 multi media card controller 兩個部份。
3. muti media card controller 又可以分做: application adapter 與 muti media card adapter。
4.
2010年6月27日 星期日
2010年6月26日 星期六
2010年6月22日 星期二
2010年6月21日 星期一
2010年6月20日 星期日
2010年6月18日 星期五
2010年6月17日 星期四
2010年6月14日 星期一
Topics releated to eMMC
2. http://comments.gmane.org/gmane.linux.kernel.mmc/1424
3. Desire HD 內部emmc 的分割區:
http://blog.chinaunix.net/space.php?uid=20543672&do=blog&cuid=2481187
4. Understanding eMMC User Capacity:
http://tjworld.net/wiki/Android/HTC/EMMC/UnderstandingUserCapacity
5. eMMC Partitioning:
http://tjworld.net/wiki/Android/HTC/Vision/EmmcPartitioning#DesireZPartitionTableChain
2010年6月12日 星期六
Reboot Linux faster using kexec
2. from 紅塵萬丈: http://tw.myblog.yahoo.com/jw!tzeXibOaEQUcL.ja6fRpXFg-/article?mid=136&prev=168&l=f&fid=12
3. kboot 正式網站: http://kboot.sourceforge.net/index.html
4. from orzlab : http://orzlab.blogspot.com/2007/06/kboot.html
2010年6月11日 星期五
2010年6月10日 星期四
2010年6月8日 星期二
adb error: insufficient permission for device
1 su <- 進入root權限
2 cd android-sdk-x86linux/tools
3 ./adb kill-server
4 ./adb start
5 ./adb devices
6 exit
7 adb shell <-即可登入
2010年6月5日 星期六
2010年6月2日 星期三
2010年6月1日 星期二
2010年5月31日 星期一
2010年5月26日 星期三
Linux Device Driver Review
2. open system call 的主要用途在於初始化硬體。
3. struct file 為kernel提供出來給driver function使用,只能在kernel mode 下使用。
4. 設計driver的第一件事情是設計 file operation,user program 開啟裝置檔 -> VFS透過major # 開啟相映的裝置檔->user program 呼叫driver提供的system call。
5. kernel 會將struct file allocate 到 一個stack中,所有的kernel module 都可以存取得到。
6. read driver code 的技巧是 先了解一個區塊的code其功用,再去深入了解API等detail部分,千萬別直接深入細節部分。
7. 使用到 copy_to_user 、 copy_from_user、kmalloc 等API之函數(ex: open 、read 、write...)必須是可重覆進入函數。
8. running 狀態下的 user space process 將時間用完之後,會被重新放回至ready queue。
9. 依照硬體特性決定使用kernel timer 或 interrupt handler 。
10. sleep 中的process 在wake up 之後會先進入ready queue,並不會馬上進入執行。
11. sysfs 的概念在2.6才引進嗎? 是否改變了driver的架構。
12. make uImage 時會在kernel folder下 include/config/產生auto.conf在 kernel folder 下 include/linux/產生 autoconf.h 。
13. bash shell 將stdin --> 0 stdout --> 1 stderr --> 2 , 因此當fd = fopen(), 後fd會有3種value的可能。
2010年5月25日 星期二
幾個討論Bootloader的文章
2. 崁入式系統 Bootloader 內幕: http://www.ibm.com/developerworks/cn/linux/l-btloader/
3. U-Boot : http://www.denx.de/wiki/U-Boot
2010年5月24日 星期一
2010年5月22日 星期六
2010年5月21日 星期五
2010年5月20日 星期四
2010年5月19日 星期三
什麼是firmware?
原文連結: http://www.eettaiwan.com/SEARCH/ART/firmware.HTM
中文Wiki : http://zh.wikipedia.org/zh-tw/Firmware
英文Wiki: http://en.wikipedia.org/wiki/Firmware
Bootchart
2. 砍掉重練的Bootchart: http://fred-zone.blogspot.com/2008/07/bootchart.html
2010年5月18日 星期二
2010年5月17日 星期一
2010年5月14日 星期五
2010年5月13日 星期四
2010年5月11日 星期二
2010年5月8日 星期六
2010年5月7日 星期五
ctags 教學網頁
2. 听峰's Blog: http://blog.verycd.com/yoyopub/cat=4095
3. 史丹利's Blog: http://stenlyho.blogspot.com/2010/03/vim-trinity-source-explorer-tag-list.html
4. 原文教學: http://cscope.sourceforge.net/large_projects.html
5. cscope 教學: http://vimcdoc.sourceforge.net/doc/if_cscop.html#:scscope
6. 快速setup ctags 與 cscope: link.
2010年5月6日 星期四
2010年5月5日 星期三
2010年5月4日 星期二
2010年5月3日 星期一
2010年5月2日 星期日
2010年5月1日 星期六
2010年4月29日 星期四
2010年4月28日 星期三
2010年4月27日 星期二
2010年4月26日 星期一
2010年4月23日 星期五
Android Device Driver and framework implementation
2. 抽象類別將所有複雜的溝通細節處理掉,使得ap的class撰寫變的單純許多。
3.母類別會有預設函數的實作,若子類別打算overrided該預設函數則當外部呼叫到該函數會優先呼叫子類別的實作的預設函數。
4. 在JMain類別中: Employee linda = new SalesSecretary("Linda Fan","Female")
5. EX3_01中的Person類別為一個抽象類別(Display()內容從缺),相較之下Employee為一個具體類別,可以用來new出新的物件。
6. 4月26日從高老師第一本書第3章開始學習,第3章的內容可以先保留到熟悉android程式設計架構後再來review。
7. public abstract class Shape implement IGraph{ ... } 代表什麼意義?
8. 4月27日由4.2節開始研讀。
9. OnClickListener listener = new OnClickListener() { public void onClick(){...}},為實作listener物件的OnClick 方法。
10. 4月28日由4.5節開始研讀。
11. 編譯kernel時,DMATEK LCD 480X272 FOR ET043002DH6 ---45pin/40pin 是否有差異?
12. Android系統燒寫過程: (1)燒寫u-boot (2)燒寫kernel (3)燒寫Android 檔案系統 (ramdisk-uboot.img、system.img、userdata.img)
13. 4月30日高老師的教材(Android編程36計)研讀先停在第四章。
14. android user space process 發現硬體not ready時,framework會去polling硬體,若硬體持續在not ready狀態下時,會將執行權交給其他的process,應此當實做不符合framework架構的process(使用blocking I/O)會讓framework狀況出現異常。
15. 每個AP均為一個物件對kernel而言為一個thread與一般standalone的AP為獨立的Process有所不同(猜測)。
16. 在android driver實作上,須減少使用system call而要多使用 sysfs 或 proc來存取driver (announces by Google)
17. 上層的java應用程式透過JNI與底層.so(c/c++ module)的sharelibrary做溝通。
18. 如何加入driver至android system(錄音檔1 45分)。
19. ../framework/base/core/java/ <= 對應上層java層(包含許多framework的類別),當內建的class無法存取硬體時,可以擴充framework加入新的class進來讓別人來繼承使用。
20. ../framework/basr/core/jni/ <= 對應底層HAL層。
21. HAL Stub的工作往上符合HAL介面,往下去做與driver的溝通工作(open、read、write...)。
22. AP無法直接與Stub溝通,而是需要透過虛擬機,虛擬機往下會接到.so程式庫 => 需要修改jni目錄下的程式碼使so檔能夠與Stub做溝通。
23. android framework把driver整合的非常好 (相對於Qt)。
24. android porting 並非像過去的linux方式,只單純修改kernel即可(因為沒有整合driver與kernel的framework所以只需整理好BSP即可)。
25. android framework整合了特定的driver,去做porting,就不單純只是把kernel與BSP修改好而已,需要再考慮框架本身。
26. Android framework須考量3個層面; (1)driver是否需要用到android features (2)架構端的移植(Dalvik虛擬機負責執行procedure call 1.5Ver之後開始支持x86、armv4、armv5+、mips、coretex) (3)建立產品分支,預設為generic(反映框架只能擴充而不要去修改)。
27. 3份checklist: (1)driver (2)DalvikVM (3)product branch。
28. Porting技術面: (1)API相容(新的API在舊的框架上run) (2)產品分支 (3)框架修改 (4)Kernel的設定。
29. kernel可以分為vanilla與non-vanilla 版本。
30. 鼓勵將自己的driver移出做成patch在整合進vanilla kernel不須浪費時間去mantain自己的kernel。
31. 在Android下ap可以決定哪些部份需要做省電 <= 透過wavelock 提供的API在應用層進行操作。
32. Google提供Binder driver來做IPC的工作。
33. 應用層呼叫getSystemService()來存取硬體,由框架去new一個Service物件(物件的生成由框架負責,減少Ap的大小 <=> Java SE)。
34. 當框架去new一個object時,VM會去產生一個process,例如: 想畫圖,VM會去生成一個Surface的Process去抓到framebuffer的driver,同時框架也會生成一個Surface物件。
35. android share memory並非在兩個process之間換資料,而是
36. Activity(相當於main為ap的進入點)負責畫UI與處理使用者的輸入。
37. android ap 會被包裝成apk檔,執行起來每個apk檔對應一個Process(不管有多個activity)而其中會有activity的thread與Surface的thread,因此交換資料是在同一個apk檔中。
38. logcat 是負責產生訊息給console的driver,SDK Tools adb也可以讀取console 訊息。
39. PMEM為存取硬體的萬用解決方案,可以不必撰寫複雜的driver,只需查詢該硬體的I/O Memory 交由PMEM將所有的I/O Memory mapping到user space,ap只需透過HAL Stub 來存取硬體。
40. 傳統的driver寫作由於沒有PMEM的支持,必須寫很多Memory存取的程式。
41. logger.c是將自己註冊給misc,但misc依然使用了register_chrdev(),logger是間接透過misc與系統做註冊。
42. misc裡面堆放雜項的driver,假若driver不屬於usb、i2c、pci..等既有的類別,將該driver放置於misc中。
43. 分層註冊的目的在於避免數以萬計不同類型的driver向系統註冊。
44. logger.c中的排成機制實作需多研讀其架構。
45. program counter有可能會落在user space 或 kernel space。
46. adb daemon會透過socket讀取logger.c傳送的訊息。
47. 研讀sysfs與linux 2.6 kernel & driver 的關係(平田豐 p.401)。
48. linux kernel 2.6 將ioctl分做 : (1). unlocked_ioctl (2).compat_ioctl。
49. 大部分的embedded system均無swap partition所以沒有swap out 的現象,可以直接存取記憶體位址。
50. sleep_on的作用: (1).把process放置waitqueue節點 (2)將節點放入waitqueue (3)修改process狀態 (4)呼叫排程器。
51. 當宣告wait queue 於私有資料結構時,實作read / write system call遇到blocking狀態時,需自行手動進行排程,而不能呼叫sleep_on()。
52. 先open()再fork()一個child process(),此時兩個process會共用一個struct file 所以必須留意可重複進入的問題,ex: logger.c :190行與209行。
53. logger.c中的mutex與pthread programing中的mutex為相同的東西。
54. 下午2的錄音倒數20分鐘須反覆聆聽以了解當使用者點選icon啟動應用程式,所伴隨框架內部的行為模式!
55. zygote啟動 -> 執行VM -> 註冊 jni Table ->使用者按下icon -> 框架啟動activity -> activity 呼叫getSystemService() 去new xxxManager -> Manager會去new Service -> Service透過jni介面去存取底層的so檔(driver) -> 完成硬體存取的準備工作!
2010年4月22日 星期四
2010年4月21日 星期三
以 GDB 重新學習 C 語言程式設計
2. 快快樂樂學GDB: http://jserv.sayya.org/debugger/
新公司服勤規定by Grace
2. 基本上有周休二日,但須配合客戶的需求,有可能會有周六加班的情況出現!
3. am:9:30超過即算遲到,需超時補回被扣掉的實際工作時數。
4. 11:40 至 12:40 算用餐時間,超過一樣會欠1hr個工時。
5. 視情況於pm:8:00之後在D棟會有免費餐點供應。
2010年4月20日 星期二
2010年4月19日 星期一
2010年4月18日 星期日
DMA-6410L開發平台練習
2. 長高科技教材目錄: http://www.dmatek.com.tw/tn/viewbook.asp?id=52
3. DNS 需設定成中華電信 168.95.1.1 而非202.x.x.x。
4. 編譯核心前須執行 su root
export PATH=$PATH:/root/4.3.1-eabi-armv6/usr/bin-ccaches
5. netcfg eth0 dhcp 必須要能執行,若無法執行,要重新啟動switch的dhcp功能。
6. mokoid_elcair-20100511.tar.bz2 檔案包解開後 make PRODUCT-dma6410xp-eng 可以順利編譯成功。
7. 開機進入u-boot後,如欲使用tftp寫入SDcard與NandFlash時,記得防火牆要先關閉,使用tftpd32時,無線網路可以同時打開。
8. 利用logcat utility 觀察LedTest的行為。
9.透過tcp-ip與target端進行adb 連線的方法與步驟: http://www.dmatek.com.cn/bbs/announce/announce.asp?BoardID=10&id=476 or
10. 使用sd-card開機時須小心插卡,以防止開機失敗(Console 訊息沒有出現)。
11. 須手動 mount SD-card : mount -t vfat /dev/block/mmcblk0p1 /sdcard
12. 遇到s3c-nand: ECC uncorrectable error detected問題: http://hi.baidu.com/leona_leon/blog/item/1031f174a1bf0c16b151b91f.html
13. driver porting for 6410L : http://anemospring.blogspot.com/2010/01/android-cupcakefbnanddm9000ae.html
14. Error generating final archive:Debug certificate expired on Issue: http://liaobingyun.blog.163.com/blog/static/1298121112010620143648/
15. 在6410平台加入alsa sound功能: http://c39600.pixnet.net/blog/post/31135908
16. Vitual Box 設定共享資料夾: http://blog.roodo.com/BlackBox.X/archives/12664165.html
17. 修改led.c 加入MKDEV() 的巨集,建立device node,解決目前底層沒反應的問題。
2010年4月17日 星期六
C and C++ Programing 英文教學網站
2. C Programing : http://www2.its.strath.ac.uk/courses/c/
3. C ++ Language Tutorial: http://www.cplusplus.com/doc/tutorial/
4. C++ Primer中文版: http://www.3dwoo.com/showBookDetail.asp?nb=25140
2010年4月13日 星期二
未來工作選擇項目
2. Linux嵌入式系統軟體工程師: http://www.104.com.tw/jobbank/cust_job/job.cfm?j=6a524a2d4c3e475e393a426b4c6c3e67548784b2f3c7447292929292740592e2d008j97&intro=1&jobsource=checkc&page=1
3. 手機軟韌體研發: http://www.104.com.tw/jobbank/cust_job/job.cfm?j=66784b755e74465e393a426b4c6c3e67548784b2f3c7447292929296c40592e2d008j54&intro=1&jobsource=checkc&page=1
4. SOC/IC 設計工程師: http://www.104.com.tw/jobbank/cust_job/job.cfm?j=6472445c3738406958343d684256391a73a724527272727233f6a342260j52&intro=1&jobsource=checkc&page=1
5. 通訊軟韌體工程師: http://www.104.com.tw/jobbank/cust_job/job.cfm?j=544e46282f3c426b346c3f2344323a219503e472929292926415c362240j52&intro=1&jobsource=checkc&page=1
2010年4月12日 星期一
Linux IPC 程式設計
2. mesaage passing system可以分做:
(1). persistent asynchronous communication
(2). persistent synchroinous communication
(3). transient asyncronous communication
(4). transient synchronous communication
3. transient與 persistent 差別在傳送後的訊息是否保存到接收端接收到才清除為止;persistent 方式會保存資料直到接收端接收到資料為止,transistent則是發現當接收端無法接收資料,自動將資料清除掉。
synchronous communication 也稱做blocking communocation傳送端會等到確定接收端已接收到資料後才會往下執行接下來的task,相對地asynchronous communication則是傳接收端均不特別等待此筆資料的傳送,各自執行預定要執行的task。
4. UDP 通訊屬於 第 (3) 類的通訊方式,因此傳送端只管現在有資料要傳,但不管對方是否確實有收到。
5. 傳送端與接收端必須先建立一個Link,Link可以分做:
(1). direct與 indirect : direct link 必須指定傳送與接收者的名稱。 indirect link 則不須指定名稱,只需透過緩衝區 mailbox / port 來收送資料。
(2). unboundded-buffer 與 boundded-buffer : 緩衝區有無長度限制。
6. IPC 為行程間的通訊,Process依關係可以分為: related process (父母與子女)與 unrelated兩種。
7. Linux IPC技術有: shared memory、Pipes FIFO、sockets、mapped memory。
8. 參考shm_allocate.c 中的share memory實作: 依序4個步驟 allocate => attach => detach => deallocate。
9. ipcs指令可以追蹤目前的IPC狀態。
10. shm_read.c編譯執行後會出現Segmentation Fault狀況! (已解決: 須先執行 shm_allocate)
11. mapped memory 與 shared memory 類似,差別在於mapped mempry是使用share file來進行通訊。
12. mapped memory會將共享檔案所分配到的virtual address 分割為以page size為單位大小的空間,使檔案存取變為記憶體式的存取。
13. 完成mmap之後將原先開啟的fd關閉是由於我們已經可以在記憶體中直接操作檔案了。
14. mmap 中的參數 MAP_SHARED為設計IPC機制必須設定的參數。
15. 當程式呼叫到exit會自動作detach的動作。
16. shmdt()只是將virtual address 與 shared memory對應消除,但allocate出來的share memory扔然存在,需再呼叫shmctl()可以完全清掉share memory區段。
17. mmap_write.c編譯執行後會出現Segmentation Fault 的問題。
18. Pipes為一種單向的通訊方式,用於 (1)Process 產生的Thread間的溝通 (2)Parent 與 child Process的溝通。
19. fdopen()為GNU/Linux提供的function call。
20. pipe.c 中parent 與 child 的fd交換號碼之後會出現Segmentation Fault問題(或許pipe(fd)即將fd[0]初始化為寫入檔案描述子,fd[0]為讀取檔案描述子)。
21. Socket是Process間的雙向IPC通訊介面,又分為Internet Domain Sockets 與 UNIX Domain Sockets。
22. UNIX Domain Socket s又稱為local sockets 用於本地端的Process通訊使用。
23. Internet Domain Socket 則用來與遠端主機的process溝通。
24. 以FTP Server 的例子解釋Socket的使用方式: 在server端先啟動server程式,這個程式會等待並接收client 使用者的連線請求,這個等待的動作稱為Accept。而使用者端則須啟動client 程式做連線初始化與server端連線,此動作稱為connect,也可以說socket通訊機制為一個主從式架構的機制。
25. server.c 實驗卡在server ip addr的設定。
26. Practical TCP/IP Sockets in C : http://cs.baylor.edu/~donahoo/practical/CSockets/
27. server端的socket初始化:
28. 思考server端在執行到listen()時系統的行為狀態為何? 是在背後執行的狀態?
2010年4月11日 星期日
Linux Network Device Driver
2. network device 不一定等於網路卡裝置。
3. network subsystem提供TCP/IP Stack給device 使用。
4. TCP/IP 的實作分為4層: BSD Socket 、 inet Sockeet 、TCP、IP,凡透過這條路徑傳遞Data均符合network device的定義。
5. 奇怪的應用: lcd panel 改走tcp/ip傳輸,遠端主機將data丟至lcd panel所對應的ip addr就會在lcd panel上顯示圖片。
6. 學習如何使用API在User application來利用TCP/IP傳輸資料。
7. Socket Programing : http://cs.baylor.edu/~donahoo/practical/CSockets/
8. 2.4.14 kernel ::bonding.c 為一個頻寬合併的driver。
9. struct net_device中函數指標 hard_start_xmit(struct sk_buff *skb, struct netdevice* dev)
中變數skb 指向網路封包,dev指向device driver的net_device資料結構,當有資料傳送到這個裝置的ip addr或者是這個ip addr 有資料要送出去時,kernel會callback此函數指標所指的函數。
10. 函數指標 get_stats指向一個負責維護網路資訊的函數,driver的作者須自行維護,當有查詢命令過來kernel會callback此函數,將網路資訊(net_device_stat)return回去。
11. net_device結構中,name[IFNAMESIZ]存放的是裝置的名稱,啟動一個網路裝置: ifconfig lcd0 192.168.1.100 =>kernel會自動callback open 將裝置初始化。
12. 控制網路卡的driver為NIC。
13. 經由TCP/IP 做I/O是定義為由user space 到 kernel space,kernel space to hardware則未定義。
14. skbuff 指標指向網路封包資料的起始位址。
15. dev_queue_xmit 的實作在 /net/core/dev.c ,為上層為了傳送封包給下層時使用。
16. tx_timeout 的用途? 進行錯誤處理 <=講義(二)投影片p.80
17. 系統呼叫netif_stop_queue(),會將網路介面強制關閉,此外亦可使用tx_timeout來做關閉。
18. 被關閉後的網路介面需呼叫netif_wake_queue()來將介面重新啟動。
19. 接收封包分兩階段: (1). 從硬體拿/傳遞資料,depend on 硬體的實作是否有interrupt handler
ex: 按下按鈕之後啟動interrupt handler 將按鍵資料存入一個封包中,再將封包丟至IP層(上層),IP層會做處理,丟到User space process。 (2) 參考講義((二)投影片p.82
20. kernel目前約有110多個sub-system,目的只有處理I/O,觀察註冊含樹,fops...等等資訊來掌握sub-system架構也等同於掌握了kernel內部的架構。
21. IP層以下並沒有區分 TCP / UDP協定。
22. 在分層架構下,Driver 工程師並不需要了解tcp/ip的內部api實作,即可完成network device driver的撰寫。
2010年4月10日 星期六
選購公路車
2. 參考頁面: http://dejavugreen.pixnet.net/blog/post/29401622
3. CT盤換3盤的問題: http://www.mobile01.com/topicdetail.php?f=318&t=1227680&last=14666900
4. shamal(瞎貓) 與 跑零輪組差異: http://www.mobile01.com/topicdetail.php?f=316&t=1085814&p=1php?f=316&t=1085814&p=1
5. 組車預估花費: ULTEGRA 6700 =>NT23500
FULCRUN RACING 3 => NT20500
CERVELO 車架 =>NT44000
3T龍頭+手把帶+龍頭=>NT3000
Selle ITALIA =>NT3000
6. 2010SRAM FORCE v.s. ULTEGRA 6700 : http://www.mobile01.com/topicdetail.php?f=316&t=1322492&p=3
7. 網友推薦: 車架 => Cervelo S1
變速系統 => Ultegra 6700
輪組 => Shimano C50-TU
手把與龍頭 => 3T Team
坐墊 => Airone CX
輪胎 => Corsa EVO CZ 2
剎車皮 => Swiss stop
2010 Toupe Team
8. 2010 CERVELO S1: http://tw.myblog.yahoo.com/fee99leo/article?mid=1604&prev=1608&next=1597
撰寫c程式不發呆 & 每天10分鐘 掌握c++
1. 先將ch3 ~ ch5 的範例程式測試一遍
2. 初學者撰寫程式的步驟: (1)理解問題 (2)演算法設計 (3)解法推導與實作
3. 打字速度必須到達不影響邏輯表達的程度
4. cerr 為標準錯誤輸出流與cout是幾乎相同的function
5. 異常處理(Exception handle)使用try/catch 架構 在try中執行正常操作,在error中執行異常處理,只要try區塊中任一函數執行出現異常,即拋出異常(cin.exceptions(cin.failbit)),程式執行轉到catch區塊繼續。
6. #include
7. sscanf(const char * str , const char * format,...) ,其中format "%*s or %*d"為刻意忽略第一個字串中的某一段字串。
8. 使用 std::runtime_error 需#include stdexcept
9. C++例外處理類別: http://caterpillar.onlyfun.net/Gossip/CppGossip/StandardException.html
10. 優質代碼參考網站: http://www.happycodings.com/
11. fputs(str,stdout)與puts(str)均為寫入string 到 stdout,差別在於puts會自動加入換行字元。
12. 開啟一個檔案之後,若有意再進行寫入動作,標準實作必須呼叫fflush or fseek。
13. fgets(buffer,size,stream) 為從stream所指向的檔案流抓取size個字元到buffer。
14. heap 與 stack 的差異:(待整理)
15. 掌握c++ 的第13章 記憶體: heap 、 stack 、pointer,須反覆閱讀。
16. 使用enum 必須記得初始化enum結構變數,才不會出現g++編譯錯誤。
17. 掌握c++ 第15章 的範例無法編譯成功。
18. getter & setter函數的功能? getter()負責取得class的私有變數的值;setter()負責修改私有變數的值,但不返回該私有變數。
19. 掌握c++第19章的範例程式: anAccumulator 有實作default constructor 而 aController 則否。
20. Class由兩個部分組成,class的宣告在.h檔,class的實作在.cpp檔。
21. aRequest::anOperator aRequest::Operator(void) const <=表示Operator()為一個getter函數。
22. anAccumulator::Apply(const aRequest &theRequest)為一個setter函數。
23. anAccumulator::anAccumulator(void): myValue(0) <= 為實作一個default constructor。
24. aController::SelfTest()中為何TestAccumulator 物件可以有多個instance ?
25. ControllerModule.cpp中: while(Request.Operator() != aRequest::stop){ ... } 為何還要在呼叫Operator()一次?
26. 在UML類別圖中,不顯示每個Class的default
27. aRequest:aRequest (const anOperator theOperator, const float theOperand) 為建構子。
28. aRequest::aRequest(const aRequest &theRequest) 為複製建構子。
29. 第21章overloded運算子的單元須閱讀陳錦輝的補充單元說明。
30. 第22章介紹到繼承、virtual、多型等觀念需多次複習。
閱讀 Mobile Broadcasting with WiMAX: Principles, Techology, and Applications
目錄與內容簡介: http://tlsj.tenlong.com.tw/WebModule/BookSearch/bookSearchViewAction.do?isbn=0240810406&sid=43774
1. 4月14日略讀完前3章,大致了解wimax的發展過程,與複習無線通訊的基礎架構。
2. 4月16完成前4章的略讀,了解802.16e的機制下,PHY與MAC層的觀念。
3. 4月22日讀到第5章,該章節介紹有關cell 的規劃,與MIMO技術的基本介紹,主要技術規格需求需視客戶所在地區的規範而定,ex: Frequency reuse factor per cluster、STBC MIMO、AAS MIMO....。
4. 4月23日讀到第7章,主要是介紹現在全球的wimax部屬狀況,包含早期的fixed wimax 與 近期的mobile wimax,另外我們所使用的通訊產品其中是包含了相當多的標準組織所制定的規範於其中,ex: ieee、etsi、3gpp、mpeg..。
5. 第8章描述一個wimax soc內部的方塊圖,須反覆閱讀。
6. 在Chipset硬體實現方面,OFDM 信號處理是直接使用SOC(合併多個硬體單元)/FPGA/DSP進行,但Samsung SPH M8000 內部是使用軟體實作搭配PXA272 520MHz CPU的方式來實作MAC protocol。
7. dbm與mw的對映: http://www.mobile01.com/topicdetail.php?f=110&t=42057

2010年4月9日 星期五
4/12 由講義(二) 8.3節開始研究BTTV應用與8.4節Linux Driver 的分層架構
2. vmalloc 使用到 kmalloc(GFP_KERNEL)
3. 多REVIEW 講義(二)P.161 圖8-2的Memory-mapped 概念圖
4. RAM與I/O MEM的差別在於RAM並不屬於reserved page
5. driver 中的fops->mmap 與 user space process 中的 mmap(GLIBC提供)所負責的工作有哪些 <= 參考講義(二)p.162
6. 講義(二)p.172中為何user space process 執行ioctl VIDEOCAPTURE是使用copy_from_user()?
7. BTTV driver 路徑: /drivers/media/video/bttv-driver.c , bttv.h
8. 將講義(二)p.174的driver架構圖整理起來
9. static struct vdeo_device *video_device[VIDEO_NUM_DEVICES] <=代表宣告video_device結構陣列。
10. v4l.c 在嵌入式原理與實務的第七章有介紹,為整合bttv driver的影像應用程式。
11. bttv-driver.c 中 會呼叫 videodev.c的video_register_device()將下層函數的功能註冊給上層函數。
12. v4l.c只與videodev.c做溝通,也就是說v4l.c下ioctl命令會透過videodev呼叫到bttv-driver.c所提供的命令功能。
2010年4月7日 星期三
USB driver 與 Network device driver 開發
2. USB 的驅動架構是採用封包方式,而不使用傳統的read/ write 方式,亦可自行新增fops,建構裝置檔將資料傳回給user space process。
3. OS底下的USB只進行一樣工作 => I/O 存取 (丟封包的方式)
4. Input device 為處理人為輸入的一個sub-system。
5. 配合與講義(二)的投影片P.68與後面第十章研讀usbmouse.c。
6. tty終端機應用的架構(由上到下): application -> tty -> input device subsystem -> user space standard input / output。
7. usb_device_id <= 建立一個table讓kernel知道這個driver所支援的硬體裝置。 8. 滑鼠移動 =>產生中斷由usb-core收到 => 傳送urb封包給device driver 的 callback function。
9. 滑鼠 <= interrupt transfers webCam <= isochronous transfers 10. 函數呼叫順序: usb_alloc_urb => usb_fill_[control bulk int]_urb => usb_free_urb
11. usb_fill_xxx_urb 系列函數中參數 usb_complete * complete 為一含數指標,該函數的工作在於讓driver可以知道剛才丟給裝置的urb封包已經被處理完成了(透過usb-core callback complete函數)。
12. 同上函數中,pipe參數的設定(transmit / receive)會決定complete 函數的實作方式。
13. 當complete function 被callback後,可以將transfer buffer 指標指向下一筆資料。
14. input device 也是一個subsystem ,負責接收人為輸入,當driver接收到資料欲傳送給user space process時,必須透過input device subsystem來丟。
15. 重要資料結構: usb_device、usb_driver、urb。
16. input device sub-system 中重要的資料結構: input_dev
2010年4月5日 星期一
2010年4月2日 星期五
2010年4月1日 星期四
2010年3月31日 星期三
台中鐵馬路線規劃
2. 太平市自行車道: http://www.mobile01.com/topicdetail.php?f=377&t=997674
3. 中正露營區: http://www.mobile01.com/topicdetail.php?f=377&t=824959&r=2&last=10350887
4. 須取回之零件:
輪胎*2
踏板 *2
龍頭 *1
手把 *2
碼表發射器 *1
鍊條 *1
飛輪 *1
大盤護蓋*1
後變速器*1
磁鐵 *2
立管*1
2010年3月30日 星期二
2010年3月27日 星期六
jk24210開發版實作練習
2. JK2410開發版BSP有特定的API可以使用 Ex: set_external_irq( )
3. 重要檔案 : kernel-jk2410/include/asm-arm/arch-s3c2410/irqs.h => 定義外部中斷 (IRQ_EINT4 => S0, IRQ_EINT11 => S6)
4. request_irq為kernel提供的標準API。
5. 測試GPIO前的準備: 先 echo or cat 裝置檔,過程中會去open 裝置檔,之後便可以收到外部中斷(open system call 中必須要implement irq的功能)。
6. make rootfs 兩個Makefile需要修改(/jk2410-make-rootfs , /jk2410-make-rootfs/rootfs/)。
7. 一般習慣一次將多個byte寫入kernel , 而非一次一個byte,減少system time(cpu 中斷 -> system call ->return to user process ) 的花費。
8. 試著設計一些題目(修改外部中斷, 排程機制的on board練習)
9. 練習題: 由ap寫data進driver,buffer滿了之後會讓process 去sleep, 按下S6按鍵之後會印出訊息或撥放音樂。
10. 測試一下當只改變狀態並呼叫schedule()而不將current process 放入wait_queue的系統行為。
11. 開發版的audio system 架構 (由下到上): OSS -> liibmad -> application , AP透過外部程式存取device file (/dev/dsp) 來使用OSS driver 。
12. 進行kernel編譯時 (*) 代表build-in 至 kernel 中, 在開機中會自動產生裝置檔。
13. arnix 提供之layer architechre (由上往下): test.c -> madplay -> libmad -> /dev/dsp -> kernel audio driver (OSS)
14. audio driver 練習題 1:
(a) 實做blocking read 當 ap 執行 read 後 forground process put to sleep
(b) 當按下S6按鈕之後,啟動interrupt handler 將process wake up
(c) 往下執行到外部程式即可撥放音樂
(d) 使用mmap將data register mapping to user space 直接控制LED燈
參考說明: http://www.jollen.org/wiki/MP3_Player
15. 開發版 ip 設定參考: http://hi.baidu.com/lozn/blog/item/411f5caf1a053ffafbed504d.html
16. libmad如何porting到開發版? p.s. 查閱jollen wiki
17. 思考為何在播放音樂時,按下S6還是會執行interrupt handler ? 由於此時應用程式還在執行中尚未結束,此時出現外部中斷系統還是會叫起cdata-gpio的中斷,而該操作並沒有意義,因為forground process 並未sleep 且已被madplay 取代掉了。(以上為猜測)
18. 題目2 LED顯示(1~9) 2進制燈號,http://www.jollen.org/wiki/JK2410_LED
19. 寫ap 為結構化程式設計,可以用流程圖分析function call flow,與driver 必須留意OS狀態不同,寫driver = (ap + OS kernel module)。
20. cdata-gpio.c 當中,若write超過64個字元時,會先啟動timer_function(5秒後執行),將current process put to sleep ,此時可接收外部中斷(目前沒有實作有意義的操作),直到timer_function啟動 -> fail2 -> return to forground (猜測) -> 結束。
21 S3c2410 硬體說明: http://blog.ednchina.com/thinkker/29056/category.aspx
22. LED實驗中,在bootloader中下mw.l 0x56000014 0xbff 1 發現LED1不會亮! (參考25.)
mw.l 0x56000010 0x00154000 1 => LED 會全亮。 l : 4個 byte w: 2個 byte b: 1個byte
23. OS中不允許driver直接存取實體位址 => 使用 led = ioremap(0x56000014,4) 透過led變數 indirect 去存取實體位址。
24. cdata2 write to LED 中的程式可以寫在 init_module()中。
25. LED 功能確實啟動的兩個步驟: (1) 先設定好GPBCON register (0x56000010)指定LED1~LED4與CPU之間的PIN腳為輸出Mode (2) 設定GPBDAT register (0x56000014)指定欲亮的LED,GPBDAT為DATA Register。
26. LED練習題: 寫入4個數字,並假設Buffer 此時已滿,使用kernel timer 每1秒鐘顯示1個數字出來,並將10進制換成2進制輸出於LED上,在timer function 中也會將process wake up。
27. 進階練習: 當按下按鈕一次,LED顯示按了幾次對應的數字。 p.s. 寫ap可以讀取GPIO,紀錄按鍵被按下的次數。
28. 如何將自己的driver整合到kernel當中: http://www.jollen.org/wiki/JK2410_merge_a_new_driver_into_kernel
29. 測試 writel(0x87f,led) 是否也可以使LED全亮?可以!
30. 出現 bug: kernel timer added twice at c000bfffb4 記得檢查是否漏掉初始化kernel timer的步驟!
31. (銜接26.)撰寫 write_led() : 提供依輸入數字並將數字顯示到LED的功能。
led_timer(): 每秒鐘輸出一個數字,在idx為0之後結束計數功能。
32. RAM與I/O MEM差別在於RAM可以存放DATA!
33. 一般ARM/RISC 處理器的記憶體位址配置: 0X30000000~0X34000000 FOR RAM
0X34000000以上 FOR I/O MEM
34. 名詞定義: X86 -> VideoRam RISC -> Framebuffer 兩者所指的是同一個LCD Panel 。
35. 可以藉由設計bootloader 或 driver 來定義好 配置給 framebuffer 的記憶體空間(for JK2410開發版 在RAM區間中,33F00000~34000000 300KB的範圍)。
36. 將圖片檔案放入Framebuffer則能在panel上看到圖片被顯示出來。
37. mw.l 33f00000 0x00ff0000 0x12c00畫紅色於整片panel,0x12c00代表點數,1 pixel為 4個 byte 所以用 mw.l,在driver開發中還是要記得不要直接存取實體記憶體位址。
38. for JK2410開發版panel 320*240*4kB(per pixel) ~= 300KB
39. 一般拿到開發版寫driver的工程師須了解以下資訊:
(1) 中斷處理
(2) I/O MEM (frame buffer)
(3) RAM
40. 試著用小畫家,做一張320*240的圖,開機時用tftp 放到 frame buffer 中(有風險性)。
41. 開啟frame buffer driver 後編譯出現error ,vgacon:290 'PCIMEM_BASE' undeclared (first use in this function) => 已解決安裝 patch即可!
42. 為何kernel 中的frame buffer driver即使不打開也可以work ? 因為在bootloader中已經設定過LCD controller 。
43. 設定bootargs 中mem=60M 使得kernel 不會在開機時再去使用到framebuuffer 的空間了!(初始設定下 frame buffer 的空間會在60~64M之間) ,之後若需要存取frame buffer 的空間則須參考存取I/O Memory的方法來做。
44. Linux system 在開機階段會將 root filesystem壓縮檔放入設定好的memory addr (0x30f00000)當中,解壓縮之後檔案會往後長(addr 0x33f0000)。
45. 編譯file system時,若發生error時,記得先將資料備份好,將jk2410-make-rootfs資料夾整個刪除,若rootfs無法刪除,則重開機後再刪掉即可!
46. request_irq() 應該寫在cdata_open(),還是cdata_init_module()中? 參考網址 : http://www.jollen.org/wiki/Hardware_shared_interrupt_and_software_shared_interrupt
47. (承接43.) 練習題: 在kernel space 利用 ioremap() ,存取frame buffer 在panel 上畫圖,不過正式的driver並不會這樣實作,畫圖的功能一定是由ap發起。
48. 實作mmap system call 讓ap可以存取frame buffer,先前於IPC應用上也有使用到mmap()的功能。
49. 在kernel中fb指標會指向0x30f00000,在user space mapping virtual address 有2個階段: (1) phy addr -> kernel virtual adde (2) kernel virtual addr -> user virtual addr。
50. android 系統也是使用direct framebuffer ,可以在ap層直接存取frame buffer。
51. /dev/fb/0 為kernel 內建的frame buffer driver 內部已實作mmap功能可以直接使用!
52. 不要使用程式語言特性去實作,而要利用OS提供的function去實作功能。
53. 4/2 發現showmmap 測試程式無法開啟 /dev/fb/0!
54. 更新jk2410測試程式: http://code.google.com/p/jk2410-codesuite/source/checkout
55. cdata-0.4的範例,testm.c中的操作會造成 kernel panic 的現象發生!
56. 希望driver在kernel/系統開機的狀況下自動進行註冊,只需在driver/char/中修改Makefile即可。
57. 任何application 存取I/O時,都需要使用mmap這個system call,這個nterface必須由driver寫作者自行實作。
58. 利用svn工具 下載lcd_demo程式,測試lcd driver的功能。
59. 測試程式(在init_module時註冊interrupt handler)會出現kernel panic狀況! http://www.jollen.org/wiki/JK2410_shared_interrupt
60. embedded system (非X86系統)中由於GPIO PIN腳多,故較不實作share IRQ。
61. 期末測驗: (1) cdata_led.c <= buffer 滿了之後會將輸入的數字output出去。 (2) mknod 與 install driver 可以寫入 init.rc中在開機後就自動做好(參考wiki 做法)。
62. 講義(二)p.160 由user space 執行mmap 將 user space 的記憶體空間與kernel space 的page table 做mapping ,結果將user space 的記憶體空間對應至I/O MEM。
63. reserved pages 為MMU無法管理到的記憶體區間。
64. GPIO測試方法: case1:先open裝置檔,再做fork()讓兩個process都會去讀取該裝置檔,觀察driver是否有異常 case2: 針對同一裝置檔執行2次open。
65. User-space driver and process race condiction: http://www.jollen.org/wiki/User-space_driver_and_process_race_condition
review 從變動中創造財富
2. 融資餘額代表什麼意義? 是進場信號,或者退場?
3. 日本股神士川銀藏透過物價變動前巧妙收購大量物資,迅速獲取高額利潤的做法,關鍵在於看出需求面的出現,因此在市場需求增加前,保握了絕佳的進場時間。
4. 3低2高 => 低基期 , 低股價 , 以低本益比; 高成本, 高殖利率。
5. 挑選長期穩定基金的指標: (1)4433法則 (2)晨星5顆星 (3)理柏Leader指標 。
2010年3月25日 星期四
Linux Kernel Module
2. insmod 與 modprobe指令均可安裝kernel module但insmod 必須自行安裝其他有相依性的模組(EX : video4linux 為Linux kernel 支援影像裝置的API,架構分為上下兩層,上層為video4linux本身(videodev module),下層為bttv模組 ,模組間具有關聯性)。
2010年3月24日 星期三
Semaphone 觀念 & Pthread Programing
if(semaphone){
critical section (放置需保護的資料)
}
2. thread可分為user thread(POSIX thread) 與 kernel thread兩種
3. 寫multi thread 的程式時,編譯記得加上 -lpthread
4. pthread_create(thread_id, thread_attr, thread_func, thread_argu) 其中:
thread_argu為傳遞給thread func 的參數
thread_id 為指向thread_id的指標
thread_func 為指向therad function 的指標 資料型別為 (void *)
thread_attr 指向thread attribute 的指標 NULL 則表示create出來的thread為joinable Thread
5. join Thread 機制可以確保thread 執行的工作要先完成,後續的process/thread才會往下執行。
6. join_thread2.c 編譯執行後會出現 segmentation fault !
7. join_thread3.c 中示範如何讓process與thread依照期望的順序執行完成,在thread中亦可妥善利用pthread_join() 做等待(特定thread工作結束)。
8. Pthread programing 練習: https://computing.llnl.gov/tutorials/pthreads/
9. GNI/Linux 實做的semaphones可以分為 :
thread semaphones
process semaphones
10. Semaphores 使用方式:
Semaphones S ; // 初始化變數S, 一般設定為'1'
P(S); //wait operation
EnterCriticalSection();
V(S); // post operation
11. Race Condition 發生在以下2種情況下
(1) 多個process同時concurrent執行且共用相同資源(EX:同一個結構變數)
(2) 在多工與分時系統下會產生,因程式碼執行順序而出現的競賽問題
12. (猜測)semaphones 可以分為:
kernel semaphones : 呼叫 sem_init()初始化
down_interruptable();
{
critical section
}
up();
user semaphones: 呼叫sema_init()初始化
sem_wait();
{
critical section
}
sem_post();
13. 不能在critical section 中直接呼叫 sleep(造成deadlock) , 試著思考為什麼? 因為Atomic特性,不能有停頓出現在critical section。
14. 利用程式碼特性善用區域變數,最後處理完的結果用semaphore保護起來放到,減少semaphore的使用次數
15. 思考 先 open() 再 fork() 跟先fork() 再 open() 的差別在哪? 先open 再 fork的話,parent 與 child process 會共用同一個struct file 的資源。
16. 實做sleep_on 的簡單步驟:
(1) init_waitqueue_entry()
(2) add_waitqueue
(3) current->state = TASK_INTERRUPTIBLE
(4) schedule() // 在critical section外呼叫
17. taskqueue 用於對function進行排程時使用,為進化版的kernel timer,linux kernel 2.6 進化為workqueue,具體做法: queue_task(&cdata->cdata_tq,&tq_timer)。
18. kernel thread 也可以被排程(需特別將kernel thread丟到queue中),形成具有time slice 的kernel space function
19. 在critical section 中,還是可以接收硬體的中斷(猜測),而sleep則不允許!
20. mutex,semapores , spin-lock的差別在哪? spin-lock為driver另一組semaphone函數(busy loop/waiting) ,用於中斷模式下使用, semaphores則是先讓user space process 去 sleep。
21. down, up 函數是使用wait queue做等待(用於等待時間長) <-> spin-lock 用 busy loop方式做等待(用於等待時間短)
22. 單處理器不會出現P進入critical section 而 Q在外面等待的情況,SMP則會出現!所以在單處器使用semaphores / spin-lock 比較沒有意義,但建議還是加上去。
23. linux 2.4 kernel 中有變化型的spin-lock可以在critical section 下關閉外部中斷。
24. hold semaphores
25. 留意 linux 2.4 kernel底下的driver , 其 spin-lock的實作是空的。
26. spin-lock在多處理器才有意義, 2.4 kernel不支援ARM的多核心處理器(猜測)。
27. 在單處理器的架構之下,並不會P停下來後Q並不會在semaphores外面等待,而是否會有同步問題則需看實做的架構而定(基本上還是會出現同步問題)。
28. semaphores 系列函數: down , up
spin-lock系列函數: spin_lock , spin_unlock
2010年3月22日 星期一
driver function 排程 與 user application 排程 與 中斷處理
2. kernel timer , tasklet , task queues.
3. waitqueue 對實做 blocking I/O 有用處,讓current process 可以被rescheduling。
4. interruptible_sleep_on(&cdata->write_q) => 將current process放入自己所宣告的waitqueue 中,並將process 的狀態改成waiting state , 且能隨時收到SIGNAL(可以使用 kill 命令)。
5. 當timer function 執行完成之後,程式會直接跳至timer function 執行前的地方繼續執行 (猜測)
6. schduling 概念介紹: http://www.jollen.org/blog/2008/12/kernel-scheduling-concept-1.html
7. 每一次open需包含一個wait queue 於私有資料結構(避免WAKE UP效率很差)。
8. Ex:cdata-0.2.1中 cdata_interrupt handler負責處理process 的wake up,當ap 執行open時,會去初始化timer_frunction(每5秒執行)與cdata_interrupt_handler(每毫秒執行),可以調整cdata_interrupt_handler的執行周期,觀察系統的行為差異。
9. driver 範例: http://lxr.linux.no/linux-old+v2.4.31/drivers/char/scan_keyb.c
10. kernel timer 用於不需排程機制的應用, EX: 機器人走路。
11. 練習七的架構可以應用於: 按下按鈕5秒鐘(kernel timer poling 50次檢察案件是否被按),開發版自動重開機。
12. timer function中不能實做排程!!! ,因為timer function是在中斷模式下執行,會造成當機,所以timer functon沒有重複進入的問題。
13. 中斷模式下執行的程式與呼叫System call的程式差異:
(1). 是在一般process的context(PCB <--紀錄process狀態)外執行 (2). 不能直接存取user space (因為copy_to_user 必須透過PCB才能存取),須先將Data放置於kernel中buffer ,process再透過read/write去存取。 (3). 不能做call schedule() => 不能使用wait queue,中斷模式下做concurrent access 必須用spin lock 不能用down/up。
14. request IRQ基本觀念: http://www.jollen.org/blog/2008/03/interrupt_handling_1.html
15. 驅動程式的中斷處理 #2 (包含Counting semaphore觀念介紹): http://www.jollen.org/blog/2008/03/interrupt_handling_semaphore.html
16. Buttom Half 的觀念: http://www.jollen.org/blog/2008/03/interrupt_handling_bottom_half.html
17. Blocking I/O 觀念總結: http://www.jollen.org/blog/2008/08/linux_device_driver_blocking_io.html
18. 中斷模式下kmalloc(64,GFP_ATOMIC)才被允許使用,有關中斷模式下的限制參考講義(二)P3~P11。
19. interrupt handler 實作須盡量減少所需之I/O時間(使用tasklet機制將一些operation做排程移到OS time下去執行),以免造成系統反應時間過長的問題出現,也避免掉中斷遺失的問題出現。
20. interrupt handler 可以分為top-half 與 bottom-half 兩種,差別在於bottom-half執行時所有中斷都是開啟的,且bottom-half是由top-half做排程,在OS 時間執行。
21. top-half 與 bottom-half中的程式由工程師自行取捨並無重要工作一定得分配給誰的問題。
22. 在top-half中會將硬體最新的狀態儲存於特定的buffer中,而bottom-half則由於過了一段時間後才執行,所存的硬體狀態資訊是舊的。
23. void my_tasklet_function(unsigned int)
DECLARE_TASKLET(my_tasklet,my_tasklet_function,(unsigned int)&my_data) <= 宣告Tasklet tasklet_schedule(&my_tasklet) <= 排程bottom-half ,可以重複schedule 24. 由bottom-half 負責將user-space process 叫醒 ,top-half 負責接收中斷與排程 bottom-half。 25. 若top-half同時排程兩個以上的bottom-half,邏輯上有機會concurrent 執行 <=使用spin-lock保護。 26. 講義(二) p.24 的鍵盤範例,可以同時記錄多個被按下的按鈕,學習該機制的設計方式,可以應用於中斷快速產生的狀況。 27. 效能調教時,會衡量interrupt handler 的處理效率,並計算花費的時間。 28. 組合鍵應用 ctrl + c,須使用kernel timer 紀錄下一個被按下的按鍵使否為 c。 29. 兩種framebuffer機制: (1) ap將圖片放入buffer中(已完成mapping ),再由driver透過memcopy_fromio(dest,source,num)將圖片寫入framebuffer <=目的為了進行影像處理 (2) ap直接存取framebuffer。
30. chache 中的資料並不會被swap out 且其中的資料不會消失,且kernel本身即是個大chache。
31. vmalloc()可以指定任意大小的記憶體空間,而kmalloc則只能指定到128kb <=無法存放一張圖片。
32. 記憶體位址的mapping table一般為MMU負責做分配,若無MMU則需實作軟體去做計算,但效能會變慢,透過直接修改kernel的方式可以直接跳過mapping動作,達到phsical address連續而快速的效果。
33. ioremap()與 vmalloc()均能劃分到任意大小的記憶體空間,且存取到的一定是建構於MMU系統的虛擬空間上。
34. 無MMU的系統由於需要軟體運算page table因此效能比較差。
35. virtual address 一定是連續的,由MMU系統負責處理。
36. 記憶體空間是由kernel由低位址開始使用
37. I/O MEM 由於是外部記憶體,因此相較於RAM為連續的位址分配 (還未確定)。
38. VMA 與 VFS 的關係:
39. vmalloc 的分配只有前4Mb的Page為連續,之後則不一定連續,cdata-lcd.c 中的do_lcd_mmap()做法是由於在I/O MEM的Page range所以才能連續做mapping,要注意這點。
40. vm_area_struct 結構為kernel準備好的結構。
41. 一個基本可開機的OS需要: (1) 排程/ Context switch (2) interrupt handler (3) virtual memory
閱讀 Linux kernel driver 程式碼
學習driver程式碼的架構 ,觀察其中的multi-thread的機制如何實做。
2. read & write system call
user space 的 process 分配到的記憶體有可能被swapping out,因此kernel space 的 含式在存取到userspace時必須要 能先做檢查動作,以免出現 Page Fault 問題。
3. OS 只會對user space process 進行排程,且kernel space 存取invalid page 並不像USER space process 一樣(swap in),而會出現kernel panic,須視執行當下的記憶體配置,所以在寫作kernel space code 時必須很小心記憶體的使用。
4. user space 與 kenel space 的記憶體空間配置是各自獨立的 (猜測)
5. 使用到kmalloc()與copy_from_user()/ copy_to_user()等存取到user space 的含數的驅動程式必須是reentrance(spinllock 與 semaphonme) 。
6. 函數重複進入 => 該函數還未return前,又被呼叫一次。
7. 區域變數在每次呼叫都會有一塊獨立的stack來存放,而全域變數是存放於?
8. 由於user space process 會去sleep故driver function 必須是可重複進入函數
9. 使用strace工具來觀察system call的調用過程。
10. 有關process的詳細介紹:http://www.jollen.org/blog/2007/01/process_creation_2.html
11. process 對應一個PCB 其中 有一個欄位Program Counter負責紀錄該Process 執行到哪一行
12. 假若硬體ready,並不會馬上讓資料寫入硬體,而是必須等待running中的程序把時間用完且使用該driver的應用層process被系統挑到才會寫入硬體,因此當系統中的程序越多相對系統的I/O 效能就越差。
13. sleep 的process 必須先改為ready 再由系統排程進入runnning
14. 介紹MultiTasking 概念:http://www.netrino.com/Embedded-Systems/How-To/RTOS-Preemption-Multitasking
15. 將Process 由 waiting state 到 running state 是由driver來負責,硬體ready之會產生中斷(有些硬體不會產生中斷),driver 中的interrupt handler 會將process state 改為ready state。
16. (char *)kmalloc(64, GFP_KERNEL); 左式程式碼中當系統一時要不到記憶體,會讓current process 去sleep,直到記憶體被swap in 後再將 waiting process 的狀態改成runnning state.
2010年3月18日 星期四
人生課題:團隊精神與自尊心的討論
今天獲益良多,或許之後在職場生涯會比較懂得避免一些忌諱,感謝各位惠賜良言,雖然句句是苦在心裡,但收穫豐碩。
2010年3月17日 星期三
Linux System Programing

./pid &
execvp.c 範例:
int main(){
...
char *arg_list[] = {"ls","-l","/tmp",NULL};
execvp("ls",arg_list);
printf("the end of the program.\n");
}
紅字部分變數為重要參數,必須要正確填寫。
有關Daemon設計的觀念分享: http://home.educities.edu.tw/shirock/comp/Daemon_initiation.txt
編譯android kernel
git branch goldfish origin/android-goldfish-2.6.27
git checkout goldfish
make goldfish_defconfig ARCH=arm CROSS_COMPILE=arm-none-eabi-
make zImage ARCH=arm CROSS_COMPILE=arm-none-eabi-
注意細節:
su root
export PATH:%PATH:/root/CodeSourcery/Sourcery_G++_Lite/bin/
or modify ~/.bashrc
Remote object 與 Proxy object 的差異
public final class LedService extend ILedService.Stub{
............................
}
Remote object:
public final class LedService extends Binder{
..............
}
2010年3月16日 星期二
Android 系統啟動流程
2010年3月15日 星期一
Android HAL Stub整合
1.透過java service ->native service -> HAL ->HAL Stub
2.使用remote object直接與native service 溝通
其中第一種方式須使用IPC機制而第二種方式則是從java service 取得一個分身(remote object),直接與分身溝通
native service具有daemon與JNI (run time) 功能
二. mokoid project:
對應target 端 :
system/framework/mokoid.jar(API for LedManager)
=> /framework/base/core/mokoid/hardware/...
system/lib/hw/led.goldfish.so(LED HAL Stub)
=> /hardware/modules/...
system/lib/libmokoid_runtime.so(JNI handle Led Service) => /framework/base/service/jni/...

飛輪教室
踝動式:(一推(1:00)、二壓(3:00)、三拖(5:00)、四提(7:00 or 8:00))
50%重心放踏板,30%在坐墊,20%在把手,並記得上半身要放鬆,踩踏時要用身體的重量去壓,踏板與芝麻球(大拇指第3關節處)。
變速時當下需放輕踩踏的力道,並且維持鍊條在中間的位置,ex:爬坡時,前大變小時,飛輪也要變小一齒,來維持前進動力。
注意兩腿的力量差,目前左腳用力過度,須加強右腳的力量。
騎成公路車時,須注意膝蓋與手肘往內縮,肩頰骨放開,骨棚固定不動。
踩踏時經過上死點時勿重踩,維持膝蓋的角度,遇到下死點想像將鞋底的泥巴刮乾淨,順時鐘往上拉直到上死點。
參考網頁: http://mypaper.pchome.com.tw/56490
2010年3月14日 星期日
GCC 編譯與連結
產生靜態連結執行檔:
step1: gcc -c -o getarg.o getarg.c
gcc -c -o writeinfo.o writeinfo.c
gcc -c -o main.o main.c
step2:
gcc getarg.o writeinfo.o main.o -static -o test_static.o
執行檔檔案大小: test => 10798kb
test_static => 590326kb
靜態連結型執行檔對於嵌入式系統來說是不適用的,因此在系統支援動態的前提下,多採用動態連結方式使程式達到最佳化與省空間的目的。
實做動態連結庫:
gcc -shared getarg.o writeinfo.o -o libtest_d.so
連結動態庫產生可執行程式:
gcc main.o -L. -libtest_d.so -o test_dlib
修改環境變數:
export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH <=目前仍無解 ./test_dlib







