雖然使用ATL開發(fā)COM 應(yīng)用是一件非常簡(jiǎn)單的事情,但是在ATL簡(jiǎn)單易用的界面后面卻包含著復(fù)雜的技術(shù)。
面對(duì)ATL生成的大量代碼,我們即使不去深入地了解這些代碼的含義也可以開發(fā)出COM應(yīng)用來(lái),但是如果我們要充分地挖掘ATL的潛力,開發(fā)出更靈活、強(qiáng)大的COM應(yīng)用,則必須對(duì)ATL使用的基本技術(shù)有所了解。研究ATL的實(shí)質(zhì)最好的教材就是由Visual C++提供的ATL源代碼。
本文這一部分只是對(duì)ATL中用到的最基本的技術(shù)進(jìn)行簡(jiǎn)單的介紹。簡(jiǎn)單地說(shuō)來(lái),ATL中所使用的基本技術(shù)包括以下幾個(gè)方面:COM技術(shù)C++模板類技術(shù)(Template)C++多繼承技術(shù)(Multi-Inheritance)COM技術(shù)是理解ATL的基礎(chǔ),使用ATL進(jìn)行開發(fā)要對(duì)COM技術(shù)的基本概念有最低限度的了解。
由于COM是一項(xiàng)非常復(fù)雜龐大的技術(shù)體系,限于本文的篇幅,這里不再贅述。對(duì)于本文中提到的COM基本概念也不做過(guò)多的解釋,請(qǐng)讀者參閱有關(guān)的參考書籍。
作為ATL最核心的實(shí)現(xiàn)技術(shù)的模板是對(duì)標(biāo)準(zhǔn)C++語(yǔ)言的擴(kuò)展,但是在大多數(shù)的C++編程環(huán)境中,人們很少使用它,這是因?yàn)槟0宓墓δ茈m然很強(qiáng),但是它內(nèi)部機(jī)制比較復(fù)雜,需要比較多的C++知識(shí)和經(jīng)驗(yàn)才能靈活地使用它。在MFC中的CObjectArray等功能類就是由模板來(lái)定義的。
完全通過(guò)模板來(lái)定義程序的整體類結(jié)構(gòu),ATL是迄今為止做得最為成功的。所謂模板類簡(jiǎn)單地說(shuō)是對(duì)類的抽象。
我們知道C++語(yǔ)言用類定義了構(gòu)造對(duì)象(這里指C++對(duì)象而不是COM對(duì)象)的方式,對(duì)象是類的實(shí)例,而模板類定義的是類的構(gòu)造方式,使用模板類定義實(shí)例化的結(jié)果產(chǎn)生的是不同的類。因此可以說(shuō)模板類是“類的類”。
在C++語(yǔ)言中模板類的定義格式如下:注意:;是左右尖括號(hào),可能無(wú)法正常顯示。 templateclassMyTemp{MyTemp(){};~MyTemp(){};intMyFunc(inta);}………….IntMyTemp::MyFunc(inta){}首先使用C++的關(guān)鍵字“template”來(lái)聲明一個(gè)模板類的定義。
在關(guān)鍵字后面是用尖括號(hào)括起來(lái)的類型參數(shù)。正是根據(jù)這個(gè)類型參數(shù),編譯器才能在編譯過(guò)程中將模板類的具體定義轉(zhuǎn)化為一個(gè)實(shí)際的類的定義,即生成一個(gè)新的類。
接下來(lái)的定義方式與普通的類定義十分相似,只是在類的函數(shù)定義中都要帶有類型參數(shù)的說(shuō)明。下面的程序段說(shuō)明了模板類的用法: typedefMyTempmyclassfromtemp;myclassfromtempm;inta=m.Myfunc⑽;通常在使用模板類時(shí)為了方便起見,使用一個(gè)關(guān)鍵字“typedef”為新定義出來(lái)的類取一個(gè)名字。
在上面的程序段中假設(shè)“MyClass”是一個(gè)由用戶定義的類,通過(guò)將這個(gè)類的名字作為類型參數(shù)傳遞給模板類,我們可以創(chuàng)建一個(gè)新的類,這個(gè)類的行為將以模板類的定義為基礎(chǔ),例如它具有模板類定義的所有成員函數(shù),同時(shí)這個(gè)類又是對(duì)模板類行為的一種修改,這種修改是通過(guò)用戶提供的類型參數(shù)來(lái)實(shí)現(xiàn)的。賦予模板類以不同的類型參數(shù),則得到行為框架相似但具體行為不同的一組類的集合。
有了新的類的定義以后,我們可以象使用普通類一樣來(lái)創(chuàng)建一個(gè)類的實(shí)例,即一個(gè)新的對(duì)象,并且調(diào)用這個(gè)對(duì)象的成員函數(shù)。模板類是對(duì)標(biāo)準(zhǔn)C++語(yǔ)言的最新擴(kuò)展,雖然它的功能很強(qiáng)大,但是要想使用好模板類需要相當(dāng)多的關(guān)于語(yǔ)言和編程的經(jīng)驗(yàn)和知識(shí),而且錯(cuò)誤地使用模板類又會(huì)對(duì)程序的結(jié)構(gòu)和運(yùn)行效率帶來(lái)大的副作用,因此一般的編程環(huán)境和編程書籍對(duì)模板類的使用都采取謹(jǐn)慎的態(tài)度。
而ATL的核心就是由幾十個(gè)模板類構(gòu)成的,通過(guò)研究ATL的源代碼可以使我們對(duì)模板類的使用有比較深刻全面的認(rèn)識(shí)。多繼承技術(shù)同模板一樣,是C++語(yǔ)言中極具爭(zhēng)議性的技術(shù)。
使用多繼承技術(shù)可以使程序的設(shè)計(jì)和實(shí)現(xiàn)更加靈活,但是,由于多繼承的復(fù)雜性和自身概念上的一些問(wèn)題,使多繼承在各種面向?qū)ο蟮恼Z(yǔ)言環(huán)境中得到的支持都非常有限。例如Small Talk根本就不允許多繼承,同樣MFC也不支持多繼承技術(shù)。
多繼承最大的問(wèn)題是所謂的“鉆石結(jié)構(gòu)”。例如下面的代碼: classA{。
..};classB:publicA{。};classC:publicA{。
..};classD:publicC,B{。
..}由于類D同時(shí)從類C和B繼承,因此在下面的語(yǔ)句中就會(huì)發(fā)生歧義: D*pD=newD;(A*)pD->Func(。);由于類D通過(guò)類C和類B 分別繼承了類A,這里的強(qiáng)制轉(zhuǎn)化就會(huì)發(fā)生歧義。
ATL使用了C++最新規(guī)范中加入的兩個(gè)運(yùn)算符號(hào)static_cast、dynamic_cast代替簡(jiǎn)單的強(qiáng)制轉(zhuǎn)化,從而消除多繼承帶來(lái)的歧義。使用這兩個(gè)運(yùn)算符號(hào),我們可以在對(duì)象運(yùn)行過(guò)程中獲取對(duì)象的類型信息。
上面的代碼可以采用下面的方式修改: D*pD=newD;static_cast(static_cast(pD))->Func(。);為什么模板類和多繼承技術(shù)會(huì)成為ATL主要的工具呢?原因在于,采用模板可以在編譯過(guò)程中快速的生成具有用戶定制功能的類,這對(duì)于COM這樣一個(gè)復(fù)雜的技術(shù)體系在實(shí)現(xiàn)效率上得到了很大的提高。
通過(guò)使用模板類,用戶可以把精力集中在自己開發(fā)的類的基本邏輯上,在完成了自己的類的設(shè)計(jì)以后,通過(guò)繼承不同的模板類,生成不同的類,就可以快速地實(shí)現(xiàn)COM的功能,同時(shí)又避免了采用單繼承結(jié)構(gòu)造成的大量功能冗余??傊?,正是由于在設(shè)計(jì)實(shí)現(xiàn)過(guò)程中采用了模板類和多繼承技術(shù),才使ATL成為一個(gè)小巧靈活的COM。
鋰離子電池的基本知識(shí) 便攜式電子產(chǎn)品以電池作為電源。
隨著便攜式產(chǎn)品的迅猛發(fā)展,各種電池的用量大增,并且開發(fā)出許多新型電池。除大家較熟悉的高性能堿性電池、可充電的鎳鎘電池、鎳氫電池外,還有近年來(lái)開發(fā)的鋰電池。
這里主要介紹有關(guān)鋰電池的基本知識(shí)。這包括它的特性、主要參數(shù)、型號(hào)的意義、應(yīng)用范圍及使用注意事項(xiàng)等。
鋰是一種金屬元素,其化學(xué)符號(hào)為L(zhǎng)i(其英文名為lithium),是一種銀白色、十分柔軟、化學(xué)性能活潑的金屬,在金屬中是最輕的。它除了應(yīng)用于原子能工業(yè)外,可制造特種合金、特種玻璃(電視機(jī)上用的熒光屏玻璃)及鋰電池。
在鋰電池中它用作電池的陽(yáng)極。 鋰電池也分成兩大類:不可充電的及可充電的兩類。
不可充電的電池稱為一次性電池,它只能將化學(xué)能一次性地轉(zhuǎn)化為電能,不能將電能還原回化學(xué)能(或者還原性能極差)。而可充電的電池稱為二次性電池(也稱為蓄電池)。
它能將電能轉(zhuǎn)變成化學(xué)能儲(chǔ)存起來(lái),在使用時(shí),再將化學(xué)能轉(zhuǎn)換成電能,它是可逆的,如電能化學(xué)能鋰電池的主要特點(diǎn)。 鋰電池的最大特點(diǎn)是比能量高。
什么是比能量呢?比能量指的是單位重量或單位體積的能量。比能量用Wh/kg或Wh/L來(lái)表示。
Wh是能量的單位,W是瓦、h是小時(shí);kg是千克(重量單位),L是升(體積單位)。這里舉一個(gè)例來(lái)說(shuō)明:5號(hào)鎳鎘電池的額定電壓為1.2V,其容量為800mAh,則其能量為0.96Wh(1。
鋰離子電池(Li-ion Batteries)是鋰電池發(fā)展而來(lái)。
所以在介紹Li-ion之前,先介紹鋰電池。舉例來(lái)講,以前照相機(jī)里用的扣式電池就屬于鋰電池。
鋰電池的正極材料是二氧化錳或亞硫酰氯,負(fù)極是鋰。電池組裝完成后電池即有電壓,不需充電.這種電池也可能充電,但循環(huán)性能不好,在充放電循環(huán)過(guò)程中,容易形成鋰枝晶,造成電池內(nèi)部短路,所以一般情況下這種電池是禁止充電的。
后來(lái),日本索尼公司發(fā)明了以炭材料為負(fù)極,以含鋰的化合物作正極,在充放電過(guò)程中,沒有金屬鋰存在,只有鋰離子,這就是鋰離子電池。當(dāng)對(duì)電池進(jìn)行充電時(shí),電池的正極上有鋰離子生成,生成的鋰離子經(jīng)過(guò)電解液運(yùn)動(dòng)到負(fù)極。
而作為負(fù)極的碳呈層狀結(jié)構(gòu),它有很多微孔,達(dá)到負(fù)極的鋰離子就嵌入到碳層的微孔中,嵌入的鋰離子越多,充電容量越高。同樣,當(dāng)對(duì)電池進(jìn)行放電時(shí)(即我們使用電池的過(guò)程),嵌在負(fù)極碳層中的鋰離子脫出, 又運(yùn)動(dòng)回正極。
回正極的鋰離子越多,放電容量越高。我們通常所說(shuō)的電池容量指的就是放電容量。
在Li-ion的充放電過(guò)程中,鋰離子處于從正極→負(fù)極→正極的運(yùn)動(dòng)狀態(tài)。Li-ion Batteries就像一把搖椅,搖椅的兩端為電池的兩極,而鋰離子就象運(yùn)動(dòng)員一樣在搖椅來(lái)回奔跑。
所以Li-ion Batteries又叫搖椅式電池。
鋰電池原理
鋰離子電池的正極材料通常有鋰的活性化合物組成,負(fù)極則是特殊分子結(jié)構(gòu)的碳.常見的正極材料主要成分為 LiCoO2 ,充電時(shí),加在電池兩極的電勢(shì)迫使正極的化合物釋出鋰離子,嵌入負(fù)極分子排列呈片層結(jié)構(gòu)的碳中.放電時(shí),鋰離子則從片層結(jié)構(gòu)的碳中析出,重新和正極的化合物結(jié)合.鋰離子的移動(dòng)產(chǎn)生了電流.
化學(xué)反應(yīng)原理雖然很簡(jiǎn)單,然而在實(shí)際的工業(yè)生產(chǎn)中,需要考慮的實(shí)際問(wèn)題要多得多:正極的材料需要添加劑來(lái)保持多次充放的活性,負(fù)極的材料需要在分子結(jié)構(gòu)級(jí)去設(shè)計(jì)以容納更多的鋰離子;填充在正負(fù)極之間的電解液,除了保持穩(wěn)定,還需要具有良好導(dǎo)電性,減小電池內(nèi)阻.
雖然鋰離子電池很少有鎳鎘電池的記憶效應(yīng),記憶效應(yīng)的原理是結(jié)晶化,在鋰電池中幾乎不會(huì)產(chǎn)生這種反應(yīng).但是,鋰離子電池在多次充放后容量仍然會(huì)下降,其原因是復(fù)雜而多樣的.主要是正負(fù)極材料本身的變化,從分子層面來(lái)看,正負(fù)極上容納鋰離子的空穴結(jié)構(gòu)會(huì)逐漸塌陷、堵塞;從化學(xué)角度來(lái)看,是正負(fù)極材料活性鈍化,出現(xiàn)副反應(yīng)生成穩(wěn)定的其他化合物.物理上還會(huì)出現(xiàn)正極材料逐漸剝落等情況,總之最終降低了電池中可以自由在充放電過(guò)程中移動(dòng)的鋰離子數(shù)目.
過(guò)度充電和過(guò)度放電,將對(duì)鋰離子電池的正負(fù)極造成永久的損壞,從分子層面看,可以直觀的理解,過(guò)度放電將導(dǎo)致負(fù)極碳過(guò)度釋出鋰離子而使得其片層結(jié)構(gòu)出現(xiàn)塌陷,過(guò)度充電將把太多的鋰離子硬塞進(jìn)負(fù)極碳結(jié)構(gòu)里去,而使得其中一些鋰離子再也無(wú)法釋放出來(lái).這也是鋰離子電池為什么通常配有充放電的控制電路的原因.
不適合的溫度,將引發(fā)鋰離子電池內(nèi)部其他化學(xué)反應(yīng)生成我們不希望看到的化合物,所以在不少的鋰離子電池正負(fù)極之間設(shè)有保護(hù)性的溫控隔膜或電解質(zhì)添加劑.在電池升溫到一定的情況下,復(fù)合膜膜孔閉合或電解質(zhì)變性,電池內(nèi)阻增大直到斷路,電池不再升溫,確保電池充電溫度正常.
而深充放能提升鋰離子電池的實(shí)際容量嗎?專家明確地告訴我,這是沒有意義的.他們甚至說(shuō),所謂使用前三次全充放的“激活”也同樣沒有什么必要.然而為什么很多人深充放以后 Battery Information 里標(biāo)示容量會(huì)發(fā)生改變呢 ? 后面將會(huì)提到.
鋰離子電池一般都帶有管理芯片和充電控制芯片.其中管理芯片中有一系列的寄存器,存有容量、溫度、ID 、充電狀態(tài)、放電次數(shù)等數(shù)值.這些數(shù)值在使用中會(huì)逐漸變化.我個(gè)人認(rèn)為,使用說(shuō)明中的“使用一個(gè)月左右應(yīng)該全充放一次”的做法主要的作用應(yīng)該就是修正這些寄存器里不當(dāng)?shù)闹?,使得電池的充電控制和?biāo)稱容量吻合電池的實(shí)際情況.
充電控制芯片主要控制電池的充電過(guò)程.鋰離子電池的充電過(guò)程分為兩個(gè)階段,恒流快充階段(電池指示燈呈黃色時(shí))和恒壓電流遞減階段 ( 電池指示燈呈綠色閃爍.恒流快充階段,電池電壓逐步升高到電池的標(biāo)準(zhǔn)電壓,隨后在控制芯片下轉(zhuǎn)入恒壓階段,電壓不再升高以確保不會(huì)過(guò)充,電流則隨著電池電量的上升逐步減弱到 0 ,而最終完成充電.
電量統(tǒng)計(jì)芯片通過(guò)記錄放電曲線(電壓,電流,時(shí)間)可以抽樣計(jì)算出電池的電量,這就是我們?cè)?Battery Information 里讀到的 wh. 值.而鋰離子電池在多次使用后,放電曲線是會(huì)改變的,如果芯片一直沒有機(jī)會(huì)再次讀出完整的一個(gè)放電曲線,其計(jì)算出來(lái)的電量也就是不準(zhǔn)確的.所以我們需要深充放來(lái)校準(zhǔn)電池的芯片.
鋰離子電池作為一種化學(xué)電源,指分別用兩個(gè)能可逆地嵌入與脫嵌鋰離子的化合物作為正負(fù)極構(gòu)成的二次電池。
當(dāng)電池充電時(shí),鋰離子從正極中脫嵌,在負(fù)極中嵌入,放電時(shí)反之。鋰離子電池是物理學(xué)、材料科學(xué)和化學(xué)等學(xué)科研究的結(jié)晶。
鋰離子電池所涉及的物理機(jī)理,目前是以固體物理中嵌入物理來(lái)解釋的,嵌入(intercalation)是指可移動(dòng)的客體粒子(分子、原子、離子)可逆地嵌入到具有合適尺寸的主體晶格中的網(wǎng)絡(luò)空格點(diǎn)上。電子輸運(yùn)鋰離子電池的正極和負(fù)極材料都是離子和電子的混合導(dǎo)體嵌入化合物。
電子只能在正極和負(fù)極材料中運(yùn)動(dòng)。已知的嵌入化合物種類繁多,客體粒子可以是分子、原子或離子.在嵌入離子的同時(shí),要求由主體結(jié)構(gòu)作電荷補(bǔ)償,以維持電中性。
電荷補(bǔ)償可以由主體材料能帶結(jié)構(gòu)的改變來(lái)實(shí)現(xiàn),電導(dǎo)率在嵌入前后會(huì)有變化。鋰離子電池電極材料可穩(wěn)定存在于空氣中與其這一特性息息相關(guān)。
嵌入化合物只有滿足結(jié)構(gòu)改變可逆并能以結(jié)構(gòu)彌補(bǔ)電荷變化才能作為鋰離子電池電極材料。
聲明:本網(wǎng)站尊重并保護(hù)知識(shí)產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡(luò)傳播權(quán)保護(hù)條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請(qǐng)?jiān)谝粋€(gè)月內(nèi)通知我們,我們會(huì)及時(shí)刪除。
蜀ICP備2020033479號(hào)-4 Copyright ? 2016 學(xué)習(xí)鳥. 頁(yè)面生成時(shí)間:3.339秒