C-lanugage的可攜性是公認的, 可以跨平台執行.

所以各平台之間的compiler應該儘可能的符合可攜性的要求.

但 是為了提高執行效率, 符合各平台的機器特徵做一些特殊動作, 例如撰寫組合語言, 使用co-processor, 使用特殊記憶體配置, 使用特殊的compiler能力...等等會使用到#pragma 的語法以達到目的而又不影響沒有這些能力的平台或compile的編譯.



或許你會認為用#ifdef也可以達到目的, 但是#ifdef的方式必須在command line指定一堆定義是很麻煩的, 而且一些特殊能力用#ifdef 也定義不出來. 況且使用你寫的source code的人不見得瞭解該如何定義以符合他的使用平台或compiler的需求.

compiler看到#pragma時如果後面的定義是它不認得的, 它不會理會; 相反的看得懂得compiler就會去執行它.



如果你是很專業的程式師, 而且考慮跨平台且讓別人可以用你的source code, 那麼很難用一個範例就可以搞懂, 因為它牽涉很複雜的一些規範, 你可以上www.gnu.org去看看他們的規定, GNU是一些熱心軟體發展的人士, 願意提供原始碼貢獻世界的人組成的團體, 依循他們的規範是比較正確的方向(很有學問的).



如果你只是用你現在的compiler時發現這個compiler有一些特殊功能可以提升你的效率, 只要照著做就對了, 沒有什麼大學問, 因為#pragma最有可能的用法就是啟動compiler的特殊能力而不會造成跨平台時一般能力的執行.



舉個例子說在Microsoft C(MSC)上寫:

#pragma asm 表示後面寫的是組合語言 (加速).

#pragma small 表示小記憶體模式 (DOS朝代memory很珍貴)



Keil C在8031平台時寫:

#pragma registerbank(0) 表示使用bank0 (別的CPU沒有這種東西)

#pragma code 表示const 資料放在ROM裡面 (節省RAM)



我舉與你不同的平台的compiler的例子就是要告訴你#pragma就是可攜性的環境下製造不可攜碼的無奈. 你的CPU也會有一些特殊功能或結構, 不用#pragma怎麼辦.

 
引用自:http://tw.knowledge.yahoo.com/question/?qid=1305100703882

 
在所有的預處理指令中,#Pragma 指令可能是最複雜的了,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。#pragma指令對每個編譯器給出了一個方法,在保持與C和 C++語言完全相容的情況下,給出主機或作業系統專有的特徵。依據定義,編譯指示是機器或作業系統專有的,且對於每個編譯器都是不同的。 
其格式一般為: #Pragma Para 
其中Para 為參數,下面來看一些常用的參數。 

(1)message 參數。 Message 參數是我最喜歡的一個參數,它能夠在編譯資訊輸出窗 
口中輸出相應的資訊,這對於源代碼資訊的控制是非常重要的。其使用方法為: 
#Pragma message(「消息文本」) 
當編譯器遇到這條指令時就在編譯輸出窗口中將消息文本列印出來。 
當我們在程式中定義了許多宏來控制源代碼版本的時候,我們自己有可能都會忘記有沒有正確的設置這些宏,此時我們可以用這條指令在編譯的時候就進行檢查。假設我們希望判斷自己有沒有在源代碼的什麼地方定義了_X86這個宏可以用下面的方法 
#ifdef _X86 
#Pragma message(「_X86 macro activated!」) 
#endif 
當我們定義了_X86這個宏以後,應用程式在編譯時就會在編譯輸出窗口裡顯示「_ 
X86 macro activated!」。我們就不會因為不記得自己定義的一些特定的宏而抓耳撓腮了 
。 

(2)另一個使用得比較多的pragma參數是code_seg。格式如: 
#pragma code_seg( ["section-name"][,"section-class"] ] ) 
它能夠設置程式中函數代碼存放的代碼段,當我們開發驅動程式的時候就會使用到它。 

(3)#pragma once (比較常用) 
只要在頭文件的最開始加入這條指令就能夠保證頭文件被編譯一次,這條指令實際上在VC6中就已經有了,但是考慮到相容性並沒有太多的使用它。 

(4)#pragma hdrstop表示預編譯頭文件到此為止,後面的頭文件不進行預編譯。BCB可以預編譯頭文件以加快鏈結的速度,但如果所有頭文件都進行預編譯又可能佔太多磁片空間,所以使用這個選項排除一些頭文件。 
有時單元之間有依賴關係,比如單元A依賴單元B,所以單元B要先於單元A編譯。你可以用#pragma startup指定編譯優先級,如果使用了#pragma package(smart_init) ,BCB就會根據優先級的大小先後編譯。 

(5)#pragma resource "*.dfm"表示把*.dfm文件中的資源加入工程。*.dfm中包括表單 
外觀的定義。 

(6)#pragma warning( disable : 4507 34; once : 4385; error : 164 ) 
等價於: 
#pragma warning(disable:4507 34) // 不顯示4507和34號警告資訊 
#pragma warning(once:4385) // 4385號警告資訊僅報告一次 
#pragma warning(error:164) // 把164號警告資訊作為一個錯誤。 
同時這個pragma warning 也支援如下格式: 
#pragma warning( push [ ,n ] ) 
#pragma warning( pop ) 
這裡n代表一個警告等級(1---4)。 
#pragma warning( push )保存所有警告資訊的現有的警告狀態。 
#pragma warning( push, n)保存所有警告資訊的現有的警告狀態,並且把全局警告 
等級設定為n。 
#pragma warning( pop )向棧中彈出最後一個警告資訊,在入棧和出棧之間所作的 
一切改動取消。例如: 
#pragma warning( push ) 
#pragma warning( disable : 4705 ) 
#pragma warning( disable : 4706 ) 
#pragma warning( disable : 4707 ) 
//....... 
#pragma warning( pop ) 
在這段代碼的最後,重新保存所有的警告資訊(包括4705,4706和4707)。 
(7)pragma comment(...) 
該指令將一個註釋記錄放入一個對象文件或可執行文件中。 
常用的lib關鍵字,可以幫我們連入一個庫文件。 


每個編譯程式可以用#pragma指令激活或終止該編譯程式支援的一些編譯功能。例如,對迴圈優化功能: 
#pragma loop_opt(on) // 激活 
#pragma loop_opt(off) // 終止 
有時,程式中會有些函數會使編譯器發出你熟知而想忽略的警告,如「Parameter xxx is never used in function xxx」,可以這樣: 
#pragma warn —100 // Turn off the warning message for warning #100 
int insert_record(REC *r) 
{ /* function body */ } 
#pragma warn +100 // Turn the warning message for warning #100 back on 
函數會產生一條有唯一特徵碼100的警告資訊,如此可暫時終止該警告。 
每個編譯器對#pragma的實現不同,在一個編譯器中有效在別的編譯器中幾乎無效。可從編譯器的文檔中查看。

Posted by yumiya at 痞客邦 PIXNET 留言(0) 引用(0) 人氣()

文章來源:http://www.webshare.cc/blog/b/blog_view.php?mid=54219&id=49

SPD是SERIAL PRESENCE DETECT的縮寫,中文意思是模組存在的串列檢測。也即是通過上面講的IIC序列介面的EEPROM堆記憶體插槽中的模組存在的資訊檢查。這樣的話,模組 有關的資訊都必須紀錄在EEPROM中.習慣的,我們把這顆EEPROM IC就稱為SPD了。為Serial Presence Detect 的縮寫,它是燒錄在EEPROM內的碼,以往開機時BIOS必須偵測memory,但有了SPD就不必再去作偵測的動作,而由BIOS直接讀取 SPD取得記憶體的相關資料。

  SPD是一組關於記憶體模組的配置資訊,如P-Bank數量、電壓、行位址/列地址數量、位寬、 各種主要操作時序(如CL、tRCD、tRP、tRAS等)……它們存放在一個容量為256位元組的EEPROM(Electrically Erasable Programmable Read Only Memory,電擦除可程式設計唯讀記憶體)中。

  實際上在SPD中,JEDEC規定的標準資訊只用了128個位元組(還有128位元組,屬於廠商自己的專用區)。一般的,一個位元組至少對應一種參數,有的參數需要多個位元組來表述(如產品續列號,生產商在JEDEC組織中的代碼)。

  其中,一個位元組中的每個bit都可能用來表示這一參數的具體數值。由於SPD的資訊很多,在此就不一一列出了,有興趣的讀者可以參閱相關文檔。

  SPD內的時序資訊由模組生產商根據所使用的記憶體晶片的特點編寫並寫入至EEPROM,主要用途就是協助北橋晶片精確調整記憶體的物理/時序參數,以達到最佳的使用效果。如果在BIOS中將記憶體設置選項定為“By SPD”。

  那麼在開機時,北橋會根據SPD中的參數資訊來自動配置相應的記憶體時序與控制寄存器,避免人為出現調校錯誤而引起故障。當然,對於DIYer來說,也可以自由調整時序與控制參數(物理參數仍要借助SPD或北橋自己檢測來確定)。

SPD的刷新

  同主機板的BIOS一樣,SPD也是可以刷新的。用Thaiphoon Burner這款軟體就能做到。

  當主機板上插有新舊兩條大小一致的記憶體導致系統不穩定,主機板的BIOS又無法對兩條記憶體的頻率分別調整時,可以把性能弱的SPD刷到強的那條記憶體上,以提高穩定性。

  注意:千萬不要把記憶體大小不同的SPD互相刷!DDR,DDR2,DDR3的SPD也不能混刷。同BIOS的刷新一樣是有風險的,如果需要請在刷新前備份被刷的記憶體spd。

刷新SPD的意義

   從某種意義上來說,SPD晶片是識別記憶體品牌的一個重要標誌。如果SPD內的參數值設置得不合理,不但不能起到優化記憶體的作用,反而還會引起系統工作不 穩定,甚至死機。因此,很多普通記憶體或相容記憶體廠商為了避免相容性問題,一般都將SPD中的記憶體工作參數設置得較為保守,從而限制了記憶體性能的充分發揮; 同時,如果兩條記憶體的SPD資訊不一致,也可能導致相容性問題,調整合適的SPD值才能確保最佳性能。通過刷新記憶體的SPD資訊,可在相容性及性能上得到 一定的提升,刷新記憶體SPD參數必須保證源SPD參數的記憶體條與目標記憶體條所使用的記憶體顆粒較為接近,否則可能導致刷新後的記憶體條工作不穩定甚至無法工 作。

刷新SPD的方式

   專業人員常用專用設備或專用轉接頭配合程式設計器來刷新記憶體條的SPD資料,另外還可以利用軟體刷新記憶體SPD參數。如Thaiphoon Burner是一款記憶體SPD資訊讀寫綠色軟體,它可以在無需拆機的情況下直接讀寫記憶體條的SPD資訊。 能識別由JEDEC分配的635個唯一生產ID,完全相容DDR2記憶體。

SPD深度解析

   當電腦開機時,串列存在檢查(SPD)為存儲在同步動態隨機訪問記憶體(SDRAM)記憶體模組中電可擦除可程式設計唯讀記憶體(EEPROM)晶片上的信 息,它告訴基本輸入/輸出系統(BIOS)模組的大小、資料寬度、速度以及電壓。BIOS使用該資訊來合適配置記憶體以達到最好的可靠性和性能。如果記憶體模 塊沒有SPD,BIOS則假定記憶體模組的資訊,在一些記憶體中,這麼處理不會有問題,但是SDRAM記憶體必須具有SPD,否則電腦可能根本不啟動,如果 啟動了,假定的資訊可能導致致命異常錯誤。 

  SPD出現以前,記憶體晶片通過並行存在檢查(PPD)來識別,PPD為各個資訊位元使用一個單獨的PIN,這意味著只能存儲記憶體模組的速度和密度,因為引腳空間有線。SPD記憶體模組上的EEPROM晶片只需要兩個引腳,從而可以存儲更多的資訊。

  SPD(Serial Presence Detect),筆者翻譯為“配置(存在位元)串列探測”,而不是“連續存在探測”,如果單從字意上理解,後者的翻譯並沒有問題,但從其真正用意與工作方式 來看,前者更準確一些。為什麼呢?下面具體說說。SPD是一組關於記憶體模組的配置資訊,如P-Bank數量、電壓、行位址/列地址數量、位寬、各種主要操 作時序(如CL、tRCD、tRP、tRAS等)……它們存放在一個容量為256位元組的 EEPR(ElectricallyErasableProgrammableReadOnlyMemory,電擦除可程式設計唯讀記憶體)中。實際上在 SPD中,JEDEC規定的標準資訊只用了128個位元組(還有128位元組,屬於廠商自己的專用區)。一般的,一個位元組至少對應一種參數,有的參數需要多個 位元組來表述(如產品續列號,生產商在JEDEC組織中的代碼)。其中,一個位元組中的每個bit都可能用來表示這一參數的具體數值。由於SPD的資訊很多, 在此就不一一列出了,有興趣的讀者可以參閱相關文檔。SPD內的時序資訊由模組生產商根據所使用的記憶體晶片的特點編寫並寫入至EEPROM,主要用途就是 協助北橋晶片精確調整記憶體的物理/時序參數,以達到最佳的使用效果。如果在BIOS中將記憶體設置選項定為“By SPD”。

  那麼在開機時,北橋會根據SPD中的參數資訊來自動配置相應的記憶體時序與控制寄存器,避免人為出現調校錯誤而引起故障。當然,對於DIYer來說,也可以自由調整時序與控制參數(物理參數仍要借助SPD或北橋自己檢測來確定)。

Posted by yumiya at 痞客邦 PIXNET 留言(0) 引用(0) 人氣()

來源:http://yu-minspace.blogspot.com/2007/05/usb-usb-univeral-serial-bus-hot.html

USB規格簡介

USB Univeral Serial Bus (通用串列匯流排),常見的外部匯流排,支援熱插拔 (hot plugable),一個 USB 最多可以連接127個裝置。

目前規格包括:

  1. USB 1.1 支援二種傳輸速率:Low speed - 1.5 Mbps 及 Full Speed - 12 Mbps。
  2. USB 2.0 傳輸速率 480 Mbps 並支援 USB 1.1。

 

USB 採用 Single-Master (單主控) 設計,線路架構就像多個點對點的樹狀結構,具 USB 介面的 PC 至少有一個 "root hub",並提供二個外接孔供 USB 設備或另一個 USB hub。在電腦中的 USB 主控器會去 poll USB 匯流排上的各個裝置,每個 USB 設備連接到主機時,USB 主控器會分配一個代碼給該裝置,並讀取該裝置的描述表 (Device Descriptor) 以獲知裝置的硬體資訊。

 

USB 主控器(USB hoot Controller) 分為三種規格:

  1. OHCI (Open Host Controller Interface):USB 1.1 規格,Compaq(康柏)公司主導, 使用廠商包括 Compaq、iMacs、OPTi、SIS、ALi,採用 Memory-mapped 的 I/O 方式 (CPU 使用記憶體指令來存取 USB 主控器)。
  2. UHCI (Universal Host Controller Interface) :USB 1.1 規格,Intel公司提倡, 線路比 OHCI 線路簡單,但是需要比較複雜的驅動程式,對CPU負擔也微重了些,使用廠商包括 Intel、VIA,採用 I/O-mapped 的 I/O 方式 (CPU 使用 I/O 指令來存取 USB 主控器)。
  3. EHCI (Enhanced Host Controller Interface):USB 2.0 規格,速度較快 (480 Mbps),支援 USB 1.1,相容於 OHCI 和 UHCI。

 

Linux 對 USB的支援

Linux 從 kernel 2.2.7 版本便開始支援 USB,USB 2.0 是從 2.4.19 開始, Linux 以三層式架構來支援 USB 系統,這三層是內核層 (Core) 、主控層 (Controller)、裝置層 (Device)。內核層指的是 kernel 對 USB 系統的支援,主控層對應到不同規格的 USB 主控器,連接 USB 設備時不必考慮主控器的規格,裝置層的設定,依裝置類型會有所不同。

 

Linux USB 驅動程式共有三種不同的 USB 主控制器選項,因為在主板和 PCI 卡上有三種不同類型的 USB 控制晶片。

  1. EHCI (ehci-hcd.o) :USB 2.0 協定的晶片。
  2. OHCI (usb-ohci.o) :非 PC 系統上的(以及帶有 SiS 和 ALi 晶片組的 PC 主板上的)USB 晶片。
  3. UHCI (usb-uhci.o) :大部份 PC 主機板(包括 Intel 和 Via)。

在 Linux 下可查詢 /proc/pci 所記錄的 PCI 子系統資源配置情況,或指令 lspci,從中分辦出 USB 主控器屬於那種規格,只需載入 USB 類型對應的 ?HCI 驅動程式即可,若單獨載入 EHCI 不行,則根據主板類型載入UHCI 或 OHCI 後,再載入EHCI。

 

使用 usbmodules 指令可查詢己連接至系統的 USB 裝置有那些可以使用的核心驅動模組,在載入/卸載核心模組會利用到 usbmodules 程式,利用 hotplug 或 usbmgr 程式可以在 USB 裝置與電腦連接/移除時,自動載入/卸載核心模組、執行相關 Scripts。

 

Linux 相關的指令和檔案:

Posted by yumiya at 痞客邦 PIXNET 留言(0) 引用(0) 人氣()

文章來源:http://blog.xuite.net/open.mark/20051231/7678224

要瞭解 SPD 之前先讓我們簡單的來介紹一下記憶體的運作架構。

一、記憶體的運作原理

記憶體模組是由許多動態隨機存取記憶體晶片所組成,主要功能就是暫存資料(data)及指令(instructions)。記憶體是將記憶體單元利用矩陣的方式來排列,矩陣中有列位址(Row Address)及行位址(Column Address),為了要讀出或寫入某筆資料,記憶體控制晶片會先傳送列的位址,此時RAS訊號就會被設定為Active的狀態,在存取行的資料前還需要幾個執行週期,這段時間就是所謂的RAS TO CAS延遲時間,而CAS訊號則需要再經過幾個clock之後才可以開始穩定的讀寫資料,這段時間就是大家所熟知的CAS Latency 時間(CL)。

二、何謂SPD

SPD(Serial Presence Detect)是燒錄在 EEPROM 內的碼,裡面記載著記憶體模組的一些相關資訊,包含:記憶體顆粒的種類、容量、速度、所需電壓、製造廠商……等。過去電腦在開機時 BIOS 必須偵測記憶體,但有了 SPD 時,系統就不必再去執行偵測的動作,而由 BIOS 直接去讀取 SPD 值,並取得記憶體的相關資料,並將所使用的記憶體模組的存取時序設定在最佳狀態,以確保系統能正常穩定的運作。

SPD 內部重要參數:

Refresh:主要是指記憶體內部電容充電的動作。由於記憶體模組是由動態隨機存取記憶體晶片(DRAM)組合而成,其電容需要藉由不斷地充電以保持內部資料的完整性與正確性,這個動作即稱為 Refresh。一般說來,Refresh 有 2K 與 4K 的分類,而 2K 比 4K 有較快的 Refresh,相對的 2K 也比 4K 來得耗電。

RAS to CAS Delay:為了讀出或寫入某筆資料,記憶體控制晶片會先傳送列的位址,此時 RAS 訊號就會被啟動,然而在存取行的資料前還需要幾個執行週期,這段時間就是所謂的 RAS to CAS Delay 時間,RAS to CAS 的時間視技術而定,大約是 5 到 7 個週期,這也是延遲的基本因素。

CL(CAS Latency):CAS 訊號需要再經過幾個 clock 之後才可以開始穩定的讀寫資料,這段時間就是所謂的 CAS Latency 時間,簡稱CL。CL=2.5 的記憶體需要 2.5 個 clock 後才能開始讀取命令與資料,而CL=3的記憶體則需要 3 個 clock 後才能開始讀取命令與資料。

依據理論來說 CL=2.5 與 CL=3 比起來,CL=2.5 的記憶體更具優勢,但還有其它的因素會影響這個數據,例如,新一代處理器的快取記憶體較有效率,這表示處理器比較少直接存取記憶體上的存取資料。再者,列的資料會比較常被存取,所以 RAS to CAS 的發生機率也大,讀取的時間也會變多,有時會發生同時讀取大量資料的情形,在這種情形下,相鄰的記憶體資料會一次被讀取出來,CAS 延遲時間只會發生一次。因此 CL 參數的大小實際上對於系統的整體效能並不會造成太大的差異。

三、如何查看 SPD 相關參數及 CL 值

CL 值可在 BIOS 選項內讀取(不建議自行修改SPD 值,此動作可能會造成系統出現不穩定情形),以下列出幾個型號的主機板 BIOS 來說明:

‧以 Lemel MBD-NB77-BL 主機板為例。

開機進入 BIOS 畫面→選擇「Advanced Chipset Features」,之後即可看到 SPD 的相關參數。

‧以技嘉 GA-8IPE1000-G 主機板為例。
開機進入 BIOS 畫面→按「Ctrl+F1」→選擇「Advanced Chipset Features」,之後即可看到SPD的相關參數。

‧以 ASUS P5S800-VM 主機板為例。
開機進入 BIOS 畫面→選擇「Advanced」→「NorthBridge SiS661FX Configuration」,之後即可看到 SPD 的相關參數。


Posted by yumiya at 痞客邦 PIXNET 留言(0) 引用(0) 人氣()

文章來源:http://www.syes.chc.edu.tw/~infor/articles/ram1.htm

 通常我們所稱的記憶體,指的是插在主機板 上的DRAM。現在我們常用的DRAM模組有SIMM 【Single In-line Memory Module;30 pin與 72 pin】與 【DIMM;Double In-line Memory Module;168 pin】

  30 pin的模組提供486以前的主機板使用;72 pin模組是目前的主流;168 pin模組則為新一代的 產品。其差異如下表所列:

種 類

30 pin

72 pin

168 pin

Bit數

8 bits

32 bits

64bits

接腳格式

SIMM

SIMM

DIMM

架 構

Fast Page

FP/EDO

EDO/SDRAM

486安裝單位

Posted by yumiya at 痞客邦 PIXNET 留言(0) 引用(0) 人氣()

1 23