版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、導(dǎo)航編程方法1. 引言我們中的大多數(shù)人通常編寫運行在PC機上的軟件,如數(shù)據(jù)庫應(yīng)用、圖像處理、Internet應(yīng)用等,而缺乏編寫嵌入式軟件的經(jīng)驗。不幸(遺憾)的是,我們不得不編寫運行在導(dǎo)航機上的程序。在編寫這樣的程序之前,我們需要了解我們將要進行的工作和以往的工作有哪些不同,我們所習(xí)慣的編程方法哪些可以繼續(xù)使用,哪些必須改變。2. 內(nèi)存PC機的一個最大的優(yōu)勢是我們可以認為有無限多的內(nèi)存,大多數(shù)的PC機有64M的內(nèi)存,而且Windows提供了虛擬內(nèi)存機制,使編程者可以任意地使用內(nèi)存,而在導(dǎo)航機上,我們一共只有4M或8M的內(nèi)存可以使用,這要求我們必須認真地考慮在編碼時如何節(jié)省內(nèi)存,甚至?xí)龅綖榱斯?jié)省
2、內(nèi)存而犧牲效率的情況。 l 不要使用小塊內(nèi)存使用小塊內(nèi)存會增加系統(tǒng)在管理、檢查內(nèi)存狀態(tài)上的開銷;同時,使用小塊內(nèi)存過多很容易出現(xiàn)內(nèi)存碎塊,盡管系統(tǒng)有內(nèi)存碎塊整理的功能,但還是會增大系統(tǒng)負擔(dān)。因此,我們強烈反對使用小塊內(nèi)存。推薦的使用方法:Ø 當(dāng)僅使用少量且事先知道大小的內(nèi)存時,可以以變量或數(shù)組的形式申請。Ø 當(dāng)時用內(nèi)存量較大,使用的大小事先(編碼時)不知道,必須動態(tài)申請的內(nèi)存時,應(yīng)該先申請一塊較大內(nèi)存塊,使用時通過計算確定每一小塊的內(nèi)存地址。l 用數(shù)組實現(xiàn)鏈表在程序中使用鏈表有時是必須的,也可以給編程帶來很多方便。但使用鏈表實施必要分配多塊內(nèi)存,在鏈表進行插入、刪除等操作時
3、還要進行內(nèi)存的申請和釋放操作,在導(dǎo)航系統(tǒng)這樣一個資源非常有限的系統(tǒng)里,這樣做會占用大量系統(tǒng)時間,給系統(tǒng)帶來不必要的負擔(dān)。那么我們怎樣才能既使用鏈表的優(yōu)點,同時又避免給系統(tǒng)增加不必要的麻煩呢?針對這個目的,我們認為:用數(shù)組實現(xiàn)鏈表是一個比較好的方式。實現(xiàn)方式:結(jié)構(gòu)體數(shù)組,在每個元素的結(jié)構(gòu)體中保存Next/Previous節(jié)點的下標。l 不用的內(nèi)存要及時釋放或解鎖理由很簡單:導(dǎo)航系統(tǒng)的資源(尤其是內(nèi)存)非常有限,占用不再需要的內(nèi)存會導(dǎo)致其他任務(wù)無法取得所需的內(nèi)存,影響導(dǎo)航系統(tǒng)的性能甚至功能的實現(xiàn)。l 不要保存(非固定)內(nèi)存塊的指針導(dǎo)航系統(tǒng)中的內(nèi)存屬性有很多種,在OS的講座中想必已經(jīng)介紹了。其中除了
4、Fixed這種屬性的內(nèi)存塊之外,其他內(nèi)存塊的指針(地址)并非在任何時候都是有效的。如果保存了一個內(nèi)存塊的指針,而這個內(nèi)存塊再沒有被這個指針的持有者意識到的情況下被移動或被刪除了的話,再次企圖使用這個指針來訪問這個內(nèi)存塊是非常危險的,可能導(dǎo)致任何不可預(yù)期的后果(輕則數(shù)據(jù)不正常,重則整個系統(tǒng)會崩潰)。l 堆棧的使用l 內(nèi)存泄漏(系統(tǒng)需要長時間運行)l 結(jié)構(gòu)體定義原則是從小到大的順序定義結(jié)構(gòu)體成員struct Sample_AintiMember1;charcMember2;short siMember3;intiMember4;struct Sample_AcharcMember2;short s
5、iMember3;intiMember4;intiMember1;*注意區(qū)別l 關(guān)于內(nèi)存塊的屬性特征及其適用范圍是否已在OS的講座中介紹了?有沒有必要強調(diào)一下?l 介紹了RSM,及與其它普通內(nèi)存池的區(qū)別,使用目的.RSM的內(nèi)存是屬于RX830操作系統(tǒng)后增加的一部分,主要的目的是為系統(tǒng)提供某些時候(偶爾),較少時間需要使用大量內(nèi)存的機制.主要用于具有Cache屬性的內(nèi)存使用方式.RSM內(nèi)存池并不是一個完整的(或者說連續(xù)的)內(nèi)存,生成時只是在系統(tǒng)中進行登記,分配內(nèi)存塊時的機制是從全部的用戶內(nèi)存池(1號內(nèi)存池)中分配.l 介紹了內(nèi)存的屬性,相應(yīng)的區(qū)別,使用目的.在本節(jié)介紹時,由于大家對lock,un
6、lock使用不是很清楚,因此強調(diào)一遍.分為固定,可移動,可拋棄三種屬性.固定屬性的內(nèi)存一般在系統(tǒng)初始化時進行分配,因為如果在以后的運行中隨機分配會導(dǎo)致內(nèi)存碎片,所以要求在運行中分配的固定的內(nèi)存一定要第一時間釋放. 處于Unlock時(如果不釋放(Release)它的handle有效和地址全局有效.可移動的內(nèi)存處于Unlock時(如果不釋放(Release)它的handle有效,但是地址無效.可拋棄的內(nèi)存處于Unlock時(如果不釋放(Release)它的地址無效, handle狀態(tài)不明,需要先進行Refer.主要用于Cache.內(nèi)存塊同時可以Lock多次,也就是說可以多個任務(wù)同時使用一個內(nèi)存塊
7、,因此要特別注意使用的任務(wù)不要發(fā)生write和read兩種操作,只能有一種.另外,要嚴格保證Lock和Unlock得成對使用,否則會發(fā)生無法正常釋放及地址非法的現(xiàn)象.l SCL(Sequenceable Collection Light)數(shù)組詳細的使用方法請向劉超(電話:64047,E-mail:liuchaoneu-)咨詢。3. 多任務(wù)準確地說這并不是PC機和導(dǎo)航機編程的區(qū)別,因為在PC機上也經(jīng)常會編寫多線程、多進程的軟件,但我們中的大多數(shù)人沒有做過這樣的工作,因此在這里列舉了一些多任務(wù)編程的注意事項。l 保護公用的數(shù)據(jù)在多任務(wù)系統(tǒng)中,經(jīng)常會出現(xiàn)多個任務(wù)需要訪問同一個數(shù)據(jù)的情況,這時我們就必
8、須對這些數(shù)據(jù)進行保護,通常的方法是用Semaphore來實現(xiàn)。例如:intiCount;HandleSemaphore_iCount;TaskA_Main()os_iWaitSemaphore(Semaphore_iCount,);iCount+;os_iSignalSemaphore(Semaphore_iCount,);TaskB_Main()os_iWaitSemaphore(Semaphore_iCount,);iCount-;os_iSignalSemaphore(Semaphore_iCount,);以上是從嚴格意義上來說,但是有時候為了系統(tǒng)的要求(例如性能),如果確信對全局變量進
9、行操作的任務(wù)不會有沖突,也可以不使用保護機制.例如:他們使用了禁止中斷的形式.另外也會有其他的形式,但暫時想的還不是很清楚.l 時刻意識到有其他任務(wù)在運行(例子)l Mail和Event Flag任務(wù)間通信有Event Flag和Mail兩種方式,其主要區(qū)別是Mail可以攜帶數(shù)據(jù)。一般來說,每個任務(wù)組有一個處理事件的任務(wù),等待事件并做簡單處理或分發(fā)給其他任務(wù),沒有事件發(fā)生時這個任務(wù)要進入Wait狀態(tài)。為保證信息不發(fā)生堵塞,這個任務(wù)對一個事件的處理必須簡單。由于任務(wù)必須主動取Mail,因此發(fā)送Mail的同時要設(shè)置Event Flag來通知受信方。(由受信方來輪巡也可以)注意點:1)Mail的Si
10、ze定義2)Mail中可以采取查詢的方式.另外注意Os simulator和Rx830的區(qū)別:在后者中evnet,semaphore,mail都允許使用查詢方式,在前者中不允許.l Plug In機制有兩個任務(wù)A和B,任務(wù)B要求任務(wù)A在某種條件下通知任務(wù)B,這時可以采用Plug In機制。為實現(xiàn)Plug In,任務(wù)A要維護一張表,并提供可以將一個Event插入表中的函數(shù)。任務(wù)B在需要等待任務(wù)A的通知時,創(chuàng)建Event,并通過調(diào)用任務(wù)A提供的函數(shù)將此Event插入到表中,然后等待任務(wù)A來Set Flag。一般地說,任務(wù)A可以為一種事件創(chuàng)建一個表,不同的任務(wù)(B、C、D)都需要等待同一事件時,它們
11、向表中登錄不同的Event(或同一Event的不同F(xiàn)lag)。這樣,當(dāng)?shù)氖录l(fā)生時,任務(wù)A只需要Set表中的所有Flag就可以了。任務(wù)A還應(yīng)該提供Plug Out函數(shù),讓其他任務(wù)取消其登錄的事件,這樣當(dāng)事件發(fā)生時任務(wù)A就不用通知相應(yīng)的任務(wù)了。典型應(yīng)用:MM用的Postman。任務(wù)A為Postman,任務(wù)B為Map,Map進入Navi方式時,向Postman登錄最新自車位置的請求。當(dāng)Postman產(chǎn)生新的自車位置時,通知Map并把新位置發(fā)給Map。當(dāng)Map進入Scroll方式時,不再需要最新自車位置,可以撤消請求。今后,會有其他任務(wù)(如RG)也要求得到最新的自車位置,它可以登錄另一個事件。l 輪
12、巡和等待(中斷)在導(dǎo)航系統(tǒng)中的通信主要有兩種方式:輪巡和等待。輪巡是接收者主動去查詢是否有請求/數(shù)據(jù);而等待是接收者在有請求/數(shù)據(jù)時被發(fā)送者發(fā)送的EventFlag等的同步對象激活。(關(guān)于輪巡和等待的優(yōu)缺點和適用的范圍請補充)這里只補充他們的區(qū)別:等待的主要使用的目的時達到同步,是真正意義的事件驅(qū)動,只有事件發(fā)生時才會有下一步的動作.Polling指的是每隔一定時間就要做一個(或一些)動作.(例如中斷)或者在等待某個事件時,一定時間沒有滿足所需要的接續(xù)動作.(例如Time Out 處理).4. 指針在PC機上,Windows有良好的內(nèi)存保護機制,如果一段代碼向非法的地址寫入數(shù)據(jù),馬上會引發(fā)異常
13、,并且能定位到錯誤的代碼行,使編程者順利地找出錯誤的原因。而在導(dǎo)航機上,異常的產(chǎn)生可能會滯后,以至于發(fā)生異常時已經(jīng)無法判斷真正的原因,因此需要對指針操作格外小心。l 初始化l 合法性判斷5. 調(diào)試代碼導(dǎo)航機的調(diào)試效率比較低,原因有以下幾個方面:調(diào)試工具不夠強大;多任務(wù)給調(diào)試帶來困難;修改-編譯-鏈接-加載-調(diào)試的過程繁瑣而耗時;導(dǎo)航機內(nèi)存少(又是內(nèi)存?。?,以至于不能把所有的代碼加上調(diào)試信息這是一個致命的弱點。l 使用Assert在導(dǎo)航系統(tǒng)中,可以象在VC+中一樣,使用ASSERT來檢查數(shù)據(jù)的有效性,但使用時請注意:不要在ASSERT語句中寫有效代碼!這是因為ASSERT語句,包括寫在括號中的任
14、何內(nèi)容,在實際生成Release版本后是不執(zhí)行的,這樣導(dǎo)致的后果不言自明。例如:如下代碼:ASSERT(iGetDataBlk()= TE_OK );在程序Release后與NULL;是等價的。如果要檢查函數(shù)運行的結(jié)果,應(yīng)該用如下方式:iRet = iGetDataBlk();ASSERT(iRet = TE_OK);l 檢查參數(shù)l 對指針或地址的參數(shù)要進行參數(shù)檢查,而且,如不改變,最好加constl 返回錯誤碼在導(dǎo)航程序中,大量的函數(shù)都以錯誤碼作為返回值,這樣可以向使用者告知本函數(shù)處理的狀態(tài):是正常結(jié)束、沒有內(nèi)存還是出現(xiàn)了未知的錯誤等。通過檢查返回值可以決定下一步的處理:是繼續(xù)運行、整理內(nèi)存
15、還是掛起系統(tǒng)等。對我們即使的發(fā)現(xiàn)錯誤和解決問題,保證導(dǎo)航系統(tǒng)的正常動作是有幫助的。注意:調(diào)用有返回值的函數(shù)后一定要檢查其返回值是否正常以決定今后的處理,在實際開發(fā)中,曾經(jīng)出現(xiàn)過這樣的錯誤:被調(diào)函數(shù)返回錯誤“沒有數(shù)據(jù)”,這時內(nèi)存中的信息為一隨機值,但調(diào)用者沒有判斷就使用了該數(shù)據(jù),導(dǎo)致功能無法正常完成。l 加打印信息導(dǎo)航系統(tǒng)的調(diào)試相信大家都已經(jīng)有了一定的認識,目前的導(dǎo)航系統(tǒng)沒有非常好的實機調(diào)試環(huán)境,而添加調(diào)試信息需要重新編譯,且不能加得太多(會導(dǎo)致.out文件過大無法加載),這就要求我們在調(diào)試的過程中學(xué)會使用打印信息,將一些認為可疑的變量的值、函數(shù)的返回值等通過打印語句(ptprintf)輸出到P
16、artner調(diào)試器中顯示,作為程序調(diào)試的一個參考。但使用打印信息時請注意:盡量避免在執(zhí)行頻率非常高的地方加入打印信息,否則可能會導(dǎo)致導(dǎo)航機CPU負載過大,Partner出現(xiàn)“Target CPU Hang-UP”的錯誤,影響調(diào)試。6. 其他問題l 關(guān)于const變量l 變量定義的位置其實這是一個標準C的規(guī)則:但是我們在經(jīng)常使用VC等支持C+的編譯器之后可能會忽略,即變量的定義應(yīng)該在程序塊的開頭位置(變量定義和 “”之間不能有執(zhí)行程序。例如:int iIndex = 0;GetIndex(&iIndex);short sLowIndex;sLowIndex = iIndex &
17、0xff;可以如下int I;for(;)int b;這樣的代碼在導(dǎo)航系統(tǒng)的編譯時是不能通過的。l 文件系統(tǒng)方面有沒有需要注意的?l Dispatch and Interrupt?Dispatch:是否可以對性能有絕對要求的部分,或瞬間資源(內(nèi)存)使用很大的程序使用,但是要避免里面含有引起任務(wù)調(diào)度的代碼,例如:semaphore等,ptprintf也包括.l Os_vBreak?主要用于調(diào)試,可通過棧察看調(diào)用函數(shù)的調(diào)用情況.l 強調(diào)任務(wù)棧和函數(shù)棧,os_iStackErrorCheck?l RecievceMessage中參數(shù)為T_TMOUT,time = 0時的注意點l 函數(shù)中static變
18、量的使用注意點尤其和多個任務(wù)相關(guān)時,因為如果沒有特殊判斷函數(shù)中static變量只和函數(shù)的調(diào)用發(fā)生關(guān)系,這樣如果使用它來進行判斷特定任務(wù)會有問題.l event flag 的位模式要注意.l 函數(shù)參數(shù)檢查&不改變的地址參數(shù)使用constl task dispatch,通信,調(diào)度順序.通信方法:Mail,外部變量+Event等.l 注意Union的使用例如:typedef struct char acMemA20; Struct_A;typedef struct char acMemB20;intiMem2; Struct_B;typedef union Struct_AstA;Struct_BstB;Union_Test;void vSampleFunc(Void)Struct_AstStructA1,*pstA2;Struct_B*pstB;Union_T
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 跟團旅游協(xié)議合同范本
- 機動車質(zhì)押貸款合同樣本
- 工程清潔保養(yǎng)服務(wù)合同
- 門業(yè)涂裝設(shè)備購銷合同
- 保密協(xié)議模板示例合同范本
- 搬廠搬運路線協(xié)議
- 門面租賃合同格式
- 代理合同溢價補充協(xié)議的終止糾紛解決
- 購銷合同包保障權(quán)益的基石
- 管道安裝安裝合同模板
- 小學(xué)生初中生搞笑幽默短篇小品-文檔
- 2024年新蘇教版六年級上冊科學(xué)全冊知識點 (背誦用)
- 創(chuàng)業(yè)思維-創(chuàng)造你喜愛的人生智慧樹知到期末考試答案章節(jié)答案2024年浙江旅游職業(yè)學(xué)院
- 3.2.2新能源汽車電機控制器結(jié)構(gòu)及工作原理課件講解
- 《生物安全培訓(xùn)》課件-2024鮮版
- 八角購銷合同范本
- 更換電梯協(xié)議書范本
- 湖北省仙桃市2023-2024學(xué)年七年級下學(xué)期期末地理試題(無答案)
- 一例登革熱合并凝血功能障礙患者的個案護理20190-7
- 2024年公需課棗莊市繼續(xù)教育人社局題庫及答案18套題合集
- 義務(wù)教育信息科技課程標準(2022年版)解讀
評論
0/150
提交評論