這幾天一個(gè)學(xué)生在調(diào)試視頻捕捉程序的時(shí)候遇到了一個(gè)問題。他使用capGetVideoFormat函數(shù)獲得視頻的格式時(shí),發(fā)現(xiàn)m_bmpinfo.bmiHeader.biBitCount為16,他認(rèn)為這是表示16位的RGB格式。可是不管他是使用RGB565,還是RGB555格式進(jìn)行轉(zhuǎn)換時(shí),發(fā)現(xiàn)轉(zhuǎn)換后的YUV文件都是不對(duì)的。在我的Sony筆記本上運(yùn)行他的程序,其中的m_bmpinfo.bmiHeader.biCompression的值為1498831189,這說明筆記本的攝像頭所采集的數(shù)據(jù)的格式并不是普通的16位RGB數(shù)據(jù),而是UYVY格式的。UYVY格式是YUV格式的一個(gè)變種,在網(wǎng)上可以找到詳細(xì)的說明,在此就不贅述了。
要想知道biCompression到底有多少種取值,可以參考一下:http://files.codes-sources.com/fichier.aspx?id=45735&f=src/org/hypik/webcamlib/codecs/Codecs.java。在這里詳細(xì)的列出了各種視頻壓縮的編碼。
怎樣才能知道自己的攝像頭到底支持哪種格式的輸出呢?可以使用capDlgVideoFormat函數(shù):
這個(gè)函數(shù)會(huì)激活攝像頭驅(qū)動(dòng)的視頻格式設(shè)置對(duì)話框,如下圖所示。
我的這個(gè)攝像頭支持2種輸出格式,一種是UYVY,另一種是YUV2。 如果將m_bmpinfo.bmiHeader.biCompression設(shè)置為這兩種之外的值,再使用capSetVideoFormat改變輸出格式,由于驅(qū)動(dòng)程序不支持而不會(huì)獲得成功。
這兩天一直希望找個(gè)可以移植到VxWorks上的Log庫,早就知道大名鼎鼎的Log4c,但一直想找個(gè)更好的,本來看上了Pantheios,覺得它的架構(gòu)非常清晰,使用也很簡便,特別是其網(wǎng)站上宣傳它的性能非常卓越。但是仔細(xì)看了這個(gè)庫后發(fā)現(xiàn)這個(gè)庫基于STL和STLsoft,STL在VxWorks是很影響性能的,只好放棄。看看其他的Log庫,大多數(shù)都是基于C++的,對(duì)于嵌入式應(yīng)用還是不適合。我覺得一個(gè)理想的輕量級(jí)Log庫,最好具有以下特征:
找了一圈,發(fā)現(xiàn)還是Log4c最合適。所以只好決定在Log4c的基礎(chǔ)上移植了,看來找到一個(gè)輕量級(jí)的Log庫不太容易。
今天嘗試用Visual Studio 2005編譯以前用Visual Studio 2003編譯成功過的一個(gè)Wireshark插件,生成后發(fā)現(xiàn)居然無法在官方的Wireshark中加載插件。在 KenThompson的“Creating Your Own Custom Wireshark Dissector”一文中提到使用Visual Studio 2005編譯生成的插件只能在使用Visual Studio 2005生成的Wireshark版本中測試。使用自己采用Visual Studio 2005生成的Wireshark版本測試,發(fā)現(xiàn)確實(shí)可以,而官方的就不行了。使用Dependency Walker看了看,發(fā)現(xiàn)使用Visual Studio 2005生成的DLL文件需要使用MSVCR80.DLL,而官方的Wireshark使用的是MSVCRT.DLL,兩者不兼容,所以會(huì)出現(xiàn)錯(cuò)誤。在微軟的網(wǎng)站上可以找到解決的方法:
mt.exe –manifest MyLibrary.dll.manifest -outputresource:MyLibrary.dll;2
將這樣處理后的DLL再拷貝到官方的Wireshark的插件目錄中就可以了。不過采用Visual Studio 2005生成的插件要分發(fā)時(shí)必須同時(shí)分發(fā)Visual Studio 2005的C語言運(yùn)行庫,看來不如Visual Studio 2003方便。
今天甲方通知要統(tǒng)計(jì)一下我們協(xié)議棧代碼的行數(shù),好久沒有關(guān)心過這樣的問題,上一次統(tǒng)計(jì)代碼行數(shù)好像是好多年前的事情了,也忘記了用的什么工具。最開始想用NLOC,因?yàn)樾枰?NET 2.0,我的機(jī)器裝不上。為了這個(gè)工具安裝.NET 2.0有點(diǎn)不劃算。又找了一個(gè)C++編寫的工具Code Counter Tool。這個(gè)工具可以支持Visual C++ 6.0的工程。不過我們的工程是VxWorks工程,對(duì)于非VC6的工程需要建立一個(gè).map文件,里面包括所有需要統(tǒng)計(jì)的文件。這個(gè)工作可以在命令行中完成:
其中的/b參數(shù)表示只顯示文件名,dir的結(jié)果會(huì)寫入prj.map文件,正好可以滿足要求。
最后的統(tǒng)計(jì)結(jié)果表明,我們的協(xié)議棧有109個(gè)文件(不包括需要的運(yùn)行庫),共161,688行代碼,其中空白行13,554,注釋行為38,311。這是一個(gè)小巧的,但是完整的基站協(xié)議棧代碼。
最近太太的學(xué)校使用思維導(dǎo)圖總結(jié)教學(xué)中的知識(shí)點(diǎn),她因?yàn)殡娔X不熟,我?guī)土讼旅ΓY(jié)果發(fā)現(xiàn)這個(gè)思維導(dǎo)圖真的很方便!今天用思維導(dǎo)圖整理了一下項(xiàng)目的知識(shí)體系,為下一步安排學(xué)生課題、申請(qǐng)專利和發(fā)表文章做準(zhǔn)備。由于課題內(nèi)容比較敏感,下面用一些簡單的例子代替實(shí)際做的工程。
使用思維導(dǎo)圖的最大好處是方便,只要使用Enter鍵就可以添加一個(gè)節(jié)點(diǎn),而使用Tab鍵就可以添加一個(gè)子節(jié)點(diǎn),如果發(fā)現(xiàn)節(jié)點(diǎn)的層次或順序不對(duì),可以隨意地拖動(dòng)節(jié)點(diǎn)進(jìn)行調(diào)整,一起都很方便,不象Visio或者SmartDraw,必須點(diǎn)幾下鼠標(biāo)才能完成這些操作。你可以想到哪里,就畫到哪里,特別適合邊思考,邊整理,比在紙上比劃還方便。下面就是一個(gè)簡單的例子。
以前我整理項(xiàng)目的知識(shí)體系,往往使用SmartDraw(Visio在這方面比SmartDraw更難使)。使用SmartDraw,一是操作比思維導(dǎo)圖麻煩,二是如果圖太大了,為了便于閱讀,就必須將體系結(jié)構(gòu)圖按照層次分割成很多文件,然后利用SmartDraw的鏈接功能將它們鏈接到一起。而在思維導(dǎo)圖中,這一切就變得很容易。你可以在一張圖中畫下所有層次關(guān)系,如果覺得層次多了,可以用鼠標(biāo)點(diǎn)下節(jié)點(diǎn)右側(cè)“減號(hào)”,就可以把子節(jié)點(diǎn)都收起來,象下圖一樣。如果想看子節(jié)點(diǎn),再點(diǎn)一下節(jié)點(diǎn)右側(cè)“加號(hào)”就可以,收縮自如,非常方便。
有時(shí)候子節(jié)點(diǎn)太多,希望在一個(gè)單獨(dú)的窗口中編輯或顯示,可以選擇Drill down功能,它可以把所有子節(jié)點(diǎn)都顯示在一個(gè)單獨(dú)的窗口中,而選擇Drill up功能又可以回到頂層。這樣既可以方便地觀察全局,又可以照顧導(dǎo)細(xì)節(jié),比SmartDraw/Visio方便多了。
其實(shí)最早接觸思維導(dǎo)圖,是前段時(shí)間在廣州,七所的吳挺用MindMap制作了一個(gè)項(xiàng)目的進(jìn)度表,每個(gè)節(jié)點(diǎn)前可以加上Marker清晰地看出每個(gè)項(xiàng)目進(jìn)展的情況,象下面這張圖一樣。不過當(dāng)時(shí)誤以為這個(gè)軟件是類似Visio或者Project那樣的軟件,沒有重視,現(xiàn)在才發(fā)現(xiàn)完全不是那么回事。
在網(wǎng)上搜索了一下,對(duì)思維導(dǎo)圖的介紹還真是很多,可惜我今天才用上。我推薦百度百科的相關(guān)介紹,值得一讀。
支持思維導(dǎo)圖的軟件很多,前面的博客已經(jīng)說了,我要盡量使用開源軟件。在網(wǎng)上真找到一款相當(dāng)不錯(cuò)的:XMind。
Google CTemplate提供了調(diào)節(jié)器(Modifier)功能。所謂調(diào)節(jié)器,類似于在模板中可以使用的用戶自定義函數(shù),也就是對(duì)于相同的數(shù)據(jù)字典內(nèi)容,模板中使用不同的調(diào)節(jié)器就可以顯示不同的內(nèi)容。
要編寫一個(gè)調(diào)節(jié)器,需要從template_modifiers::TemplateModifier派生一個(gè)類:
BitString 調(diào)節(jié)器的作用是將數(shù)值型數(shù)據(jù)轉(zhuǎn)換為二進(jìn)制字符串顯示。其在模板中的使用如下所示:
bstr = bstr + '{{item_type3id:x-bitstring=4}}'b;
用戶自定義的調(diào)節(jié)器一般采用“x-”開頭。調(diào)節(jié)器可以帶有用戶參數(shù),例如上例的“=4”就是用戶參數(shù),表示生成的二進(jìn)制串的長度為4,如果不足4位,前面自動(dòng)補(bǔ)0。
調(diào)節(jié)器的主要功能是在Modify函數(shù)中實(shí)現(xiàn)的,在該函數(shù)中調(diào)用outbuf->Emit函數(shù)來輸出所需要的結(jié)果。
要在程序中支持調(diào)節(jié)器,還需要調(diào)用google::template_modifiers::AddModifier函數(shù)添加BitStringModifier的實(shí)例。如:
TAU G2程序本身的仿真功能很強(qiáng),如果程序在目標(biāo)機(jī)上運(yùn)行時(shí)出現(xiàn)邏輯錯(cuò)誤,你總是可以在TAU G2的仿真環(huán)境下模擬出這個(gè)錯(cuò)誤并找到出錯(cuò)的原因,一般不需要借助操作系統(tǒng)的C代碼調(diào)試工具。但是如果是在TAU G2中調(diào)用了C語言的函數(shù),或者在環(huán)境函數(shù)中出現(xiàn)錯(cuò)誤,問題就復(fù)雜了,因?yàn)門AU G2的仿真環(huán)境無法跟蹤這些C語言的代碼,你只能借助操作系統(tǒng)自身的調(diào)試功能了。
TAU G2生成的程序至少是2個(gè)線程:一個(gè)是主線程,就是main函數(shù)所在的線程,象環(huán)境函數(shù)中的xInitEnv和xInEnv都是在主線程中的,主線程設(shè)置斷點(diǎn)很容易,只要在啟動(dòng)調(diào)試器后,使用Debug菜單中的Toggle Breakpoint(F9)就可以了,因?yàn)檎{(diào)試器默認(rèn)就是把主線程當(dāng)作當(dāng)前線程的;另一個(gè)線程是UML代碼所在的線程,通常你不需要在生成的UML代碼中設(shè)置斷點(diǎn),但是xOutEnv在這個(gè)線程中,而且如果在UML代碼中調(diào)用了C語言的函數(shù),那么這些C語言的函數(shù)也在這個(gè)線程中,而在這個(gè)線程中如果還是用F9直接設(shè)置斷點(diǎn)就往往不會(huì)成功了,程序往往不會(huì)停下來而是繼續(xù)執(zhí)行。
要想在xOutEnv或者自己編寫的C語言函數(shù)中設(shè)置斷點(diǎn)進(jìn)行調(diào)試,可以使用Debug菜單中的Toggle Global Breakpoint(Shift F9)設(shè)置全局?jǐn)帱c(diǎn)。設(shè)置全局?jǐn)帱c(diǎn)后,當(dāng)UML代碼所在的線程執(zhí)行到斷點(diǎn)處,這個(gè)線程就會(huì)停下來,此時(shí)可以使用Debug菜單中的Attach功能,將當(dāng)前線程由主線程變?yōu)閁ML線程,這樣就可以單步跟蹤調(diào)試了。UML線程在Attach對(duì)話框中通常是最后一個(gè)線程,默認(rèn)情況下其名字應(yīng)該為t1,但是有的時(shí)候線程名會(huì)顯示為亂碼。
Teng | CT++ | CTemplate | |
變量 | 支持 | 支持 | 支持 |
函數(shù) | 支持 | 支持 | 支持(Modifier) |
包含 | 支持 | 支持 | 支持 |
條件語句 | 支持 | 支持 | 不支持 |
循環(huán) | 支持 | 支持 | 支持 |
計(jì)算 | 支持 | 不支持 | 不支持 |
賦值 | 支持 | 不支持 | 不支持 |
注釋 | 支持 | 支持 | 支持 |
安全性設(shè)計(jì) | 不支持 | 不支持 | 支持 |
用戶定義函數(shù) | 不支持 | 支持 | 支持 |
最近開始嘗試使用Doxygen生成程序的文檔。程序的源代碼采用的是GB2312的格式存儲(chǔ)的,而Doxygen輸出的文檔是UTF-8格式的,出現(xiàn)了亂碼。雖然Visual Studio 2003支持以UTF-8格式存儲(chǔ)源代碼,但是要把所有文件都轉(zhuǎn)換擔(dān)心太麻煩。于是,在配置文件中增加了一行代碼:
INPUT_ENCODING = GB2312
這下問題解決了,Doxygen在生成文檔時(shí)自動(dòng)將文件的編碼從GB2312轉(zhuǎn)換為UTF-8,輸出就沒有亂碼了。
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
27 | 28 | 29 | 30 | 1 | 2 | 3 | |||
4 | 5 | 6 | 7 | 8 | 9 | 10 | |||
11 | 12 | 13 | 14 | 15 | 16 | 17 | |||
18 | 19 | 20 | 21 | 22 | 23 | 24 | |||
25 | 26 | 27 | 28 | 29 | 30 | 31 | |||
1 | 2 | 3 | 4 | 5 | 6 | 7 |