2012年12月25日 星期二

何謂幀? frame?

計算照片、字畫等的單位。[1] 一個十秒鐘的畫面 定義成需要由10張圖來構成,那麼其中一張圖就是所謂的frame [2]

一個動態影像是由一連串連續的靜態影像所組成的,其中每一個靜態影像稱為幀(frame),而動態影像中每秒所包含靜態影像的數量則稱為幀(速)率(frame per second, fps)。
一般來說FPS用於描述影片或遊戲每秒播放多少影格,而赫茲則描述顯示器的畫面每秒更新多少次。[3]

而在顯示器上顯示動態影像的方式有兩種:
漸進掃描:或稱為逐行掃描。將每一幀從左至右、由上至下,逐一的將所有的畫素顯示出來。
交錯掃描:或稱為隔行掃描。將一幀圖像的奇數行畫素及偶數行畫素分開,分成為兩個場(field)。輪流掃描奇數行所構成的場及偶數行所構成的場。
因為一個場只有一個幀一半的資訊,因此在裝置處理速度無法即時的處理整個幀的資訊以及傳輸頻寬不夠即時傳輸整個幀的情形下,使用交錯掃描可以節省一半的資訊量且可以為持相同的更新率。在以往陰極射線管顯示器(Cathode Ray Tube, CRT)很難一次掃描整個螢幕,因此無法使用漸進掃描。但是因為螢幕上螢光的餘暉加上視覺暫留效應,使得交錯掃描在陰極射線管顯示器上運作的相當順利。所以廣播電視系統例如NTSC每秒59.94場,PAL則為每秒50場。
現在新式的顯示設備的速度已經夠快可以即時的處理且掃描整個幀,因此都是使用漸進掃描。但是在這些新型的顯示設備上直接播放交錯式影像會產生嚴重的閃爍現象,且因為交錯式訊號兩行只有一行有影像另一行則是全黑的,所以亮度看起來會減少一半。由於有上述這些問題,所有使用漸進掃描的新式顯示設備都需要有去交錯的功能。[4]

延伸閱讀:
Field vs. Frame[5]

圖框(Frame):
一個完全的TV影像,由兩個交錯掃瞄的圖場所構成。NTSC/EIA規格每秒有30張Frame,每個Frame有525掃瞄線。PAL/CCIR規格每秒有25張Frame,每個Frame有625掃瞄線。

圖場(Field):
TV影像的一半,由奇數線或偶數線組成。NTSC/EIA訊號規格是每秒60個262.5掃瞄線的圖場。PAL/CCIR訊號規格是每秒50個312.5掃瞄線的圖場。奇/偶圖場對再合組成Frame。

NTSC(National Television System Committee 美國國家電視系統標準協會):
美規彩色標準視訊信號,主要使用在美國、日本。NTSC每張影像使用525條掃瞄線,每秒30個Frames,每個Frame是由2個圖場以Interlace方式構成。

EIA(Electronics Industries Association 美國電子產業協會)︰
美規黑白標準視訊信號,每個Frame有525條線及2個交錯圖場,每秒有30 Frames。NTSC的黑白版本常以RS-170表示。

PAL(Phase Alternation Line 相位交錯系統):
歐規彩色標準視訊信號,歐洲是先驅使用者,也被使用在世界其他地方。PAL每張影像有625條掃瞄線,每秒有25 Frames,每個Frame是由2個圖場以Interlace方式構成。

CCIR(Consultative Committee of International Radio 國際無線電諮詢委員會)︰
歐規黑白標準視訊信號,每個Frame有625條掃瞄線及2個交錯圖場,每秒有25 Frames,PAL的黑白版本。

References:
[1] http://zh.wikipedia.org/wiki/%E5%B8%A7
[2] http://nelsonchunglife.blogspot.tw/2008/04/frame.html
[3] http://zh.wikipedia.org/wiki/%E5%B8%A7%E7%8E%87
[4] http://zh.wikipedia.org/wiki/%E5%8E%BB%E4%BA%A4%E9%8C%AF
[5] http://www.idsvision.com.tw/phpbb2/viewtopic.php?p=647&sid=1feae6efef438c41941170caa5953cb9

2012年12月18日 星期二

Smart Card

Smart Card中文名稱為智慧卡,或稱為積體電路卡(ICC:Integrate Circuit Card),是由法國人Ro-land morono 於1974年發明,將具有儲存資料及加密保護功能的電路晶片封裝於跟信用卡大小一樣的塑膠卡片中,這樣子便成了常見的 Smart Card,法國BULL公司於1976年首先製成產品並開始應用於各種領域之中。[1]

目前常見的Smart Card應用有手機內的sim卡、銀行金融卡、信用卡等。

國際標準ISO7816規範了Smart Card 規格,ISO7816文件規範說明如下:
● ISO7816-1 (Physical characteristics) :
定義物理層規範,包含Smart Card可承受工作溫度、靜電耐受度或可承受彎曲及重量等等,此一部分對於卡片製造商而言比較重要,有助於製造商選擇卡片製造材料。

● ISO7816-2 (Dimensions and location of the contacts) :
定義尺寸及連接器,包含卡片上的接腳位置及Smart Card尺寸。

● ISO7816-3 (Electrical interface and transmission protocols) :
定義電氣訊號及通訊傳輸協定。

● ISO7816-4 (Organization security and commands for interchange) :
定義了在卡片中如何使用application identifier檢查是否存在or/and狀態的應用檢索:
-連接介面上的命令交換回應
-表示卡片上的retrieval of data elements 及data objects
-表示卡片中的應用及資料結構
-表示卡片中的identifying 及addressing applications 結構
-描述卡片的工作特徵的歷史字節結構和內容
-卡片中的檔案及資料存取方式
-卡片中傳輸存取演算法
-在卡片中對於檔案及資料保密結構
-加密傳輸方式

● ISO7816-5 (Registration of application providers) :
表示如何通過國際認可授權規範以及相關定義。具有以下的功能:
-註冊方式
-相關負責機構
-描述註冊相關程序及應用部分

● ISO7816-6 (Interindustry data elements for interchange) :
2004年指定Data Elements (DEs)做為數據元素根據集成電路卡片(ICCs)。 定義了DE標識符號、名稱、描述、格式、編制程序和layout並定義了DEs檢查卡片的方式。

● ISO1816-7 (Interindustry commands for Structured Card Query Language) :
Structured Card Query Language (SCQL) 中的Interindustry commands說明。

● ISO7816-8 (commands for security operations) :
2004 年定義了智慧卡中interindustry 命令(包含接觸式及非接觸式) 可用於cryptographic operations。這些命令定義是基於ISO/IEC 7816-4中的命令列表。附錄部分提供了數位簽章範例、certificates and the import 及export of asymmetric keys。對密碼機制的用途的選擇和條件也許影響卡片exportability,運算法及匯流排內容則不屬於ISO/IEC 7816-8內容。

● ISO7816-9 (Commands for card management) :
定義了智慧卡中interindustry命令(包含接觸式及非接觸式)的檔案管理,如檔案新增或刪除等。這些命令包含了卡片中entire life cycle及其他發佈使用時的命令。附錄的部份則是提供如何控制讀取(保密傳輸)卡片上的資料,意指在加密狀況下傳送及驗證資料,如code、 keys及applets。

● ISO7816-10 (Electronic signals and answer to reset for synchronous cards) :
這章節定義了智慧卡從介面到裝置同步傳輸時的電源、訊號以及重置結構。

● ISO7816-11 (Personal verification through biometric methods) :
這章節定義了在智慧卡中關於personal verification through biometric methods的interindustry commands與data objects使用方式。
interindustry commands定義請參閱ISO/IEC 7816-4. data objects 國際標準化定義請參閱ISO/IEC 19785-1。ISO/IEC 7816-11 也提供了關於註冊、驗證及位址保密的範例。

● ISO7816-12 (USB electrical interface and operating procedures) :
這章節定義了智慧卡在USB介面中的操作條件,一張使用USB介面的智慧卡稱為USB-ICC
ISO/IEC 7816-12 : 2005年定義了下列部分:
-USB-ICC電氣特性條件,當USB-ICC以介面方式進行操作。
-標準USB描述以及USB-ICC等級描述。
-在HOST及USB-ICC之間傳輸資料時,關於巨量傳輸及控制傳輸說明。
-進行控制傳輸時允許兩種不同的匯流排版本。
-表示非同步狀態下的中斷傳輸狀態以及錯誤條件。
ISO/IEC 7816-12 : 2005年針對控制傳輸提供了兩種協議版本,一種為支援protocol T=0 (version A)另一種為transfer on APDU level (version B)。本章節也為USB-ICC中各種傳輸提供說明圖表(巨量傳輸,控制傳輸,version A和version B)。USBICC一定能處理可能的序列的舉例子在情報附錄。ISO/IEC 7816-12 : 2005年為控制轉移提供二個協議。這是為了支持協議T=0 (版本A)或在APDU水平(版本B)上使用調動。USB-ICC提供說明圖表為每一調(批量轉移,控制轉移版本A和版本B)。附錄中提供了USB-ICC範例。

● ISO7816-13 (Commands for application management in multi-application environment) :
本文介紹在開發Global Platform 標準相關事項,例如安全通道協議。

● ISO7816-15 (Cryptographic information application) :
定義智慧卡應用。關於密碼功能的應用。2004年定義了針對密碼訊息和共享機制的共同的
語法(在ASN.1)和格式。
ISO/IEC 7816-15 : 2004年支援以下功能:
-在智慧卡中儲存多組密碼。
-使用密碼訊息
-Retrieval密碼訊息
-DOs在ISO/IEC 7816定義了最適當的Cross參考密碼信息
-Different認證機構
-Multiple密碼算法
-Cross-referencing of the cryptographic information with DOs defined in ISO/IEC 7816 when appropriate.


References:
[1] http://www.zeroplus.com.tw/software_download/200908ZEROPLUS_iso7816.pdf
[2] ISO7816 standard: http://www.cardwerk.com/smartcards/smartcard_standard_ISO7816-1.aspx

2012年12月14日 星期五

台灣數位電視 DVB-T

台灣數位電視頻率區段 [1]
533 (MHz)
中視
中視
中視新聞台
中視綜藝台


545 (MHz)
公視
公視
DIMO
客家電視台


557 (MHz)
民視
民視
民視交通台
民視新聞台
民視HD(MLB)台


569 (MHz)
公視
HiHD


581 (MHz)
台視
台視
台視財經台
台視健康台


593 (MHz)
華視
華視
華視教育台
華視休閒台


Q&A
1) VHF與UHF電視頻道有何區別?[2]
VHF(Very High Frequency特高頻) 與UHF (Ultra High Frequency超高頻) 為電視頻段的名稱, VHF又分低波段、 中波段、高波段 三種。 因波段不同,使用的天線也不同。 無線電視節目收視者必需依照 各 電視台頻段安裝正確的天線,才能穫得最佳收訊效果 。以我國為例,民視類比頻道為 VHF低波段,台視、中視、華視類比頻道為VHF高 波段 ,公視類比頻道為UHF 。 各電視台的數位頻道則全部位於UHF頻段

References:
[1] http://www.starchina.com.tw/subpage/column/sub/sub2.htm
[2] http://web.pts.org.tw/~web01/PTS/q1.htm

2012年12月13日 星期四

時間計算:GMT, UTC

GMT(Greenwich Mean Time,GMT)[1]
格林尼治平時(又稱格林尼治平均時間或格林尼治標準時間,舊譯格林威治標準時間;英語:Greenwich Mean Time,GMT)是指位於英國倫敦郊區的皇家格林尼治天文台的標準時間,因為本初子午線被定義在通過那裡的經線。
自1924年2月5日開始,格林尼治天文台每隔一小時會向全世界發放調時信息。
理論上來說,格林尼治標準時間的正午是指當太陽橫穿格林尼治子午線時(也就是在格林尼治上空最高點時)的時間。由於地球在它的橢圓軌道裡的運動速度不均勻,這個時刻可能與實際的太陽時有誤差,最大誤差達16分鐘。
由於地球每天的自轉是有些不規則的,而且正在緩慢減速,因此格林尼治時間已經不再被作為標準時間使用。現在的標準時間,是由原子鐘報時的協調世界時(UTC)。

UTC(Universal Time, Coordinated)[2]
世界統一時間,又稱世界標準時間或世界協調時間,簡稱UTC(從英文「Coordinated Universal Time」/法文「Temps Universel Cordonne」而來),是最主要的世界時間標準,其以原子時秒長為基礎,在時刻上盡量接近於格林尼治平時。中國大陸採用ISO 8601:2000的國家標準GB/T 7408-2005《數據元和交換格式 信息交換 日期和時間表示法》中亦稱之為協調世界時。台灣採用CNS 7648的《資料元及交換格式–資訊交換–日期及時間的表示法》(與ISO 8601類似)稱為世界統一時間。

這套時間系統被應用於許多網際網路和全球資訊網的標準中,例如,網路時間協議(Network Time Protocol,NTP)就是世界統一時間在網際網路中使用的一種方式。
在軍事中,協調世界時區會使用「Z」來表示。而在航空上,所有使用的時間劃一規定是協調世界時。而且Z在無線電中應讀作「Zulu」(可參見北約音標字母),世界統一時間也會被稱為「Zulu time」。比如說飛機在香港時間下午六時正起飛,就會寫成1000z,又或者讀作「1000Zulu」。

References:
[1] http://zh.wikipedia.org/wiki/GMT

2012年12月10日 星期一

CAS - 世界級主流廠商

CAS - 世界級主流廠商[1]
鎖碼系統(Conditional Access System,CAS,亦稱之為「條件接收系統」)為將數位電視節目於播送之前加入特殊資料以控制電視節目可否接收之技術,亦即為付費電視之基礎控制。鎖碼系統使用晶片卡或其他存取媒介存放並交換密碼資料,有時亦需使用回傳通道進行雙向確認。DVB CAS 主要包含擾碼(Scramble)與加密(Encryption)二部份,但 DVB 對於二部份均無強制定義。因此,基本上依擾碼方式不同而有所謂開放式(採用 DVB 標準擾碼規範者)或私有式鎖碼系統(採用私有擾碼技術者),惟經數年發展後私有式鎖碼系統已所存無幾。以下為數家較大型 DVB 鎖碼系統之簡介,依字劃排列。

a. Conax
原為 Telenor 所開發,目前已經北歐、東歐與亞洲不少電視廣播業者所採用,惟因大部份非大型媒體集團,訂戶數尚未擴大。
http://www.conax.com/

b. CryptoWorks
為飛利浦(Philips)所開發,目前已由數家歐亞電視廣播業者採用。
但已於2006年3月被Irdeto給收購[5]

c. Irdeto
為 Irdeto 公司所開發,屬 Multi-Choice 媒體集團 CAS 之翼,目前主要由 Multi-Choice 集團相關之業者與中央電視台所採用。因 Multi-Choice 進入衛星數位電視廣播極早,訂戶數屬於前五大鎖碼系統之一。
http://irdeto.com/

d. Multi2
基本上由 Hitachi 為日本所專門開發,最大不同點為擾碼機制(Hitachi於1995年開發出MULTI 2加密演算法[2]),目前為日本國家規範,僅於日本使用。

e. NagraVision
屬 Kudelski 集團所開發,目前已經歐洲、美國與亞洲不少電視廣播業者所採用,其客戶僅美國 Dish*Network(EchoStar)為(超)大型業者,訂戶數屬於前五大之一。
http://www.nagra.com/dtv/

f. NDS
為紐斯集團(News Corp)旗下之 News Digital System 所開發,目前已經歐、亞、美數家電視廣播業者所採用,惟除了紐斯集團與 DirecTV(據悉亦將為紐斯集團所購併)之外,其他電視廣播業者極少。依靠紐斯集團與 DirecTV,訂戶數可能為前五大之首。
但於2012.3被CISCO給併購[3]
http://www.nds.com/

g. SECA/MediaGuard
為 CanalPlus 所開發,目前有歐洲數家電視廣播業者採用,惟大部份均屬 CanalPlus 集團,訂戶數亦屬前五大之一。MediaGuard 已為 NagraVision 所購併。

h. Viaccess
為法國電信子公司 Viaccess 所開發,目前已由歐、亞洲不少電視廣播業者所採用,訂戶數屬前五大之一。
Viaccess於2012.6併購Orca Interactive(Orca Interactive為間做IPTV的middleware公司)[4]
http://www.viaccess.com/


References:
[1] http://img.cowell.com.tw/sugar/visson/chinese/technology_005.htm
[2] http://ppt.cc/Jzrq
[3] http://ppt.cc/kNIu
[4] http://www.prnasia.com/story/63157-2.shtml
[5] http://www.rti.cn/info.asp?id=200603060006

2012年12月6日 星期四

IC Package

LQFP (Low-Profile Quad Flat Pack)
QFP(四方扁平封裝)實現了增加端子數及低熱阻等高階功能,作為一種低成本的積體電路封裝技術而備受關注。

LQFP
LQFP(小外形四方扁平封裝)封裝的晶片承載盤直接露在封裝外部,再將外露的承載盤直接組裝到主機板上,透過主機板增強散熱功能,從而滿足低熱阻的要求。
PBGA(Plastic Ball Grid Array)塑膠球閘陣列封裝

封裝方式的演進與未來
http://bbs3.nsysu.edu.tw/txtVersion/treasure/mis92tech/M.971501571.A/M.974595844.A.html

IC封裝術語簡介
http://bbs.smthome.net/simple/?t218621.html

2012年11月29日 星期四

AVS? MPEG-4? H.264?

AVS(Audio Video coding Standard),即數字音視頻編解碼技術標准,為中國第二代信源編碼標准。[1]

AVS(Audio Video coding Standard)為中國具備自主知識產權的第二代信源編碼標准,此編碼技術主要解決數字音視頻海量數據(即初始數據、信源)的編碼壓縮問題,故也稱數字音視頻編解碼技術。目前國際上音視頻編解碼標准主要兩大系列:ISO/IEC JTC1 制定的MPEG系列標准,ITU 針對多媒體通信制定的H.26x系列視頻編碼標准,和G.7系列音頻編碼標准。1994年由MPEG和ITU合作制定的MPEG-2為第一代音視頻編解碼標準的主要格式,是目前國際上最為通行的音視頻標准。

經過十年多演變,音視頻編碼技術產生了巨大的變化,後起之秀輩出。目前音視頻產業可以選擇的信源編碼標准有四個:MPEG-2、MPEG-4、MPEG-4 AVC(簡稱AVC,也稱JVT、H.264)、AVS。從制訂者分,前三個標準是由MPEG專家組完成的,第四個是中國自主制定的。從發展階段分,MPEG-2是第一代信源標准,其餘三個為第二代標准。從主要技朮指標—編碼效率比較:MPEG-4是MPEG-2的1.4倍,AVS和AVC相當,都是MPEG-2兩倍以上。

AVS標準是《信息技術 先進音視頻編碼》系列標準的簡稱,AVS標准包括系統、視頻、音頻、數字版權管理等四個主要技朮標准和一致性測試等支撐標准。在2003年12月18日-12月19日舉行第7次會議上,工作組完成了AVS標準的第一部分(系統)和第二部分(視頻)的草案最終稿(FCD),和報批稿配套的驗証軟體也已完成。2004年12月29日,全國信息技術標准化技術委員會組織評審並通過了AVS標准視頻草案。2005年1月,AVS工作組將草案報送中國信息產業部。3月30日,中國信產部初審認可,標准草案視頻部分進入公示期。2004年度第一季度(第8次全體會議)正式開始「數字版權管理與保護」標準的制定,目前已近尾聲。2005年初(第12次全體會議)完成了第三部分(音頻)草案。


AVS與H.264相比,主要具有以下特點:
1.AVS的性能高,與H.264的編碼效率相當。
2.AVS的複雜度低,編碼複雜度比H.264明顯低,軟硬體實現成本都低於H.264。
3.AVS編碼技術為中國主導的知識產權,專利授權模式簡單,費用較H.264低。


H.264延伸閱讀[3]:
H.264/MPEG-4(AVC)

H.264因其是藍光的一種編解碼標準而而著名,所有藍光播放器也都必須要能解碼H.264。也被廣泛應用於Youtube, itune store, or DVB-S, C, T, T2的環境中
在台灣以DVB-T數位電視廣播格式進行高解析度無線數位電視頻道,採用H.264/MPEG-4 AVC作為視訊編碼格式,而其中包括了以下的電視台:

公共電視(PTS) (HiHD)
民間全民電視(FTV) (民視HD)
中國電視台(CTV)(中視HD台)
台灣電視台(TTV)(台視HD台)
中華電視台(CTS)(華視HD台)

Multiview Video Coding, MVC
於2009年11月完成,為3D立體視訊編碼的重要關鍵。據H.264/AVC附件H,MVC使得碼流結構可以表達一個視訊場景的不止一個檢視。MVC的工作中開發了兩個配置:多檢視高配置(Multiview High Profile)支援任意數量的檢視,立體高配置(Stereo High Profile)是為雙檢視立體視訊特別設計的


References:
[1] http://zh.wikipedia.org/wiki/AVS
[2] http://tech.sina.com.cn/focus/AVS_05_CN/index.shtml
[3] http://zh.wikipedia.org/wiki/H.264
[4] http://baike.baidu.com/view/403562.htm

2012年11月23日 星期五

MPEG-2的同步--STC,PCR,DTS,PTS

PTS:Presentation Time Stamp
DTS:Decoding Time Stamp
PCR:Program Clock Reference
SCR:Ststen Clock Reference
STC:System Time Clock

1. SCR
SCR是存在於PS中的,即PS的pack裡面的一個field。SCR用來提供decoder一個時間基準點。

2. ESCR
ESCR是位於PES裡面的,即PES的header裡面可能會有,當PES的packet要表示一個PES stream的時候,PES packet裡面的ESCR就表示這個PES packet的所期望的到達decoder的時間。

3.PCR
PCR是TS裡面的,即TS packet的header裡面可能會有,他用來提供該TS packet到達decoder的時間,他的作用於SCR類似。

4. DTS, PTS
對於一個ES來說,比如視頻,他又許多I,P,B幀,而P, B幀都是以I,P幀作為參考。由於B幀是前向後向參考,因此要對B幀作decode的話,就必須先decode該B幀後面的P,或者I幀,於是,decode的時間與幀的真正的present的時間就不一致了,按照DTS一次對各個幀進行decode,然後再按照PTS對各個幀進行展現。 

有時候PES header欄位也會有DTS,PTS,對於PTS來說,他代表了這個PES包得payload裡面的第一個完整地audio access unit或者video access unit的PTS時間(並不是每個audio/video access unit都帶有PTS/DTS,因此,你可以在PES裡面指定一個,作為開始)。 

PES header的DTS也是這個原理,只不過注意的是:對於video來說他的DTS和PTS是可以不一樣的,因為B幀的存在使其順序可以倒置。而對於audio來說,audio沒有雙向的預測,他的DTS和PTS可以看成是一個順序的,因此可一直採用一個,即可只採用PTS。

Reference:
[1] http://hi.baidu.com/yanl_cn/item/7619041421bdb10cd1d66d3b

2012年11月9日 星期五

Linux - Kernel panic

Kernel panic的意思是指,OS遇到了一個內部的錯誤,這個錯誤並沒辦法被安全的修復起來,而導致沒辦法繼續運行,可能必須重新啟動才行。有點像Windows 的藍屏死機。

而造成Kernel panic的原因,大多是是擴充記憶體出現問題,但亦有可能是其他硬體產生。在嵌入式系統環境下,可用的memory空間往往不夠,因此一旦kernel編譯出來,必需要去指定該用多少空間,不然一旦超出範圍,就一下子就當了。


Note:
以我這次遇到的狀況是版子上電壓偏差過大(ex. 原本腳位是3.3V的設計,但實際用電表量後只剩下2.2V),所以導致CPU無法R/W FLASH導致問題產生。

2012年10月12日 星期五

VC++ - char[]轉CString

CString m_bKeyName;
char key_file[256]

/* copy from char[] to CString */
m_bKeyName = key_file;

Reference:
http://www.programmer-club.com.tw/ShowSameTitleN/vc/14293.html

MFC - Checkbox

/* IDC_CHECK_1: check box's ID */
CButton* bCheck1Obj=(CButton*)GetDlgItem(IDC_CHECK_1);

if(bCheck1Obj->GetCheck() == BST_CHECKED)
{
          /* current state is checked. */
}
else if(bCheck1Obj->GetCheck() == BST_UNCHECKED)
{
         /* current state is un-checked. */
}
else
{

}

/* 改變checkbox的state, 用SetCheck() */
bCheck1Obj->用SetCheck(BST_CHECKED); /* 選取checkbox */


bCheck1Obj->用SetCheck(BST_UNCHECKED); /* 選取checkbox */

Reference:
[1] http://mqjing.blogspot.tw/2007/04/mfc-checkbox.html
[2] http://msdn.microsoft.com/en-us/library/31deb72x(v=vs.80).aspx

2012年9月12日 星期三

HDMI CEC


HDMI CEC(Consumer Electronics Control, CEC)

高畫質多媒體介面(HDMI)是一個廣為人知的數位傳輸技術,其重要性可說是視聽器材的革命。但是大部分的人都只知道它的最新1.3版本規格,傳輸速度最快可達10.2Gbit/s以支援更大的頻寬,再加上最高到48位元的色深(Deep Color)功能。

但深究其十九支接腳,卻有一個常被大家所忽略的第十三支接腳,也就是消費性電子控制(Consumer Electronics Control, CEC)功能。CEC是在1.0版本時被制定,但直到1.2a時才完全確認及提出測試規範。其基本原理和技術來自歐洲的SCART,而在HDMI採用並增強其功能。
CEC為單線雙向傳輸,使用顯示數據通道(Display Data Channel, DDC),以用來進行影音器材彼此控制和偵測,旨在減少遙控器的數量和使用者按下按鈕的次數。在HDMI從上而下連接的網路架構下,CEC可以允許裝置透過直接連接或非直接連接方式溝通,顯示裝置原則上會被認定為根(Root),而切換器(Switches)則為分支(Branches),至於其他的播放裝置則會定義為葉(Leaf)節點。

舉例來說,使用者可以進行如圖6般的混合性裝置連接,當用戶將影片放到DVD播放器之中,並按下播放鍵之後,接下來的事就由CEC來處理。CEC將會自動開啟相關連的裝置,遠端控制DVD播放器的聲音輸出到喇叭,在遠端遙控影片內容到輸出端。同樣的,隨著用戶在機上盒切換頻道,節目內容的影像與聲音也都會自動取代DVD的聲音與影像。接著,一旦用戶按下錄影鍵的同時,在整個網路中扮演Root角色的電視機,也就會自動將錄影的命令傳達給錄影機,包括頻道、時間,以及錄影的格式都同時提供,讓錄影機有詳細資訊可以遵從,並進而將正確的影像錄進錄影機中。簡單的說,CEC在HDMI的系統當中,開創了自動化的裝置搜尋和簡易One Touch操作體驗。如表1為每一個HDMI系統連接裝置所對應的邏輯位址(Logic Address)編號,從0~15一共十六種不同的裝置識別,Reserved位址則是保留給以後使用。

在實際狀況中,HDMI架構共有三條資料傳輸通道(圖7),每個資料通道傳輸10位元資料長度,在1.3版本之前,由於8位元轉換成10位元直流平衡(DC-balanced),因此每色階畫素最多可支援24位元。但在1.3版本之後,開始支援24、30、36、48色階,另外還有一條時脈通道。而CEC走的是I2C規格的DDC通道。

CEC特色多元

規格書當中描述的CEC特色歸類為幾種,第一是One Touch Play,允許只要按下一鍵就可以使裝置被播放或成為活動資源(Active Source);二是系統待命(System Standby),讓使用者可以隨意切換任一或全部的裝置,並進入待機模式;至於One Touch Record則允許使用者可以看到什麼就錄什麼;還有計時器編程(Timer Programming),允許使用者可以透過電子節目清單(EPG)或其他方式去設定錄影機的預錄功能;Deck Control則利用裝置去控制另一台裝置進行播放或是快轉;常見的裝置選單控制(Device Menu Control),意指利用顯示設備上的使用者介面去控制另一台裝置;遙控傳遞(Remote Control Pass Through)則是將遙控器的控制命令,透過HDMI連接介面傳到另外一台裝置以直接控制;系統音訊控制(System Audio Control)是利用電視遙控器去控制音訊擴大機的音量,或是一些其他的基本切換功能。

從2006年開始,支援CEC的電視和錄影機巳經慢慢在市場上普及。不過很遺憾的,雖然打著CEC的名號,但各家幾乎沒有相容性可言,並不支援其他廠牌,更連名字都不相同,消費者並不清楚哪些才是真正的CEC。

由於夏普內建的i.LINK端子已不再像以往提供雙向的功能,而是改採i.LINK In/HDMI Out的方式,因此沒有HDMI的裝置在錄完影以後就要透過類比色差端子來看,而無法像以前一樣使用數位的i.LINK來觀賞節目。此外,該產品的單鍵播放功能、Deck Control尚稱正常,但UI的Menu Control功能卻因設定困難,因此不能算是完整的CEC產品,充其量不過是利用CEC讓自家廠牌的產品具有連動功能。

至於松下就更乾脆,在新款錄影機中直接取消i.LINK接頭。不過,值得一提的是,該產品的Remote Control切換得很平順,其Remote Control Pass Through幾乎可以控制大部分重要按鍵。只可惜,在Deck和Menu部分的控制,也只支援部分錄影和播放的功能。可能是因為這部分的功能,牽連到的相容性問題很大,所以目前在業界並沒有看到業者支援。

然而,CEC理應極為重視相容性,因為在未來CEC極有可能成為器材溝通的協定,而不同產品之間能否順利溝通,對消費者來說同樣重要,因此,對廠商來說,投入心力在相容性測試,確保產品的相容度也將是刻不容緩的課題。

References:
[1] http://www.2cm.com.tw/technologyshow_content.asp?sn=0803130006
[2] http://www.2cm.com.tw/coverstory_content.asp?sn=1006020001
[3] http://weng32002.blogspot.tw/2011/11/hdmi-cecconsumer-electronics-control.html

2012年8月30日 星期四

DMA, Direct Memory Access

三種將資料在I/O間傳送的方法有
1. Polling
2. Interrupt-driven I/O
3. DMA(Direct Memory Access)

Polling:最簡單的方式讓I/O device與CPU溝通。I/O device只要將information放進status register,CPU會周期性的檢查並取得information來得知需要服務的device。
Interrupt-driven I/O:利用interrupt的機制,當一個I/O device需要服務時,會發出interrupt來通知CPU。一個I/O interrupt對於指令的執行是asynchronous,Control unit需要在執行一個新指令時檢查是否有pending I/O interrupt。I/O interrupt也會傳達更多訊息,如哪個device發出的interrupt和它的priority。

DMA(Direct Memory Access):提供一個device controller,讓I/O device能夠直接在記憶體做資料的傳輸,不需要CPU的參與。
在同等程度的處理器負擔下,DMA是一種快速的資料傳送方式。很多硬體的系統會使用DMA,包含硬碟控制器、繪圖顯示卡、網路卡和音效卡。

DMA transfer的三個步驟
1. CPU要初始化DMA controller,包括提供I/O device的名稱、執行何種運算、記憶體位置以及所要傳送的bytes數。
2. DMA開始運作。如果request需要多於一次的transfer在bus上,DMA unit會產生下一個memory address和初始下一次的transfer。
3. 一旦DMA transfer完成,DMA controller發出一個interrupt給CPU。

References:
[1] http://zh.wikipedia.org/wiki/DMA
[2] http://blog.yam.com/yuhaolin/article/725974

1080P? 1080i?

1080p: 逐行掃描 progressive scan
1080i: 間隔掃描 interlaced scan

1080i 是一種高清晰度電視信號格式,「1080」表示垂直方向有1080條水平掃描線,「i」表示採用交錯式掃描視頻顯示方式(interlaced scan)。
1080i 先掃描單數的垂直畫面,再掃描雙數的垂直畫面,故只需要1080p一半的頻寬,
但是碰到高速移動的物體時,物體周圍就有晃動現象。早期的高清析度電視都是這種規格,因為早期的頻寬較小,無法一次送出全部,故用這種方式一次送一半來減少頻寬。

1080p(Progressive scan),則是逐行掃描(progressive scan) ,是因現在頻寬較大而延伸出來的傳輸方式。

1080p是一種視頻顯示格式。字母p意為逐行掃描(progressive scan) ,有別於1080i的interlaced scan(隔行掃描)。數字1080則表示垂直方向有1080條掃描線。通常1080p的畫面解析度為1920×1080,即一般所說的高清晰度電視。

ex. 假設2台 畫格都是每秒60張,也就是畫面更新頻率為60Hz
為什麼呢? "逐行掃描"的意思是,在更新頻率為60Hz的條件下,每秒對整個螢幕做60次的掃描,簡單的說就是,每秒顯示60張1920x1080的"照片",而這60張不同的照片在人的眼中就成了電影.動畫.

而"隔行掃描"的意思是,在更新頻率為60Hz的條件下,每秒對整個做60次的掃描,跟p不同的是:他是交錯掃奇數行或偶數行(垂直),也就是說1080行裡,他每次只掃540行,但 畫面大小是不變的,所以垂直的部分被"拉大了",所以1080i的解析度 事實上在單一掃描畫面只有1920x540.
對於平板電視,實際上可以認為沒有1080i和1080P的區別,因為目前圖像處理電路技術發展非常快,運算速度非常快,處理能力非常強,均具有倍線技術。所謂倍線技術就是把隔行的1080i的圖像處理成逐行的1080P的圖像,可以把1080/50i完美處理成1080/50P,1080/60i處理成1080/60P,包括1080/24P的節目,更可非常輕鬆地處理為1080/50P或 1080/60P。而且任何一台平板電視都有這種電路,稍微高檔的平板電視處理效果都不錯。

References:
[1] http://www.speedyou.com/CVR/XR-1080/1080P1080i.htm
[2] http://inspire.twgg.org/audio-a-video/video/item/123-understanding-of-high-definition-hd-teach-you-identify-differences-between-720p-1080i-and-1080p.html

2012年8月27日 星期一

C語言 - #include<> vs. #include” ”

#INCLUDE 前置處理有兩種形式:

<1> #INCLUDE <檔名>:
指示 compiler 只到系統的INCLUDE目錄去找要含括的檔案。這種形式主要適用來函括標準函式庫的標頭檔。EX: #include < aa.h >

<2>#INCLUDE "檔名":
指示compiler 先到目前的工作目錄去找,若找不到,再到系統的INCLUDE目錄去找。
EX: #include "Userdef.h"

Reference:
http://tw.myblog.yahoo.com/josh-chang/article?mid=1406&next=1348&l=f&fid=8

2012年6月16日 星期六

C語言 - gcc: warning: no newline at end of file


C++標準規定,一個源文件,除非是空的,否則最後一行必須是空行。這不是為了語法分析,而是為了連接文件的時候方便。

解決方式:試著在程式最後一行多按一個enter,存檔即可解決


References:
[1] http://cross-script.blogspot.tw/2011/07/gcc-warning-no-newline-at-end-of-file.html
[2] http://luabear.blogspot.tw/2009/04/warningno-newline-at-end-of-file.html
[3] http://blog.xuite.net/casio515/blog/21528505

2012年6月3日 星期日

C語言 - 簡單小考題(2) - C強制轉型

What's the output in this function?

void foo(void)
{
    unsigned int a = 6;
    int b = -20;
    (a+b > 6) ? puts("> 6") : puts("<= 6");
}


The answer is "> 6"
Why?

原因是當表達式中存在有符號類型和無符號類型時所有的操作數都自動轉換為無符號類型(unsigned)。因此-20變成了一個非常大的正整數,所以該表達式計算出的結果大於6

Reference:

C語言測試 想成為嵌入式程序員應知道的0x10個基本問題

C語言測試 想成為嵌入式程序員應知道的0x10個基本問題 (某網友找到的中文翻譯)

網路上找到的,有些還不太確定= =..... 真糟糕 加油加油

2012年5月31日 星期四

CAS (Conditional Access System)

CAS,有條件接收係統
CAS的組成包括有:用戶管理係統SMS、業務信息生成係統SIG、節目管理PMS/SI編輯係統、節目調度處理EIS、用戶授權管理係統SAS、條件接收CA等。統稱來說可分成兩大塊:一塊是管理用戶的SMS,一塊是管理節目的CA。

至於CA可以分為信號加擾(Scramble),以及加密兩大部分,加密是採用多層加密的技術,所以又可以分為兩個階段ECM以及EMM

CA大致的運作原理:

發送訊號端而言,可以透過一個隨機碼產生器產生一個隨機碼(稱為CW),來使訊號作加擾(Scramble),相對在客戶端也要有這個CW才有辦法把它解擾(De-scramble)出來,所以CW就要想辦法送到客戶端,但如果明文和Scramble的訊號一起送出去的話會有被hacker的可能,所以需要加密

這邊採用所謂的SK來幫CW加密。SK又可以稱為月密鑰,通常會是每月換一次或者也可依需求,每換一次SK,系統都要重新對所有用戶進行授權。這樣是第一次的加密,加密完的CW稱之為ECM。ECM包含了時間、節目價格、節目授權控制等訊息。so ECM包含了節目的管理訊息

第二層則是用PDK(節目密鑰)幫SK加密,產生的密文和從SAS(用戶授權管理)獲得的授權指令透過SAS(用戶授權管理系統)生成的授權訊息所組成,稱為EMM。EMM含有智能卡號、授權時間、授權等級等用戶的資訊。所以EMM是包含了用戶的管理訊息

透過這兩層的加密後後再把Scramble的Stream和ECM、EMM三個一起MUX後給送出去, 這三樣組成了CA最基本的加密系統。

至於用戶端(Set-Top-Box)檢測到DVB碼流如果是加擾碼流,則驅動讀卡器工作,將智能卡管理程序調入中央處理器啟動運行,將智能卡的卡號讀出。在傳送流中尋找PSI,在PSI中找到條件接收表CAT,根據CAT表中給出的EMM包標識碼(PID),找到相應的EMM信息,然後將智能卡的卡號與EMM內的授權信息中的卡號進行校對,也就是進行尋址比較操作,如果校對無效,在屏幕上將有提示你還未經授權不能收看的相關信息顯示。

Reference:
[1] http://www.autooo.net/utf8-classid105-id79475.html

2012年5月30日 星期三

DVR / PVR

DVR(Digital Video Record) 又可以稱為PVR(Personal Video Record)。主要用在提升家庭娛樂功能,爲消費者提供一種簡易的錄制、觀看和掌控電視。[1]

DVR是一個將影像以數位格式錄製到硬碟(HDD)或其他可存儲設備的裝置,它通常是一個獨立機上盒(STB),有時包含燒錄影片進各種光碟的燒錄機,有的可以用軟硬體連接在PC上以便從磁碟編輯和播放視訊。一些電子產品製造商也已經開始生產帶有內建DVR的電視。[2]
STB的功能通常可以做到可同時邊看A台邊錄B台,但限制這兩台必須再同一個頻點(一個頻點可帶三台的訊號),而有些進階版的STB為了能做到跨不同頻點的節目同時錄跟看,所以有雙Tuner的設計。

References:
[1] http://tc.wangchao.net.cn/baike/detail_238392.html
[2] http://zh.wikipedia.org/zh-tw/%E6%95%B0%E5%AD%97%E8%A7%86%E9%A2%91%E5%BD%95%E5%83%8F%E6%9C%BA

EPG(Electronic Program Guide)

EPG, Electronic Program Guide, 可以提供符合數位電視DVB規範之節目資訊,內容包括節目播出時間、節目名稱、節目簡介、節目分級(rating)、節目分類(content descriptors)等等。

2012年5月29日 星期二

TS (Transport Stream)

數位電視廣播DVB之影像傳輸(MPEG2 Data Stream)基本架構介紹 [2]
/* 這篇寫的還蠻清楚的,新手(like me)可以多看幾次反覆咀嚼一下概念 */

基本上數位電視廣播DVB在影音傳輸的型式是以TS(Transport Stream)的型式來傳送至發射機,然後透過RF機制發射訊號,將電視節目發送至每位收視戶來收看。在影音訊號部份是經由先前所說因為RF的傳送機制傳送資料量的限制與要做到自我錯誤更正的能力,所以我們必須將影音訊號做壓縮與封包化的處理。因此我們將經由攝影機所擷入下來的影音經由壓縮與封包化產生PES,但PES還不是數位電視廣播DVB傳輸的最終格式,所以我們必須再將PES經由訊號的處理將它放進不同的Transport Stream內。

經由MPEG2的壓縮技術壓縮後所產生的訊號我們稱之為ES (Elementary Stream)訊號。此時經由MPEG2壓縮後所產生的ES訊後是連續性的,為了使這些訊號具有自我錯誤的更正能力,所以我們必須將ES訊號做封包化(Packetized),ES訊號再經由封包化處理後將產生的訊號我們稱之為PES
MPEG PES mapping onto the MPEG-2 TS [1]

MPEG-2 Transport Stream header[1]
MPEG2 Transport Stream其資料長度為188 Byte,其主要分為兩大部份。第一部份為資料頭端Header的部份,佔了4 Byte的長度,其主要所提供的資訊有發射端與接收端同步的Sync  Byte=47hex、錯誤指示、Stream封包識別等資訊。在第二部份為傳送資料payload的部份其長度為184 Byte。此外在payload還包含了”Option adaptation field”,其中有一個重要的參數為PCR。PCR主要應用為在發射端與接收端需要做同步的27MHz的計數參數。



Reference:
[1] http://www.erg.abdn.ac.uk/future-net/digital-video/mpeg2-trans.html
[2] http://www.rohde-schwarz.com.tw/precompiledweb/BoxDetail.aspx?LibraryID=2

STB(Set-top-Box)

STB即機上盒(set-top box;或譯為視訊轉換盒)的簡稱,是用以轉換電視訊號的設備,包括有線電視(Cable)、衛星(Satellite)、地面廣播以及網路(IP/DSL)等幾種型態。過去機上盒僅具備單向類比視訊接收功能,提供選台、頻道解/鎖碼,但現在逐漸往付費收看CA(Conditional Access)/* 相對就是免費收看 FTA(Free to Air) */、OTT(Over The Top)、IP STB互動多媒體方向演進。[1]

STB元件組成 [2]
STB裡面由主要的幾個區塊所組成:前端,解密,影音訊號解碼,記憶體,回傳途徑以及聯結周邊的相關界面,分述如下:

Front-end(前端),包含Tuners以及Demodulator
前端是由調諧器及解調變器所組成,將射頻訊號轉換成數位校準資料流,也可稱為傳送流(TS);數位解調變在有線電視廣播是使用QAM,(衛星廣播為QPSK,地面廣播則為COFDM)。現今前端的元件可以一起裝在調諧器金屬盒中,這樣的調諧器通常稱為NIM。[2]

調節器(Tuners):
接收類比(或數位)廣播或有線電視節目訊號,並將頻率調整至正確的頻道,目前多以Tuner Box(Metal Can Tuner)的方式來用,未來Tuner漸漸以Silicon Tuner build–in 到電路板趨勢

數位解調器(Demodulator):
從Tuner接收訊號,將輸入的順號進行解調,進行頻道校正,頻道同步化,FEC(向前除錯),頻道編碼,向前除錯(FEC)等動作。

Back-end(後端),包含A/V Decoder:
音頻╱視頻解碼區塊可稱為後端,後端包含了傳送流解多工器,音頻視頻解碼器,數位視頻編碼器,數位類比轉換器(DAC),中央處理器以及內建記憶體。由於後端已經有系統整合單一晶片量產,所以接下來就以簡短的敘述晶片中的各區塊。[2]
傳輸分工器(Transport Demultiplexer):
將解調後的訊號經由分工器處理輸出MPEG數位影像及杜比數位音效(Dolby Digital)資料流。

OSD(On Screen Display)螢幕顯示:
機頂盒內含的螢幕顯示OSD將視頻影像和軟體所產生的圖形重疊,OSD的顯示優先權高於MPEG視頻訊號,它可以設定在子畫面的前面或後面。此外,為因應網際網路瀏覽和多媒體應用的需求,機頂盒因而需要繪圖處理器,處理器將網際網路的檔案格式以及自訂互動式的電視檔案格式轉換成為繪圖檔案,然後和視頻訊號重疊而呈現在電視畫面。[2]


References:

2012年5月28日 星期一

DVB Introduction

/* 開始整理些工作上會遇到的一些名詞跟解釋, */


DVB, Digital Video Broadcast 數位視訊廣播,由「DVB Project」維護的一系列為國際所承認的數位電視公開標準。[1]


MPEG, Moving Pictures Experts of Group, 它是一個針對處理動態數位影像的組織。在數位電視廣播DVB影音訊號處理的部份就應用了MPEG的影音壓縮技術,在MPEG的影音壓縮技術中,依照不同的應用有不同的壓縮技術種類,例如:MPEG1、MPEG2、MPEG4、MPEG7、MPEG21

CA vs. FTA

數位電視 vs. 傳統類比電視的差異

STB(Set-top-Box)重要元件
  • STB常見的Feature:  隨選影片服務、時移電視功能(Time Shift)、電視錄影功能(DVR/PVR)、親子密碼鎖、電視郵件、即時天氣查詢、電視遊戲、CA(付費收看)、EPG(電子節目表)

TS (Transport Stream)


To be continued...


References:
[1] http://www.rohde-schwarz.com.tw/precompiledweb/BoxDetail.aspx?LibraryID=2
[2] http://zh.wikipedia.org/wiki/M2T
[3] http://www.erg.abdn.ac.uk/future-net/digital-video/mpeg2-trans.html

2012年5月22日 星期二

C語言 - assert()

#include "assert.h"  /* include .h file */

void assert(int expression);
主要是用來除錯。在這個macro中當expression為FALSE的時候就直接結束程式,並且輸出一些必要的資訊 /* 輸出哪些資訊可以參考Reference */ 而這應該大多都用只是純粹RD內部開發code時debug用。

如果今天不想要release的code會因為觸發assert()莫名錯誤而dump出些莫名資訊給客戶,就只要在include "assert.h"之前加上#define NDEBUG就好,compile的時候就會略過assert() [2]


References:
[1] http://www.cplusplus.com/reference/clibrary/cassert/assert/
[2] http://en.cppreference.com/w/cpp/error/assert
[3] http://guguclock.blogspot.com/2008/09/assert.html

2012年5月17日 星期四

new life

嗯...最近換了個工作,我想這邊以後要轉往寫些數位電視跟IC design有關的東西了....科科

2012年3月24日 星期六

2012年3月19日 星期一

GNU_PACKED


GNU_PACKED
用多少byte來排structure,一般沒有指定會用4byte

ex. 假設有一個 data struct

struct Qoo_s{
int a;
char b;
int c;
}GNU_PACKED Qoo_t;


這樣你覺得會有幾個 byte 來存這個 struct?
答案是 12,因為有 default 會對齊,預設是4個byte做對齊,如果要改就用PACKED改

以原本這例子而言,PACKED 1 就是用 1 byte 來對其,所以這時候只會占 9 byte。好處是空間減少;但是壞處是有可能讓執行的時間變長,fetch phase 會變長。PACKED只會影響在記憶體內的排版

Reference:
[1] http://changeway.pixnet.net/blog/post/7669656-data-structure-alignment

2012年2月29日 星期三

Priority scheduling

每一個process都有一個priority,system會從priority的開始優先處理。若一直有高priority的process要執行的話,則可能會造成low priority的process永遠不會被執行到,造成indefinite blocking or starvation。

Priority Scheduling可以是preemptive or non-preemptive。若是preemptive,則新到process若其priority比正在跑之process高則取代它執行;若是後者則放在ready queue中等待執行

indefinite blocking也可能發生在用LIFO(Last In First Out)的scheduling中

Solution:這可以用aging或者Dynamic Priority, Floating Priority來解決
/* aging: 系統每隔一段時間,將待在系統內時間很長,卻又未能完成工作的process,逐漸調高其priority,因此,在有限的時間內,其優先權可以升到最高,進而可取得資源完成工作 */


Reference:
[1]http://www.csie.ntnu.edu.tw/~swanky/os/chap4.htm

2012年2月28日 星期二

Race condition

在shared memory[1]溝通方式下,若未對共享變數提供任何互斥存取控制(or同步)機制,則執行的結果(共享變數之值)會依process執行次序不同而有所不同


解決Race condition有幾種方法,1)Disable Interrupt2)Critical Section Design


1)Disable Interrupt:
Process在對共享變數進行存取之前,先Disable Interrupt(i.e. 發出system call請求OS執行),如此可以確保Process在對其共享變數存取期間不受任何其他processes干擾(or preemption)。直到完成此敘述後才Enable Interrupt

優點:簡單
缺點:僅適用於uni-processor環境,但不適用於multi-processors下
/* 因為要disable all cpu的 interrupt非常耗費時間及資源,system performance很差 */

2)Critical Section Design:
對共享變數進行Lock control,process一旦取得對此共享變數之存取權,在其尚未完成工作時,Lock決不會打開直到完成,才會打開Lock讓其他process存取。

/* 點我延伸討論Critical Section Design */

Reference:
[1] shared memory:
一組process透過對share variables之存取,達到彼此溝通之目的。OS沒有提供額外支援(Global),僅提供memory space而已,此種方式Programmer負擔重,必須確保共享變數之互斥存取機制(or同步),以確保正確性。Race condition為shared memory下可能產生的問題之一,另外一個可能問題是Data Inconsistency,執行的結果不如預期。

[2] OS課本/教材

2012年2月27日 星期一

C語言 - 簡單小考題(1)

void main(void)
{
  int a=5, b=0, c=6;

  a=(a=b)&&(c=b);

  printf("a=%d, b=%d, c=%d \n",a,b,c);
}


最後答案是a=0,b=0,c=6



Q:為什麼最後答案c不是=0???

答案是因為&&在做怪。
&&前面如果是0的話就不會做後面的了,ex. A&&B, if A==0, B就會skip掉判斷

Note: OR (A||B) 也是一樣

2012年2月25日 星期六

Critical Section/Mutex/Semaphore

Critical section(臨界區間)指的是一個存取共用資源(例如:共用裝置或是共用記憶體)的程式片段,而這些共用資源又無法同時被多個執行緒存取的特性[1]

Critical section design必須要滿足三個特性:
1)Mutual exclusion
2)Progress
3)Bounded waiting


1)Mutual exclusion
同一時間點,絕不允許有多個(大於兩個)processes在各自的C.S.內活動,亦即當有一process在自己的C.S.內活動,其他想進入各別C.S.內的processes必須等待,直到該process離開C.S.

2)Progress
I:不想進入C.S.的process絕不能阻礙其他processes進入C.S. (i.e.絕不參與進入C.S.的決策過程)
II:決定哪個processes可以進入C.S.的決策時間是有限的(i.e. No Deadlock)

3)Bounded waiting
自process提出申請進入C.S.到其獲准進入C.S.的這段等待時間是有限的。/* 即n個process欲進入C.S.,則任何一process至多等待(n-1)次後,即可進入C.S */



multi-tasking system中要解決Critical section問題就有Mutex以及Semaphore兩種方法
1)Mutex
Mutex基本就像是把key,當有process想要access一個共用的resource時會先去取得進入這個resource的"Key",當這個key被前一個process給hold住的時候就只能wait

2)Semaphore
雷同Mutex,但是把它擴大為可以同時有N個人擁有key並能access共用的resource

Reference:

[1]http://zh.wikipedia.org/wiki/%E8%87%A8%E7%95%8C%E5%8D%80%E6%AE%B5

Interrupt and Exception

Interrupt 和 exception 是兩種改變系統執行程式順序的方式,分別透過不同的元件觸發。當 interrupt 或 exception 被觸發時,系統會經由查表找到相對應的處理程式( ISR: Interrupt Service Routine,或稱 interrupt handler ),並中斷原本在執行的程式,讓 CPU 執行 ISR 的內容,之後才再轉回原來的程式中。這是多工( multi-tasking )環境中常常用到的技術。

在此, interrupt 指的是由硬體發出的中斷訊號,而 exception 指的是由軟體或系統所產生的中斷訊號。


Exception 則依照發生的場合可以分為兩種類型: 程式執行錯誤或例外事件,前者是發生在程式執行錯誤時,如被除數為零、 overflow 等;後者則像是 system call 等作業系統所提供的服務。
 
 
Reference:
[1] http://opencsl.openfoundry.org/Lab06_interrupt_exception.rst.html
 
--
/* Note: 去面試考到這個,但太久沒看OS全部都忘光,好慘 - -*/

2012年2月23日 星期四

DHCP Snooping

DHCP
DHCP (Dynamic Host Configuration Protocol)
是用來自動取得IP的一種通訊協定,定義在RFC2131 & RFC2132
最主要有兩個角色:Clinet以及Server。
Clinet就是要需要取得IP的裝置,Server則是配有很多IP Pool可以assign
Switch上則多「Relay」的角色(意即對接host端Switch扮演著類似server;對server則扮演host)

常見跟DHCP有關的功能
DHCP Snooping
switch在經過它的DHCP packet中偷偷去紀錄一些資訊,主要是為了security issue.
主要設定會有設定所謂的Trust port,這通常是接到DHCP server
透過Snooping可以建立binding table,也可以說是白名單,這原本是用於IP Source Guard,當有packet進來的時候會去check packet的一些欄位資訊看是不是合法的;如果不是合法的就會被drop掉。這可以配合ARP INSPECTION來使用,當DHCP完成 host要發出arp時也會確認binding table來確認是不是合法的user

/* 註記 */
binding table除了自己learn到外也可以用自己設定的,所謂的static binding,自己建立白名單
所以當default的config,只開arp inspection的話,當有arp packet進來,查白名單裡面是空白的,那就全部進去filter名單,全部被drop,那網路就不通了


DHCP Relay
剛提到的DHCP Snooping只做到偷看,不影響原本的行為;但今天如果DHCP Server剛好不在同一個domain/vlan的話該怎麼辦?
switch上有這個relay的功能,可以代替
OPTION 82

DHCP Relay可以分成Global Relay(Smart-Relay)以及VLAN Relay

DHCP Relay

Global Relay透過config設定可以把不同vlan的dhcp packet都forward相同的vlan上的「同一台」dhcp server;
VLAN Relay則是透過設定,可以把不同vlan的dhcp packet forward「相同」vlan上的「不同」dhcp server去

Global and VLAN Relay

DHCP Relay-Broadcast:
這不是standard有的行為。是個功能的開關。通常會有DHCP Relay都是access switch(Layer 2)為主,那Relay就是switch幫忙把原本client的DHCP broadcast給包成unicast往已知的server丟。那原本DHCP Broadcast的packet呢? 要繼續做broadcast嘛? 所以才會有這個小功能。但這樣也會有缺點就是說當原本 broadcast VLAN上有多個DHCP server的時候,client就會收到多台server給他的DHCP offer,至於client挑選哪台DHCP server回的packet就是網卡來決定。與switch就無關


DHCP Database
DHCP snooping主要是為了建立binding table,建立binding table有手動(static binding)以及dynamic learn(開DHCP Snooping,等DHCP完成後自動建立),如果今天是因為自動建立的話如果重開機的話是不是就要重新DHCP一次create binding table很麻煩?  dynamic的binding table有沒有辦法做備份!?   DHCP Database就是為了解決這個問題而產生。使用TFTP的方式將binding table做備份在外部的TFTP server上以及support restore的功能,在下次重開機的時候可以快速把binding table給restore回去


DHCP-VLAN
DHCP VLAN OVERWRITE

2012年2月21日 星期二

字串處理

被這個卡了半天,實在是太可恥了。趕快來寫下心得筆記

字串處理有幾個主要的方式。分別討論如下:

1)字串長度
2)字串複製
3)字串串連

1)字串長度
size_t strlen(const char*); /* size_t 為unsigned integer. but will be unsigned long in 64bit system */

/* sample code */

void main(void)
{
size_t string_len = 0;
char *string = "AlubaGood";

string_len = strlen(string);
printf("Lengtg of input string = %u \n\r",string_len);
}

如上sample code, 我們會得到string_len = 9


2)字串複製
如果要進行字串複製,可以使用strcpy()函式,若要複製字串中若干字元內容,則可以使用strncpy():
char* strcpy(char*, const char*);
char* strncpy(char*, const char*, size_t);

/* sample code */
void main(void)
{
char *string_1="abcdefg";
char *string_2="hijklmn";

strcpy(string_1,string_2);
printf("After copy, string_1=%s, string_2=%s \n\r",string_1,string_2);
}

上面的結果會show出 After copy , string_1=hijklmn, string_2=hijklmn
strcpy()是會把source string整個「蓋掉」destinaion string. 如果只是想要copy「某些長度」的string的話則要用strncpy()

上面的code如果把strcpy()換成strncpy(string_1,string_2,3); 則會show出 After copy, string_1=hij, string_2=hijklmn


3)字串串連
如果今天要做的是把兩個字串「相連/相加」在一起的話則是要用strcat(), 相連特定長度的話用strncat()

/* sample code */
void main(void)
{
char *string_1="abcdefg";
char *string_2="hijklmn";

strcat(string_1,string_2);
printf("After connect, string_1=%s, string_2=%s \n\r",string_1,string_2);
}
上面的結果會show出 After copy , string_1=abcdefghijklmn, string_2=hijklmn

如果把strcat()換成strncat(string_1,string_2,3); 則上面結果會變成 After copy , string_1=abcdefghij, string_2=hijklmn


Reference:
http://caterpillar.onlyfun.net/Gossip/CGossip/StringLengthCopyCat.html
http://www.cplusplus.com/reference/clibrary/cstring/strncat/

2012年2月8日 星期三

Multicast (IGMP Snooping)

Multicast, 有別於broadcast(一送全部收)及unicast(一送一個人收).只讓特定的user可以接收到packet,好比一送多個人收。其中主要的protocol為IGMP

IGMP
IGMP, Internet Group Management Protocol. based on network layer的feature。是用來支援主機和路由器之間的Multicast封包的管理協定


IGMP是指router在layer3進行Multicast。但是實際上在layer2時是進行Broadcast。如果switch有支援
IGMP Snooping的話,就會在layer2建立和維護MAC 的Multicast地址表,以達到在layer2也進行Mutlicast,這樣最主要就是為了節省封包流量。


也因為是network layer的feature,所以他的multicast address會帶有特定IP的information. 其中class D(224.0.0.0~239.255.255.255)是用來做multicast group的multicast address

而IGMP目前有三種版本 v1,v2,v3 其中有些許的差別,分別define於RFC 1112, RFC 2236 and RFC 3376.
IGMP-v1:只有query和report的封包,要等到timeout才會leave
IGMP-v2:加入了leave的packet
IGMP-v3:加入了source filter的功能,host端可以決定要收到來自哪些source來的IGMP packet


在Layer 2 switch上跟IGMP有關的功能主要是IGMP Snooping. snooping可以當作是偷看偷學的意思。這feature最主要的用意就是要減少packet的流量。
比方說port 3送了一個Join multicast 224.0.0.1的封包到switch,這時候switch就偷偷地學起來,等到從port 5收到multicast 224.0.0.1的封包時,就知道只要傳給port 3就好了,不用傳給別的port,達到減少流量的優點。

此外,每個VLAN都可以有自己的multicast group,IGMP snooping最多可以support到16個VLAN
所以VLAN 100有multicast group 224.0.0.100
VLAN 200也可以有multicast group 224.0.0.100


在L2 switch上除了減少流量外還可以做到其他setting來做控管。可分成per system及per port的設定,包含了
1)group limit以及max group number /* per port */
2)igmp snooping filtering /* per port */
3)Host Timeout /* per system */
4)replace 802.1p Priority tag /* per system */
5)Unknown Multicast Frame drop or flooding /* per system */
6)reserved multicast group drop of flooding /* per system */
7)report-proxy /* per system */
分簡述如下:

1)group limit abd max group number:
限制per port可以加入幾個multicast group. if 超過設定的group number,則用throttling來設定,可以設定當超過的時候是要把新的group給drop掉還是replace原本最舊的group

2)IGMP Snooping Filtering:
我們可以設定per port可以允許加入的multicast group,如果multicast group不屬於IGMP Filtering Profile,就不會進到此port

3)Host timeout
當開snooping時候可以決定per system多久沒收到report packet的時候就把這個port從那個multicast group給remove. default是260 second

4)replace 802.1p Priority tag
可以決定 pass through switch的IGMP的control packet其中的priority tag被換成多少(0~7 可自行設定)

5)Unknown Multicast Frame drop or flooding
對於這台switch沒有learning到的multicast group pakcet是會被drop還是flooding

6)Reserved Mulitcast Group是指224.0.0.0 ~ 224.0.0.255這段multicast address,這是local network所使用的multicast group
可以設定這個multicast group的packet是會被drop還是flooding

ex. 224.0.0.251, MAC address of 01:00:5E:00:00:FB for IPv4; FF02::FB for IPv6. multicast DNS
224.0.0.252, MAC address of 01-00-5E-00-00-FC for IPv4; FF02::1:3 for IPv6, Link Local Multicast Name Resolution (LLMNR), Windows vista, windows server 2008, windows 7才有

7)report-proxy
用於簡化packet的流量。當有多條IGMP join/report的packet時可以把它整合成一個packet送給multicast router

multicast另外個重要應用為跨VLAN的功能,這主要是用在MoD(Media-on-Demand)之類的應用上。可稱為Multicast VLAN or Multicast VLAN Registration(MVR)

MVR主要會針對IGMP join與leave封包進行處理, IGMP report的封包則是交給IGMP snooping. 這部分可以再另外開個topic來討論...

Reference:
[1] http://guiderworld.blogspot.com/2009/03/multicastigmp.html
[2] http://tw.myblog.yahoo.com/hughes-blog/article?mid=64&prev=66&next=61

2012年2月3日 星期五

C語言- 一行搞定判斷是不是2的n次方

if_power_of_2(n) (n != 0 && ((n & (n -1)) == 0))

Reference: http://nano-chicken.blogspot.com/2011/03/in-c.html

C語言- 三行搞定swap

剛看到的一段code,真的很神!! 快來筆記一下
用XOR作swap;

void swap(int *x, int *y) {
    if (x != y) {
        *x ^= *y;
        *y ^= *x;
        *x ^= *y;
    }
}

Reference:
[1] http://nano-chicken.blogspot.com/2011/03/in-c.html
[2] http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

2012年2月1日 星期三

C語言- structure pointer

struct Data
{
int a;
int b;
char* name;
}Mydata;

struct Data *ptr = NULL;

/* assign pointer to structure parameter Mydata */
ptr = &Mydata;


如果要存取structure parameter a;b;*name, 可以用 ptr->a; ptr->b;ptr->name

C語言- dynamic memory allocation

void *malloc(size_t size);
http://www.cplusplus.com/reference/clibrary/cstdlib/malloc/

void free(void *ptr);
http://www.cplusplus.com/reference/clibrary/cstdlib/free/

透過malloc()所分配出來的空間必須由使用者呼叫free()才能歸還給系統。初學者常犯的錯誤之一,就是忘了用free()歸還空間,這會造成程式佔用太多記憶體,此現象稱為memory leakage。相反的,如果空間已用free()歸還了,卻還試著去使用那塊記憶體,則會發生Segmentation Fault (core dumped)的錯誤。


Reference:
http://programming.im.ncnu.edu.tw/Chapter13.htm

C語言- const 用法

const為constant的縮寫,用來宣告變數並設定初值後「不能」再被修改。
ex. const double = 3.14;

const在指標(pointer)使用中可以表明指標指到data是const or 指標本身是const or 兩者都是

[1] char *p = "Qoo";  /* non-const pointer, non-const data */
[2] const char *p = "Qoo"; /* non-const pointer, const data */
[3] char* const p = "Qoo"; /* const pointer, non-const data */
[4] const char* const p = "Qoo" /* const pointer, const data */

關鍵在於:*與const的前後關係!當const出現在*的左邊(const *),則表示pointer指到的data為常數;反之如果const出現在*的右邊(* const),則表示指標本身是常數

所以在[2]
*p = 10;       /*錯誤*/
*(p + 2) = 1;  /*錯誤*/

在[3]
*p = 2;          /*可以*/
*(p+1) = 10;     /*可以*/
p++;             /*不可以*/

事實上,在The C++ Programming Language中有提到一個簡單的要訣:由右向左讀!!

所以
[2] p is a pointer that point to char, which is const
[3] p is a constant pointer point to char
[4] p is a constant pointer point to char which is const

用const是其中一種固定變數值的方法,但更常用的是用#define。一來可以讓程式碼簡潔,二來可以配合macro,用一個簡單的指令替代多個步驟

References:
[1] Effective C++ clause 21.
[2] http://www.wretch.cc/blog/cwz0205/15360838

2012年1月2日 星期一

Hi-Pot test

Hi-Pot test是一種高壓測試,用來測試絕緣度。測試方式是將一高於正常工作電壓的異常電壓加在產品上測試,透過漏電流的大小來判斷物體的絕緣性是否有達到絕緣的要求,並且這個電壓必須持續一段規定的時間,最後判定只要無絕緣崩潰情形,即算通過此測試。

Reference:
[1] http://tw.knowledge.yahoo.com/question/question?qid=1508081104651
[2] H/P 訓練教材