專利名稱:一種嵌入式內(nèi)存復用方法
技術(shù)領(lǐng)域:
本發(fā)明涉及軟件的內(nèi)存管理領(lǐng)域,特別涉及一種嵌入式內(nèi)存復用方法。
背景技術(shù):
隨著電子技術(shù)的發(fā)展,嵌入式開發(fā)已是一個熱門的行業(yè)。其開發(fā)由淺入深分為不同的層次,各層次對人才的要求也有所不同,但嵌入式開發(fā)的入行門檻不高以及新舊人才更替周期短等原因,導致一個項目開發(fā)團隊里出現(xiàn)人才水平的良莠不齊。正因如此,我們一直倡導的高質(zhì)量編程在實際操作中客觀存在許多困難,因為真正意義上的高質(zhì)量軟件需要一種貫穿整個軟件開發(fā)過程的潛移默化的規(guī)范,這對開發(fā)團隊的要求不言而喻。而這種潛移默化往往是經(jīng)驗堆成的,并且軟件工程師的任何邏輯性及規(guī)范性的疏忽都會被完整地保留在軟件里面。為了彌補各種人為因素造成的軟件質(zhì)量不高,近二三十年來行業(yè)內(nèi)涌現(xiàn)出許多評估代碼質(zhì)量的工具,如MISRA、PCLing、Understand、SourceMonitor等等,這些工具對于軟件開發(fā)過程有一定的參考及輔助作用,工具的出現(xiàn)本身就承認了人為的負面因素是不可避免的。但是,不同的工具只是從不同的角度去詮釋代碼的質(zhì)量,可以說都是對的,但其反映的結(jié)果都不是絕對的,這是因為工具的實現(xiàn)依賴于人為定義的規(guī)范、簡單的規(guī)則及其組合,其規(guī)范定義得越詳細,工具的設(shè)計及使用也會越復雜,而且執(zhí)行成本也越高。大部份嵌入式產(chǎn)品的安全級別并不高,且更新?lián)Q代快,導致了開發(fā)壓力大,這跟高成本高質(zhì)量開發(fā)過程是個矛盾的關(guān)系。這種矛盾關(guān)系迫使我們在質(zhì)量與成本之間做了個折中的選擇,正是這個折中的關(guān)系縱容了各種不良因素的存在,包括人才選擇、過程控制、質(zhì)量評審、交接管理等各個環(huán)節(jié),并且這些不良因素造成的影響會在傳遞與繼承過程中不斷積累。這就是一個軟件平臺不可抗拒的腐化過程。內(nèi)存管理是軟件質(zhì)量的一個重要組成部份,軟件的腐化過程也是內(nèi)存管理冗余的積累過程。嵌入式產(chǎn)品中內(nèi)存的管理質(zhì)量有了更重要的意義,它與硬件成本直接掛鉤,因為嵌入式產(chǎn)品對內(nèi)存用量的可預測性較強,所以設(shè)計時出于成本考慮無不是精打細算。但內(nèi)存管理上的腐化過程同樣是不可杜絕的,實質(zhì)產(chǎn)品開發(fā)中可能到了后期才發(fā)現(xiàn)內(nèi)存不夠用,這不是前預估得不好,而是開發(fā)過程中不合理調(diào)度造成的浪費過多,如有分配了大量使用頻率極低甚至是一次性消費的內(nèi)存。這有可能會使項目陷入困境,不得不花費大量時間對代碼進行優(yōu)化甚至重構(gòu),從風險控制角度來看是極不可取的,甚至有些項目臨時追加功能導致了內(nèi)存用量超出了預估,不得不從硬件上增加內(nèi)存或者重新立項,這無疑增加了項目的開發(fā)成本。
發(fā)明內(nèi)容
基于上述現(xiàn)有技術(shù)存在的缺陷和不足,本發(fā)明提供了一種嵌入式內(nèi)存復用方法。本發(fā)明的目的通過下述方案實現(xiàn)一種嵌入式內(nèi)存復用方法,利用指針操作及分時復用,將存放在內(nèi)存中不同文件的程序代碼中的部分全局變量、數(shù)組和結(jié)構(gòu)體進行合并,其包括以下步驟 (1)在所述程序代碼中收集可用于復用的不同文件中的全局變量、數(shù)組和結(jié)構(gòu)體,修改代碼從而將所述收集到的全局變量、數(shù)組和結(jié)構(gòu)體定義到第一文件中并連續(xù)放置,并將所述收集到的全局變量、數(shù)組和結(jié)構(gòu)體原來定義的地方作外部聲明;對所述第一文件的程序代碼進行編譯后,所述收集到的全局變量、數(shù)組和結(jié)構(gòu)體在內(nèi)存區(qū)域X中連續(xù)分布;
(2)對與所述收集到的全局變量、數(shù)組和結(jié)構(gòu)體復用的變量、數(shù)組和結(jié)構(gòu)體中的一個或多個進行指針操作,以將其內(nèi)存地址映射到所述內(nèi)存區(qū)域X。進一步的,所述收集到的全局變量、數(shù)組和結(jié)構(gòu)體與所述復用的變量、數(shù)組和結(jié)構(gòu)體中的一個或多個的有效時間域不重疊。進一步的,所述內(nèi)存區(qū)域X的內(nèi)存空間大于所述復用的變量、數(shù)組和結(jié)構(gòu)體中的一個或多個所需的內(nèi)存空間。
本發(fā)明相對于現(xiàn)有技術(shù),具有如下的優(yōu)點和有益效果
(1)本發(fā)明方法可在任何平臺和任何開發(fā)階段引入,并且只是在原來的代碼基礎(chǔ)上做比較小的改動;
(2)通過指針操作和內(nèi)存復用的方法,可以對內(nèi)存進行優(yōu)化,解決很多技術(shù)開發(fā)和工程項目中存在的內(nèi)存不足的難題。
圖1是本發(fā)明一種嵌入式內(nèi)存復用方法的內(nèi)存復用示意圖。圖2是本發(fā)明一種嵌入式內(nèi)存復用方法的內(nèi)存在復用前后的對比圖。圖3是本發(fā)明一種嵌入式內(nèi)存復用方法的指針操作示意圖。圖4是本發(fā)明一種嵌入式內(nèi)存復用方法的一優(yōu)選實施例的示意圖。
具體實施例方式下面結(jié)合實施例及附圖對本發(fā)明作進一步詳細說明,但本發(fā)明的實施方式不限于此。本發(fā)明是利用指針操作及分時復用的方法,將代碼里一部份的全局變量、數(shù)組、結(jié)構(gòu)體進行合并,達到高效利用資源的目的,節(jié)約物理內(nèi)存的消耗。其方法為步驟一,在程序源代碼中收集可用于復用的全局變量、數(shù)組和結(jié)構(gòu)體,修改代碼從而將這些收集到的全局變量、數(shù)組和結(jié)構(gòu)體定義到一第一文件中并連續(xù)放置,同時將所述收集到的全局變量、數(shù)組和結(jié)構(gòu)體原來定義的地方作外部聲明。其中,根據(jù)情況可能收集到多個全局變量、數(shù)組和結(jié)構(gòu)體,也可能僅收集到全局變量、數(shù)組和結(jié)構(gòu)體中的一個或幾個。在一實施例中,如圖1所示,收集到可用于復用的全局變量a、數(shù)組b和結(jié)構(gòu)體C,然后在Visual C中對文件A、文件B和文件C修改源程序代碼從而將所述收集到的全局變量A、數(shù)組B和結(jié)構(gòu)體C定義到同一個文件D中并連續(xù)放置,將所述收集到的全局變量a、數(shù)組b和結(jié)構(gòu)體c在原來定義的地方作外部聲明。對文件D進行編譯后,全局變量a、數(shù)組b和結(jié)構(gòu)體c在內(nèi)存區(qū)域X中連續(xù)分布,如圖2所示,。步驟二,對與上述收集到的全局變量、數(shù)組和結(jié)構(gòu)體復用的變量、數(shù)組和結(jié)構(gòu)體中的一個或多個進行指針操作,以將其內(nèi)存地址映射到內(nèi)存區(qū)域X。本實施例中,如圖3所示,上述的全局變量a、數(shù)組b和結(jié)構(gòu)體c組成了被復用的內(nèi)存區(qū)域X,而與其復用的變量、數(shù)組和結(jié)構(gòu)體中的一個或多個需要通過指針操作將地址映射到復用區(qū)域。假設(shè)與之復用的是兩個char型數(shù)組e[3]和f[3],那么只要將這兩個數(shù)組的定義:unsigned char e[3];unsigned char f [3];改成指針的定義及賦值就可以了:unsigned char *e = &a
;unsigned char *f = &a
+3;。其它代碼可以原封不動,因為指針賦了值以后可以當數(shù)組使用,而指針所指向的內(nèi)存區(qū)域X是一塊連續(xù)可用的區(qū)域。出于數(shù)據(jù)安全考慮,必須保證上述a、b、c構(gòu)成的區(qū)域X要大于e[3]和f [3]所需求內(nèi)存空間的大小,以免溢出覆蓋到其它正常數(shù)據(jù)。同時,要在數(shù)據(jù)有效時間結(jié)束時將該區(qū)域清空,如果條件允許,最好是復位。本發(fā)明的另一優(yōu)選實施例中,如圖4所示,某產(chǎn)品系統(tǒng)中連接有USB模塊及藍牙(BT)模塊,USB和BT都是獨立的模塊,各自都有獨立運行的程序?,F(xiàn)要實現(xiàn)一個新功能:通過U盤實現(xiàn)BT軟件的在線更新功能。這個思路就是USB模塊讀取U盤里的更新文件,然后將數(shù)據(jù)發(fā)送到MCU進行數(shù)據(jù)格式轉(zhuǎn)換,然后再發(fā)送到BT模塊。其最主要解決的便是MCU的內(nèi)存不足。在數(shù)據(jù)下載期間,消耗MCU內(nèi)存的動作主要是數(shù)據(jù)同步、收發(fā)緩存及校驗緩存。假設(shè)以512 byte為一幀數(shù)據(jù),那么這將要耗掉MCU接近3K的內(nèi)存,當然這個數(shù)據(jù)不是絕對的。對其進行可行性分析,軟件更新是個小概率動作,其對內(nèi)存的使用可以說是一次性占用。出于下載速度及軟件安全考慮,下載過程中停止一切響應。這樣一來,可以選擇與之復用的內(nèi)存資源非常豐富,只要不是下載過程IIC及UART需要用到的內(nèi)存基本都可以。具體,其內(nèi)存復用的操作包括以下三個步驟。(I)收集變量: 在可選的情況下,一般都選擇較大的數(shù)組或結(jié)構(gòu)體,這樣可減少變量的個數(shù),利于安全的控制,收集變量的多少需要先經(jīng)過計算。其實際收集到的數(shù)據(jù)及結(jié)構(gòu)體并將其定義堆放到一起的代碼為:
Ufford8 mBluetoothTPBuffer[170]={0x00};
Ufford8 mCallTPBuffer[81]={0x00};
BTPhoneBookItem mPNBookBuffer[PhoneBookBufferItem*4]={0};
BluetoothCalILogNumber mBluetoothCalILogList[PhoneCallLogMaxItem]={0};Ufford8 mTpCDMP3FolderListTextBuffer[218] = {0};。(2)指針映射:這里四個512字節(jié)的內(nèi)存被復用,只要將內(nèi)存的首地址指向共用區(qū)域?qū)牡刂肪涂梢允褂昧耍缦麓a所示的,其中&mBluetoothTPBuffer[O]是共用區(qū)的首地址。uint8 BTDownLoadPacket = &mBluetoothTPBuffer[O]; uint8 dfuDownLoadPacket = &mBluetoothTPBuffer
+512 uint8 *send_buffer= &mBluetoothTPBuffer
+512*2 uint8 *receive_buffer = &mBluetoothTPBuffer
+512*3 映射完成后就等同于定義了四個新的數(shù)組:
uint8 BTDownLoadPacket [512]; uint8 dfuDownLoadPacket[512]; uint8 send_buffer [512]; uint8 receive_buffer[512];。(3)下載完畢后復位:這種情況,復位是不二的選擇,即可清空共用區(qū)域的數(shù)據(jù),又可令系統(tǒng)中各模塊重新初始化避免因停頓造成的各種可能的錯誤。經(jīng)過以上步驟,內(nèi)存不足的問題就得到了解決。以上所述實施例僅表達了本發(fā)明的幾種實施方式,其描述較為具體和詳細,但并不能因此而理解為對本發(fā)明專利范圍的限制。應當指出的是,對于本領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進,這些都屬于本發(fā)明的保護范圍。因此,本發(fā)明專利的保護范圍應以所附權(quán)利要求為準。
權(quán)利要求
1.一種嵌入式內(nèi)存復用方法,其特征在于利用指針操作及分時復用,將存放在內(nèi)存中不同文件的程序代碼中的部分全局變量、數(shù)組和結(jié)構(gòu)體進行合并,其包括以下步驟: (1)在所述程序代碼中收集可用于復用的不同文件中的全局變量、數(shù)組和結(jié)構(gòu)體,修改代碼從而將所述收集到的全局變量、數(shù)組和結(jié)構(gòu)體定義到第一文件中并連續(xù)放置,并將所述收集到的全局變量、數(shù)組和結(jié)構(gòu)體原來定義的地方作外部聲明;對所述第一文件的程序代碼進行編譯后,所述收集到的全局變量、數(shù)組和結(jié)構(gòu)體在內(nèi)存區(qū)域X中連續(xù)分布; (2)對與所述收集到的全局變量、數(shù)組和結(jié)構(gòu)體復用的變量、數(shù)組和結(jié)構(gòu)體中的一個或多個進行指針操作,以將其內(nèi)存地址映射到所述內(nèi)存區(qū)域X。
2.根據(jù)權(quán)利要求1所述的一種嵌入式內(nèi)存復用方法,其特征在于:所述收集到的全局變量、數(shù)組和結(jié)構(gòu)體與所述復用的變量、數(shù)組和結(jié)構(gòu)體中的一個或多個的有效時間域不重疊。
3.根據(jù)權(quán)利要求1所述的一種嵌入式內(nèi)存復用方法,其特征在于:所述內(nèi)存區(qū)域X的內(nèi)存空間大于所述復用的變量 、數(shù)組和結(jié)構(gòu)體中的一個或多個所需的內(nèi)存空間。
全文摘要
本發(fā)明涉及一種嵌入式內(nèi)存復用方法,利用指針操作及分時復用,將存放在內(nèi)存中不同文件的程序代碼中的部分全局變量、數(shù)組和結(jié)構(gòu)體進行合并。本發(fā)明相對于現(xiàn)有技術(shù),具有如下的優(yōu)點和有益效果(1)本發(fā)明方法可在任何平臺和任何開發(fā)階段引入,并且只是在原來的代碼基礎(chǔ)上做比較小的改動;(2)通過指針操作和內(nèi)存復用的方法,可以對內(nèi)存進行優(yōu)化,解決很多技術(shù)開發(fā)和工程項目中存在的內(nèi)存不足的難題。
文檔編號G06F9/44GK103077017SQ20121057738
公開日2013年5月1日 申請日期2012年12月27日 優(yōu)先權(quán)日2012年12月27日
發(fā)明者陳家伶, 方加強 申請人:惠州市德賽西威汽車電子有限公司