2013年8月30日 星期五

Windows Driver Kit(WDK)

這次,我參加

財團法人自強工業科學基金會

 

1. USB Concept<br>
-USB System Framework<br>
-USB Bus Layer<br>
-Introduction Descriptor<br>
-USB Tracer<br>
2. Windows USB Application<br>
- How to detect USB device<br>
- How to get USB device information<br>
- USBView<br>
3. Windows USB Driver Architecture<br>
-Windows USB Driver Stack<br>
-USBDI (USB Driver Interface)<br>
-URB (USB Requet Block) <br>
- Configuration USB Device<br>
-Control Pipe Transfer<br>
-Bulk Pipe Transfer<br>
4. Simple USB Device Driver (含實作)<br>
-Implement Echo USB Device Driver<br>
- Control &amp; Bulk &amp; Interrupt Pipe<br>
5. USB Mass-Storage Driver (含實作)<br>
- Windows Storage Mechanisms<br>
- Access USB Mass-Storage Device<br>
- Simple USB Mass-Storage Driver<br>
6. HID Concept<br>
-HID Software Model<br>
-HID Descriptor<br>
-Input &amp; Output &amp; Feture Report<br>
-HID Request<br>
- Keyboard &amp; Mouse Report Descriptor Sample<br>
7. HID Keyboard Filter Driver (含實作)<br>
-Windows HID Keyboard System<br>
-USB Filter Driver<br>
-Hook HID Keyboard Driver<br>
8. HID Mouse Driver<br>
-HID Miniport Driver<br>
-HIDClass Minidriver Control Operations<br>
-Implement Virtual Mouse Driver<br>

 


首先是,安裝其WDK後.


image


Launch Windows 7 x86 Checked Build Environment.lnk---執行compiler並產生debug message “DKPrink”


“Checked Build”而" Free"則是沒有


其compiler command – bcz


 


以RamDriver 範例 :


A.cd 到目的目錄中.("必須在C底下")


image


2. bcz


image


3.將compiler 後所產生的 *.sys


copy 到C:\windows/system32/drivers中


(視*.ini內容)


4.相關工具


image


image


5.執行安裝 RamDriver.ini


image


6.


image


reference :

Windows USB驅動程式設計

Windows Driver Kit Version 7.1.0


http://www.microsoft.com/en-us/download/details.aspx?id=11800


An Intro to Windows Driver Kit (WDK) Programming

http://www.installsetupconfig.com/win32programming/windowsdriverkitswdk15index.html

一步步写嵌入式操作系统

 

image

image

 image

image

《一步步写嵌入式操作系统》环境配置

http://hi.baidu.com/nmshsolymikmqze/item/416c14d65b10fef293a97455

省電功能控制

Power Manager,硬体設計和系統耗電有絕對關係,但當系統閒置時是否需要關閉外部裝置電源、調整PIN腳狀態、讓CPU降顏或是切換CPU的模式等則需軟体的工作。

 

在設計電源管理程式時,應先區分出系統有那些執行狀態。

如手機中:

  • 通話或上網
  • 拍照、game、play mp3
  • 使用手機其它功能
  • 待機(背光關閉,螢莫亮著)
  • 待機(螢幕關閉
  • 關機

 

根據產品特性不同來區分不同耗電等級,一般電源管理程式執行狀態至分分為三個等級;

  1. Full Run Mode--系統中所有裝置全速執行
  2. Idle Mode--待機狀能,系統在等待下一個命,目前沒事可做.
  3. Sleep Mode--睡眠狀態,使用者看其來覺得機器像是關機,但可透過輸入裝置來喚醒

其省電方向有:

  1. CPU:
    1. Clock週整---將其Clock升或降頻.來當做CPU的工作頻率。
    2. 執行狀能調整---CPU提供了如"halt"或"sleep"的指令,執行後可以讓CPU停止一些CPU內部的功能,並停止抓取指令執行。而產生特定中斷(一般用timer, key,touch and panel)來喚醒,繼續抓指令(第一行為中斷處理程序)
    3. 關閉暫時不使用之外部裝置的電源: 必須硬体配合,其該裝置及相關零件的電源必須獨立出來,接著体硬設計可以來控制 其切換,如何以I/O port 來控制。
    4. 切換裝置的執行模式:和CPU一樣,有些裝置不能任意切斷電源,所以就會提供不同的執行模式。(full mode/ standby mode)
    5. 將CPU的各個PIN腳逐一切換為較省電模式: 在多功能PIN腳中,當這些PIN腳被設為不同功能有不同的耗電,所以當某根PIN暫時不用時可以將其設定為最省電的用途。
      1. 通常GPIO比其它設定省電
      2. 通常output pin比Input 省
      3. 通常output pin 保持low ,會比保持high 省電
      4. 如果GPIO有被接電路拉高(pull high)或 pull low,逆勢而為通常會比較耗電

韌体必須確認其:那些裝置有那些獨立電源、該裝置是否可獨立測量、用那根腳控制電源開關、CPU各個PIN腳在各執行模式下如何設定較省電....等。

 

Testing,debug and turning

測試的種類

  1. 白箱測試或單元測試:

將一個軟体系統分成不同的單元(或模組)逐一測試,有時需要利用debug工具一步步的運行來進行調試,需要了解每一個模組的內部程式碼的構造、演算法資訊。這是從程式設計者的角度對程式進行測試。

在嵌入式系統中,要透過ICE或其它裝置來trace機器上的程式總是比較不方便,可以的話,除了驅動程式或少數系統模組外,其它模組的單元測試能夠在模擬器上進行。因在模擬器上總比實体上快,故在模擬器上完成測試後,還要在實体機器上做一次"確認測試),驗証所有在模擬器上所做過測試在模擬器及機器上OK。(在實体機器上進行確認測試,可以找出一些實体機器和模擬器上所未預料的不同點)

2.黑箱測試:

指測試者不需要了解程式的內部情況,比較系統的預期輸出及實際輸出,來測試系統功能是否正常。這種測試不需了解內部構造,是從使用者角度來對程式測試。只需程式的輸入、輸出及系統功能即可。

3.基本功能測試:

按照測試軟体的各個功能劃分,進行有條理、有範圍的測試,必須保証測試範圍能覆蓋所有功能和各種功能條件的組合。

4.整合測試:

相對基本功能測試而言,主要確認在多個基本功能整合在一起後並交互操作後有沒有問題;此外整合測試也必須檢查出一些環境上旳問題(記憶体配置錯誤)。"小範圍的測試可以在模擬器環境上完成,來加速測試。最後還是在實体機器上測試"

5.系統測試及確認測試:

必須在實体機上測試,測試所有預期功能是否可正確工作。旨在檢查整個系統的功能是否完全符合產品規格的需求。

在發行重要版本之前,都必須在機器上作"確認測試",檢查這個版本各部的功能是否都能依照規格正確運行;規格除了功能的正確性外,系統效能也是檢查的項目。

 

6.壓力測試或極限值測試:

使用者/系統。對鍵盤頻繁且無規格的操作,同時執行多個應用程式,或儀器設備造出無用的封包。

而系統架構,則是由工程師寫程式來測試系統模組,例如不斷記寫記憶体來測試穩定度、模擬驅動程式持續不斷的送出中斷,以測試上層模組可應附此種狀況、反覆的rellocate/mallocate/free。

 

7.極限測試:

和壓力測試差不多,基本上是:系統設計上會明定許多限制,如電梯的最大載重、LCD的解析度、電池的低電壓等級。

"以通過極限值測試可以證明就算遇到了超過極限值旳將況,系統會略過或發出警訊,至少不會執行錯誤操作"

8.自動測試:

主要是針對基本功能,開發一個自動測試的程式,可在人工不介入下,測試所有的基本功能並產生報表。

 

9.硬体測試:

ESD防護:靜電防護。因靜電可能由任何路徑打入機器,只多做一些判斷,"盡量"誀免誤動作。

EMC(electro magnetic compatibility),電磁相容性。電磁干援,指除了所需信號外而出現在電路內的任何電氣訊號。基本所有電子都有送出EMI,也都受到EMI干擾。因此電子裝置的設計,應不受外在EMI干擾外、也不應成為EMI。grounding、shielding and filtering。

極端環境測試:了解市場為何?

強度測試:

  和機構設計有關,例如從一公尺摔下。

在測試出bug後的處理原則:

  • 每一個bug都應有屬於某一個分類,而每一個分類的bug有預設的處厓者,為了避免bug送錯人而延遲處理時間,測試人員如果無法區分bug的類別,在issuse這個bug前,最好找主管或相關工程師討論。
  • 盡量找出最簡單就可以把bug重現的步驟。
  • 辨別那些現象是屬於同一個bug;類似的bug寫同一張即可。
  • 當發現bug時,測試工程師有義務依規格,去check其它可能同樣問題的地方,提醒工程師一次處理所有類似的問題。
  • 測試人員不應憑個人來判斷某個現象是否合理,一切均依規格書。
  • 某功能不待合產品規格當然是bug,但測試人員最好能寫好參考規則書的章節。
  • 效能不佳也可列為bug,但有時效能好不好是主觀的,最好找客戶,訂定規格人員討論。
  • 並不是所有bug處理者,都是工程師;例如工程師依規格中的定義實現了某個功能,但測試人員或end user以使用者角度覺得不易使用;此時測試人員可將這個問題加入bug list,並指定給客戶或訂規格的人。

bug的生命週期

http://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Bugzilla_Lifecycle_color-aqua.svg/542px-Bugzilla_Lifecycle_color-aqua.svg.png

  • new:bug創建後的初始狀態,尚未確認是否為"合法"的bug。已寄發給該類別的bug預設處理者及相關人員,但還沒正式指定處理者。
  • assigned:,accepted,表示bug已確認是合法bug,已分配給適當的開發人員處理。
  • 已修正,待驗證(resolved):開發部門對bug進行處理或修改後的狀態
    • fixed:已找出問題,並已修改
    • invalid:開發人員認為不應該是bug
    • wonfix:這個不用修改
    • later:開發人員認為bug在當前版本可以暫時不修改,考慮在後續版本中做修改
    • remind:基本上開發人員不會去修改這個bug,只有當有空時也會去修改
    • duplicate:表示這個問題和其它已被找到的bug是同一個
    • worksforme: work for me,在我的機器上OK?表示開發人員無法重複這個bug,故無法修改
  • reopened: 當assigner稱某個bug已解,若經由測試人員驗證卻仍然存在,則將其狀態改為reopened。
  • verified:測試人員經驗證,若確認結果OK則將其設為verified。
  • unconfirmed:由開發人員自己提交bug,是一種初始狀態,待測試人員確定後變為new
  • closed:bug的結束。對verified的bug.

Tuning:

效能。

case by case。

  • 在進行最佳化前,先要有一個穩定、可靠的版本,而且在確定最佳化未完成前,不要將程式匯入正式版本之內。
  • 調整編譯器的最佳化等級;但務必記得其compiler無法幫程式師完成所有最佳化的任務,尤其是程式風格不好。
  • 優先使用改良演算法來做調整。
  • 以空間換取時闁。
  • 不要把程式最佳化與"用組語改寫"混為一談,首先應找出程式的熱區(hot sport),也就是效能瓶頸。再來修改。
    • 乘/除及餘數,用左/右移及其它操作代替。
    • 最大限度地滅少分支(if..else if..else 或switch)的數量及複雜度。
    • 以循序處理資料。
      • for(i=0;i<100;i++)
        • for(j=0;j<100;j++)
          • a[i][j]=xx;
          • //a[j][i]=xx;
    • 檢查並少用for 及while內的迭代次數。
    • 在迭代次數的for迴圈或while中,精簡迴圈內的程式。
      • for(i=0;i<9999;i++)
        • //計算字串長度
        • length=strlen(string);
        • do_something(length);
      • 不同記憶体有不同的存取速度.盡量把熱區放在RAM上
    • 以一次處理偶數或四個倍數bytes資料,會比較好效能
      • for(i=0;i<1000;i++)
        • buffer[i]=0xA
      • for(i=0;i<1000/4;i++)
        • pointer[i]=0x0A0A0A0A;
    • 不要認圖從頭改寫成組語,而是先檢查其組言是否有效能問題,再依這個組語下去改寫。
    • 去除不必要的程式碼。

SVN

版本控制系統的基礎觀念

http://www.dotblogs.com.tw/huanlin/archive/2008/04/23/3198.aspx

A Visual Guide to Version Control

http://betterexplained.com/articles/a-visual-guide-to-version-control/

Subversion visually explained in 30 sec - svn tutorial

http://coding-time.blogspot.tw/2008/04/subversion-visually-explained-in-30sec.html

 

TortoiseSVN使用簡介

http://www.dev.idv.tw/mediawiki/index.php/TortoiseSVN%E4%BD%BF%E7%94%A8%E7%B0%A1%E4%BB%8B

SVN 基本指令教學

http://blog.longwin.com.tw/2007/07/svn_tutorial_2007/

Subversion 從入門到精通

http://www.dotblogs.com.tw/chhuang/archive/2008/05/04/3783.aspx

vim 替換

:[range]s/pattern/string/[c,e,g,i]

range 指的是範圍,1,7 指從第一行至第七行,1,$ 指從第一行至最後一行,也就是整篇文章,也可以 % 代表。還記得嗎? % 是目前編輯的文章,# 是前一次編輯的文章。
pattern 就是要被替換掉的字串,可以用 regexp 來表示。
string 將 pattern 由 string 所取代。
c confirm,每次替換前會詢問。
e 不顯示 error。
g globe,不詢問,整行替換。
i ignore 不分大小寫。
g 大概都是要加的,否則只會替換每一行的第一個符合字串。可以合起來用,如 cgi,表示不分大小寫,整行替換,替換前要詢問是否替換。
[實例] :%s/Edwin/Edward/g
這樣整篇文章的 Edwin 就會替換成 Edward。

參考:
http://edt1023.sayya.org/vim/node1.html

--------------------------------
書到用時,方恨少..
但這些則是用時,方恨自己不用..

要在這個中秋假期間,把環境移到這上面...(其no xx,好像有提供gcc makefile)
要不然,為了方便一直都用IDE...,都沒法去用vim,

1.新增在區塊(block)內,執行替換
同是用<>s/patten/string/gc  ,但在patten上加上
'<,'>s/\Vpatten/string/gc

時間校正

前言:
 不知為何,在我的電腦中雙系統時。一個是win xp ' Fedora 12
若我改變其一個時間,而另外一個系統的時間。就會發生錯誤。

問題:
  可能是某其一系統改變BIOS的時間。或是對ACPI的處理,發生了問題
------------------
目前我是採取以
NTP 的用戶端程式,亦即是 ntpdate 這支程式就能夠進行時間的同步化

[root@linux ~]# ntpdate [-nv] [NTP IP/hostname]
參數:
-d :進入除錯模式 (debug) ,可以顯示出更多的有效資訊。

[root@linux ~]# ntpdate 192.168.1.254
 7 Dec 17:21:46 ntpdate[1427]: adjust time server 192.168.1.254 offset -0.0147 sec
# 最後面會顯示微調的時間有多少 (offset)

[root@linux ~]# hwclock -w
# 還得寫入 BIOS 時間才行啊!

[root@linux ~]# vi /etc/crontab
# 加入這一行去!
10 5 * * * root /usr/sbin/ntpdate tock.stdtime.gov.tw && /sbin/hwclock -w
 
--------------
問題:
不知為何我在更新後其時間,是原本的快一個小時。 
solve:
  可知,若要設定其ntpdate所需的資訊:有經緯度‘GMT時刻
  故我猜想,應是我的在經‘緯度,設定錯誤。所導致的問題。
在台灣,我們的經緯度應是:東經 120 度北緯 25 度左右 
而其GMT為GMT+8(是以格林威治時間為標準時間(Greenwich Mean Time, GMT 
 
以下是我在此平台上的設定,
1。點選其GNOME面版上的時間。 
fig.ntpdate1.png
2.在其畫面中,在“編輯”按鈕
出現時鐘偏好設定-->位置tab中,再進入編輯
fig.ntpdate2.png
3.即出現編輯位置了,你可以在其位置名稱輸入你目前所在的位置,時區,經緯度
fig.ntpdate3.png

ps:
瞭解了一些時區的概念之後,這裡要談的是『什麼是正確的時間』。
在計算時間的時候,最準確的計算應該是使用『原子震盪週期』所計算的物理時鐘了
(Atomic Clock, 也被稱為原子鐘),這也被定義為標準時間 (International Atomic Time)。而我們常常看見的 
UTC 也就是 Coordinated Universal Time (協和標準時間)就是利用這種 
Atomic Clock 為基準所定義出來的正確時間。例如 1999 年在美國啟用的原子鐘 NIST F-1,
他所產生的時間誤差每兩千年才差一秒鐘!真的是很準吶!這個 UTC 標準時間是以 GMT 
 
這個時區為主的喔!所以本地時間與 UTC 時間的時差就是本地時間與 GMT 時間的時差就是了!
事實上,在我們的身邊就有很多的原子鐘,例如石英表,還有電腦主機上面的 BIOS 
內部就含有一個原子鐘在紀錄與計算時間的進行吶!不過由於原子鐘主要是利用計算晶片 (crystal) 
的原子震盪週期去計時的,這是因為每種晶片都有自己的獨特的震盪週期之故。
然而因為這種晶片的震盪週期在不同的晶片之間多多少少都會有點差異性,
甚至同一批晶片也可能會或多或少有些許的差異(就連溫度也可能造成這樣的誤差呢!),因此也就造成了 BIOS 
的時間會三不五時的給他快了幾秒或者慢了幾秒。
 
或許您會認為,BIOS 計時器每天快個五秒也沒有什麼了不起的,不過如果您再仔細的算一算,會發現,一天快五秒,
麼一個月快2.5分鐘,一年就快了 75 分鐘了!所以說,呵呵!時間差是真的會存在的!
麼如果您的電腦真的有這樣的情況,那要怎麼來重新校正時間呢?那就需要『網路校時』
(Network Time Protocol, NTP) 的功能了!底下我們就談一談那個 NTP 的 daemon 吧!
http://linux.vbird.org/linux_server/0440ntp.php

Linux編譯過程及燒錄part1

今日,在nkfust上課時.有人因為板子的os有問題.
需要重新燒錄.而接下我先記錄一下關於linux編譯部份
再來對其燒寫動作.

vim-Your own syntax highlighted


主題
why is syntax?
why use syntax by different file?
預期:
理解並照著實作
答案:
實作方法

|44.1| Basic syntax commands
|44.2| Keywords
|44.3| Matches
|44.4| Regions
|44.5| Nested items
|44.6| Following groups
|44.7| Other arguments
|44.8| Clusters
|44.9| Including another syntax file
|44.10| Synchronizing
|44.11| Installing a syntax file
|44.12| Portable syntax file layout

-----------------------------------
44.1 基本syntax commands
1.其存放位置,$VIMRUNTIME/syntax for a language
2.基本command
取消syntax
syntax clear
檢查目前syntax
:syntax
查看其item in a specific syntax group use
:syntax list {group-name}

44.2 keywords
最基本的syntax使用,當有多個group同時存在不同command時.以keyword為主
:syntax keyword {group} {keyword}...
( :syntax keyword xStatement if then else endi)
特別注意的是其keyword必須是在"iskeyword"
像是The x language uses the '-' character in keywords.

:setlocal iskeyword+=-
:syntax keyword xStatement when-not
縮寫:
:syntax keyword xStatement n[ext]


44.3 Matches
當你想要去定義的字串很複雜時,(像是函式名命 xxx+"()")

syn match   cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2
syn match   cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1

*/bar* */\bar* */pattern*(see usr_27.txt)

44.4 Regions
其字串是被某一符號所包含(",{,'...)時,我們可以把它視為一個regions
:syntax region xString start=/"/ skip=/\\"/ end=/"/
何時使用region取代match?
主要是match只有當一個pattern,which must match as a whole.
而region,是從start開始的pattern,end 結束pattern(若你只需考慮start而不需要end patter時,你就只需用match)

44.5 nested ltems
即指的是,已在一個定義中,再去裡面找它的東西

#Test is a int variable.

:syntax keyword xTodo int contained
:syntax match xComment /#.*/ contains=xTodo

hi xComment guifg=#....
hi xTodo guifg=#...
#Test is a int variable.
也可以包含自己
如: :syntax region xBlock start=/{/ end=/}/ contains=xBlock
see :help syn-contains

44.6 following groups
如下,若想要去把"if"、(condition)、then分別其標示,則
if (condition) then

:syntax match xIf /if/ nextgroup=xIfCondition skipwhite
:syntax match xIfCondition /([^)]*)/ contained nextgroup=xThen skipwhite
:syntax match xThen /then/ contained
其中,
nextgroup是指其xIfCondition"可能"會出現(即也可能沒有)
skipwhite則是"可能"會有spaces and tab在group id中間出現.

44.7 other arguments
MATCHGROUP

To highlight the text enclosed in parentheses () with the group xInside
:syntax region xInside start=/(/ end=/)/
(test the matchgroup)

 you want to highlight the parentheses differently.  You can do this with a lot of convoluted region statements, or you can use the "matchgroup" argument.
:syntax region xInside matchgroup=xParen start=/(/ end=/)/
(test the matchgroup)
這樣子,是告訴vim將region的起始及終點,標示為不同


"一個副作用是被包含的項目不會在區域的開頭或結尾匹配"




TRANSPARENT(轉成parent)

If the "transparent" argument is given, this item will not be highlighted
itself, but will take the highlighting of the item it is contained in.
不會自己hightlight,會依所包含的為group 的標示來highlight

syn region cCondNest start=/(/ end=/)/ contained transparent
syn region cWhile matchgroup=cWhile start=/while\s*(/ end=/)/
\ contains=cCondNest
syn region cFor matchgroup=cFor start=/for\s*(/ end=/)/
\ contains=cCondNest
需matchgroup by self is ?

the side effect of using a matchgroup is
that contained items are not found in the match with the start item then.
This avoids that the cCondNest group matches the ( just after the "while" or
"for".  If this would happen, it would span the whole text until the matching
) and the region would continue after it.  Now cCondNest only matches after
the match with the start pattern, thus after the first (.











svn操作流程

開發人員使用svn進行開發的一般流程是:
checkout(檢出)項目
——> 更新文件或目錄 ——> update
——> 修改文件或目錄 —— commit(提交)變更
——> 增加文件或目錄 ——> add(增加) 文件或目錄——> commit(提交)
——> 刪除文件或目錄 ——> commit(提交)上一級目錄
 

典型的工作流程, 看起來像這樣:
  • 更新工作複本
    • svn update
  • 產生更動
    • svn add
    • svn delete
    • svn copy
    • svn move
  • 檢視你的更動
    • svn status
    • svn diff
    • svn revert
    svn status, svn diff, 以及 svn revert 這些命令, 來看看你所作的更動是什麼
    Subversion 會使用 .svn 裡的 “原始未更動” 複本來蓋寫檔案, 將它回覆至修改之前的狀態
    svn diff 
    • 檢視本地端更動
    • 比較檔案庫與本地複本
    • 檔案庫與檔案庫之間的比較
  • 合併其它人的更動
    • svn merge
    • svn resolved
  • 送交更動
    • svn commit

VIM+mapping

:map    (all mode)
:nmap  (normal mode)
:vma    (visual mode)
:imap   (inset mode)

Ex:範例
 :nmap :!gcc -Wall % -o %.:r.out
 :namp v>
 :namp v< 指的是shift+tab
 :vmap >gv
 :imap =strftime("%c")

Linux 磁碟與檔案系統管理

最近,本來是在想說要不要對硬碟重組.
但找不到其相關的功能,查了一下才發現其linux是不需要其功能地
其實,其"磁碟重組"中最主要是因為檔案資料離散.

系統管理員很重要的任務之一就是管理好自己的磁碟檔案系統,每個分割槽不可太大也不能太小, 太大會造成磁碟容量的浪費,太小則會產生檔案無法儲存的困擾。此外,我們在前面幾章談到的檔案權限與屬性中, 這些權限與屬性分別記錄在檔案系統的哪個區塊內?這就得要談到 filesystem 中的 inode 與 block 了。 在本章我們的重點在於如何製作檔案系統,包括分割、格式化與掛載等,是很重要的一個章節喔!


vim +NERD_tree 使用方法

1.先參數.如何搜尋NERD_tree及安裝
 http://www.vim.org/scripts/script.php?script_id=1658




















2.常用指令
 Default  Description~                                             help-tag~
Key~

o.......Open files, directories and bookmarks....................|NERDTree-o|
go......Open selected file, but leave cursor in the NERDTree.....|NERDTree-go|
t.......Open selected node/bookmark in a new tab.................|NERDTree-t|
T.......Same as 't' but keep the focus on the current tab........|NERDTree-T|
i.......Open selected file in a split window.....................|NERDTree-i|
gi......Same as i, but leave the cursor on the NERDTree..........|NERDTree-gi|
s.......Open selected file in a new vsplit.......................|NERDTree-s|
gs......Same as s, but leave the cursor on the NERDTree..........|NERDTree-gs|
O.......Recursively open the selected directory..................|NERDTree-O|
x.......Close the current nodes parent...........................|NERDTree-x|
X.......Recursively close all children of the current node.......|NERDTree-X|
e.......Edit the current dif.....................................|NERDTree-e|

...............same as |NERDTree-o|.
double-click.......same as the |NERDTree-o| map.
middle-click.......same as |NERDTree-i| for files, same as
                   |NERDTree-e| for dirs.

D.......Delete the current bookmark .............................|NERDTree-D|

P.......Jump to the root node....................................|NERDTree-P|
p.......Jump to current nodes parent.............................|NERDTree-p|
K.......Jump up inside directories at the current tree depth.....|NERDTree-K|
J.......Jump down inside directories at the current tree depth...|NERDTree-J|
...Jump down to the next sibling of the current directory...|NERDTree-C-J|
...Jump up to the previous sibling of the current directory.|NERDTree-C-K|

C.......Change the tree root to the selected dir.................|NERDTree-C|
u.......Move the tree root up one directory......................|NERDTree-u|
U.......Same as 'u' except the old root node is left open........|NERDTree-U|
r.......Recursively refresh the current directory................|NERDTree-r|
R.......Recursively refresh the current root.....................|NERDTree-R|
m.......Display the NERD tree menu...............................|NERDTree-m|
cd......Change the CWD to the dir of the selected node...........|NERDTree-cd|

I.......Toggle whether hidden files displayed....................|NERDTree-I|
f.......Toggle whether the file filters are used.................|NERDTree-f|
F.......Toggle whether files are displayed.......................|NERDTree-F|
B.......Toggle whether the bookmark table is displayed...........|NERDTree-B|

q.......Close the NERDTree window................................|NERDTree-q|
A.......Zoom (maximize/minimize) the NERDTree window.............|NERDTree-A|
?.......Toggle the display of the quick help.....................|NERDTree-?|


3.注意
   Q.我在使用時,遇到一個問題 . 在vim分割視窗 + nerd_tree下.如何將其檔案開在
       我想要的地方.
   A.結果.是我搞錯了.正確是,以moving cursor後,再以gs,gi來

   Q.增加目錄,檔案
   A.When in the NERDTree window, press 'm'; you should see a menu at the bottom. Type in 'a' for add childnode. Now input the directory you want to create, making sure to add a '/' at the end, otherwise the script would create a file

   Q.改變工作目錄
      in NERDTree window,press 'cd'

ps:http://rickey-nctu.blogspot.com/2009/02/vim-nerd-tree.html

screen blanking (續+hotkeys

1.configuring acpi Create /etc/acpi/events/blank:
event=ibm/hotkey HKEY 00000080 00001006
action=/usr/local/sbin/thinkpad-fn-f6

2.
It may also be necessary to enable acpi events as per How to get special keys to work with (in root terminal) # echo enable,0x084e > /proc/acpi/ibm/hotkey Note this command isn't persistent. so you will also need to add the line to /etc/rc.local to enable hotkeys at boot, and to re-enable the hotkeys after suspend to disk or RAM, create the file /etc/acpi/resume.d/91-ibm-hotkey-enable.sh consisting of
#!/bin/bash
# enable ibm-hotkeys (specifically Fn2, Fn7)
# 12 bit mask, little end is F1 default 0x080c = F12+F4+F3
echo enable,0xffff > /proc/acpi/ibm/hotkey 
 
3.

The bash script

Create /usr/local/sbin/thinkpad-fn-f6,
??

 


 

makefile basis(makefile的處理流程

一個makefile中,包含著數個rule
而一個rule的規格如下:
--------
target ... : dependencies ...
        command
        ...
        ... 
---------

target通常只是一個名稱,(為由程式所產生的execute file name or object file 
或者是指所要進行的動作名稱,例如是clean
 
dependencies是指為了其建立其target所需的,通常是數個檔案
command 是一或多個的指令,用來產生target用.(其在command之前,必需要有一個tab 

而一個rule,主要是功能::在何時及如何來對某一target來建立及更新
how and when to remake certain files
which are the targets of the particular rule.  make carries out
the commands on the dependencies to create or update the target.  A
rule can also explain how and when to carry out an action.  
 
ps.在makefile中若因其command過長,可以用"\"來分行

如何對一個makefile來處理
 當使用者對makefile進行make指令處理時,它會最先處理第一個rule(稱為gobal rule\
其中rule的計算並不包含著其target是由"."開頭的)
 

GCC基本使用

GNU Tools
  • linux中C語言開發流程
  • linux中C語言的執行機制
GCC的開發環境有
  1. 程式產生工具
         在linux中,一般使用GCC(GNU Compiler Collection)做為程式開發工具,GCC中
         提供了C語言的編譯器'組譯器'連結器以及輔助工具.
  1. 程式除錯工具
       GDB
  1. 專案管理工具
        使用make 和makefile
------------------------------------------------

linux中C語言開發流程

編譯是指把用高階語言的轉換成相對應的理器的組合語言的過程.(即編輯是文字轉換)
對於嵌入式系統而言,一般是C轉換成組合言言程式碼(C的語法解析和組合語言轉換)

   對於組合言言是從
ps:一般情況下linux會在/usr/lib路徑中搜尋所需要的程式庫,而test_dlib所需要的動態庫在該路徑下,故其libtest_d.so沒有被找到,也就是說test_dlib在沒有動態庫的情下是不能被執行的.

unbutu


basic of pc BIOS

BIOS(base input output system)
目的:啟動元件,檢查硬体,分配資源,協助載入系統
名詞:北橋,南橋
      Flash memory
      CMOS,SMBIOS

北橋:負責 CPU,Memory
南橋:負責 PCI,PCI-E,USB,VGA,週邊設備且裡有儲存CMOS的設定
SMBIOS:當BIOS啟動後,會先確認cmos中資料是否正確。若正確後,則接下來會將
       之前使用者儲存的cmos資料,加上之前硬体資料,整合為一個表格並寫入memory

作用:
1。自動檢查及進行初始化動作:bios在開機的同時,會針對主皮上所有晶片做偵測,
   並通知  各晶片開始動作
2。記錄系統設定值:透過BIOS來改變各種設定
3。中斷㲃理:mainboard上所有資源,都是由bios所分配
4。載入偏業系統:由bios轉交開機軌,再由開機軌轉交各分割區
-------------
一,Power on :
   檢查mainboard上某硬体狀態及存放cmos的設定
二,post     :開機自我測試(power on self test)
   在post中會去檢查cpu,memory,vga card...是不己就緒,在完成後
   會將所有資訊顯示,並儲存在memory中的smbios(*2

硬碟的第零軌(MBR,master boot record)   
fig 1.

bios在完成動作後,將載入作業系統的主控權交給硬碟中的主啟動磁區,master boot record,也就是硬碟中的第0軌
1,進入後,bios將第一個磁區,載入memory中執行,再開始運作。
   bootloader:儲存開機管理程式:其偏用於1,載入磁區 2,指向kernel
fig 2.
fig 3.
a.載入磁區:
  mbr中,將disk分為多個分割區(以MBR中Partition table)而在分割後的各分割區中
  的第一個磁區便是開機磁區(就是放作業統統産生的bootloader)
b.載入kernel
  直接透過分割區及設定檔的資料,找到分割區中的指定kernel
fig.4




----------------------------------
ps:
*1)
在進入bios(在螢幕未反應)前為power on :
1.cpu 啓動
2,cpu找bios
3。bios在自己的flash memory執行自己的程序
4。bios動作開始,並載入南橋的資料
*2)
可以以#dmidecode 顯示

Handle 0x0001, DMI type 1, 27 bytes
System Information
        Manufacturer: LENOVO
        Product Name: 7733B83
        Version: ThinkPad R61
        Serial Number: L3H0196
        UUID: B35E2601-4A97-11CB-B01E-E6563218FB95
        Wake-up Type: Power Switch
        SKU Number: Not Specified
        Family: ThinkPad R61
-----------
若鈖割區B
有獨自安裝GRUB
 (1).開機由GRUB1,並讀取Linux A的config
 (2).依據config 1,産生選單,使用者選擇後,再進入GRUB2中
 (3)。在GRUB2中,依其config 2産生選單
 (4)。選擇載入kernel
無獨立安裝GRUB
 (1)。由GRUB1開機
 (2)。透過config 1.選擇
Partition Table與 Magic Number
Partion Table:
  儲存硬碟分割表的地方,總大小為64byte。硬碟中分割區有多少,每一分割區的大小都紀錄
  在其中。因大小有所限制,故只能記錄4個主分割區(每個16byte)。如需第5個或以上之分
割區,就只能用掉一個分割區,並把它做為𨒂伸分割區

OPENCSL - 打開嵌入式系統操作大門的開放教材

這是一個說明如何開發嵌入式系統的操偏環境課程
共有8的章節
目前,我己實作了二個(環境建立;kernel的建立

 




 beagleboard


http://opencsl.openfoundry.org/

套件管理Rpm,tarball

RPM(8)                                                                  RPM(8)

NAME
       rpm - RPM Package Manager

SYNOPSIS
   QUERYING AND VERIFYING PACKAGES:
       rpm {-q|--query} [select-options] [query-options]

       rpm {-V|--verify} [select-options] [verify-options]

       rpm --import PUBKEY ...

       rpm {-K|--checksig} [--nosignature] [--nodigest]
           PACKAGE_FILE ...

   INSTALLING, UPGRADING, AND REMOVING PACKAGES:
       rpm {-i|--install} [install-options] PACKAGE_FILE ...

       rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...

       rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

       rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts]
           [--notriggers] [--test] PACKAGE_NAME ...

kernel

kernle基本上,即一個linux.提供了一個完整的作業系統當中最底層的硬体控制與資源管理的架構。
一個系統中組成元件(硬体,可支配管理硬体的核心,溝通使用者與核心的interface)
     user
-------------------------
使用者interface
(shell,KDE,application)
------------------------
   核心(kernel
------------------------
   硬体(hardware
----------------
Distribution
linux為一個kernel,而為了對不同的要求。許多人會其kernel中加入了許多
不同需支及調整的軟体。像是sendmail'wu-ftp'apache....
需許多公司就將一些需要的軟体套件加掛到linux核心程式中,並發行
此類即為稱為 “distribution”(完整安裝套件)
注名的有
red hat
mandrake
slackware
suse
openlinux
debian
linpus
及unbuntu



基本功能
system call interface:一些服務與kernel溝通之後,將硬体旳資源進一步的利用
process control:系統程序控制中心
memory managernent: 控制系統的記憶体管理
file system management:檔案系統的管理。(包含著I/O,linux中視各i/o為一個檔案
device drivers:硬体的管理是kernel的主要工作之一。裝置的驅動程式。(可載入模姐。將驅動程式編輯成模組,就不需要重新編譯核心。
目前的kernel版本
[root@localhost grub]# uname -ra
Linux localhost.localdomain 2.6.31.5-127.fc12.i686.PAE #1 SMP Sat Nov 7 21:25:57 EST 2009 i686 i686 i386 GNU/Linux


ps:
UNAME(1)                         User Commands                        UNAME(1)

NAME
       uname - print system information

SYNOPSIS
       uname [OPTION]...

DESCRIPTION
       Print certain system information.  With no OPTION, same as -s.

       -a, --all
              print all information, in the following order, except omit -p and -i if unknown:

       -s, --kernel-name
              print the kernel name

       -n, --nodename
              print the network node hostname

       -r, --kernel-release
              print the kernel release

       -v, --kernel-version
              print the kernel version

       -m, --machine
              print the machine hardware name

       -p, --processor
              print the processor type or "unknown"

-----------------------
kernel相關的網站
http://www.kernel.org/
http://archives.fedoraproject.org/pub/archive/fedora/
中文linux extend: http://cle.linux.org.tw/wp/  
台灣Fedora :http://fedora.tw/

Interface



















上星期,買的