WINCE下調試驅動的一般方法
1。向串口列印訊息----------//只能列印一般的訊息,即時性要求高的地方建議不要去列印訊息,因為串口列印很慢,即使要列印也盡量少列印或者有選擇地列印--比如100次才列印一次
//串口列印也可以大致分析各個線程間有沒存在對同一個資源訪問的互鎖什麼的
2。寫LOGO檔案-------寫檔案應該比串口列印來的快,寫LOGO也適合於分析資料量很大的場合
3。靈活使用static 變數-----//static變數有記憶的功能,可以用這一點來診斷程式的可靠性---特別是中斷接收什麼的----記憶個幾十K資料再寫到LOGO檔案是不錯的調試方法
4。寫驅動的時候往往要求正確延時什麼的-----//所以正確地實現US/MS的延時很重要
//WINCE 微秒級延時函數
void delay_us(int n)
{
LARGE_INTEGER litmp;
LONGLONG QPart1,QPart2;
double dfMinus, dfFreq, dfTim;
if(QueryPerformanceFrequency(&litmp)==FALSE)
{
MessageBox(NULL,TEXT("Error:QueryPerformanceFrequency"),TEXT("Error"),MB_OK);
return;
}
dfFreq = (double)litmp.QuadPart;
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart;
do
{
QueryPerformanceCounter(&litmp);
QPart2=litmp.QuadPart;
dfMinus=(double)(QPart2-QPart1);
dfTim=dfMinus/dfFreq;
}while(dfTim <0.000001*n);
}
//WINCE毫秒級延時函數
void delay_ms(DWORD tmp_time)
{
DWORD start;
DWORD time_i=0;
start=GetTickCount();
while(time_i<=tmp_time)
{
time_i=GetTickCount()-start;
}
}
5。寫驅動程式一般都會有牽涉到對中斷的處理---------//所以在AP層面跟驅動裡面正確無誤地實現開中斷跟關中斷很必要
特別是在分析中斷有沒工作正常的時候-----//抓取一定資料量的中斷資料然後關閉中斷,確保接收到的資料不會被破壞這樣分析到的實驗結果才能是真實的情況
6。測試一段代碼的已耗用時間--------//可以用 GetTickCount函數去大致測試一下一段代碼的運行耗時找到程式的熱點
dwStartTickCount=GetTickCount( );
。。。。。。XXXXXX
//要測試的程式碼片段
dwEndTickCount=GetTickCount( );
7。驅動一般都要求即時性很高所以在程式裡面盡量把代碼精簡與最佳化
1》首先肯定是好的演算法的選擇與最佳化
2》盡量用加減法去代替乘除法
3》用移位操作去代替乘除法
4》在函數調用的時候不需要的變數盡量去除,因為函數調用存在一個壓棧與出棧的操作,有一個無用的變數多了兩次操作,變數最好分配成32位的
5》減少多次的函數調用,可以封到一起的功能盡量封成一個函數
6》記憶體COPY應該比一個個迴圈賦值來的快
7》減少迴圈嵌套的次數,減少迴圈的次數
8》降低計算的複雜度
9》盡量使用庫函數不要自己去隨便封裝函數來用,庫函數一般比我們自己封裝的函數好用可靠
10》進程++++線程++++關鍵區++++訊息佇列++++互斥體的合理選擇使用可以簡化程式邏輯與最佳化對同一個資源的競爭使用
11》盡量減少程式編譯的警告,減少強制類型轉換
8。 volatile修飾語的使用-----//避免被最佳化什麼的,重新讀取什麼的,網上有很詳細的介紹文章
這個在中斷處理常式裡面一般很常用,一個變數開關由AP隨時去控制
9。看系統的報錯訊息,分析源檔案編譯對應的MAP檔案與COD檔案
1》一般的什麼DATA ABORT錯誤分析MAP檔案可以定位錯誤到那個函數裡面
2》分析對應的COD檔案可以把錯誤定位到那一條語句,不過COD檔案是用組合語言寫的
10。VIEWBIN/DUMPBIN/SET工具的使用
1》VIEWBIN工具一般用於看NK的內容看驅動程式有沒被包括進NK什麼的
2》DUMPBIN工具可以看看驅動裡面匯出了那些函數介面
3》SET工具看系統的環境變數設定
11。WINCE的那些遠程工具
1》看記憶體情況,看有沒存在記憶體流失
2》看註冊表的情況看驅動有沒被系統載入起來
3》看系統的CPU使用率看系統快與慢的原因,看是不是自己的驅動嚴重地佔用了CPU的使用率
4》檔案來回COPY
12。用KITL工具-----//去實現KITL調試手段
DEBUG的方式還是可以定位到很多問題的-----//可以看變數看記憶體看函數呼叫堆疊
13。用 GlobalMemoryStatus函數去定時診斷系統的記憶體狀態看有沒存在記憶體不夠與記憶體流失的情況
1》在代碼裡面malloc跟free配對使用
2》在代碼裡面new跟delete陪對使用
3》動態NEW分配的數組要用delete[]去釋放
4》使用過的位元影像/資源最後要記得正確釋放,用好用准DeleteObject/DeleteDC/ReleaseDC這些釋放資源的函數
5》聲明指標時防止指標亂指,安全可靠地使用/釋放指標,用指標前記得判斷指標的合法性
6》防止在使用數組的時候出現訪問越界
14。變數與BUFFER的存放位置-----//最好全盤考慮一下,放堆上還是棧上還是全域
15。盡量減少動態與多次地分配與釋放記憶體------//容易造成記憶體片段什麼的,能夠固定大小的記憶體配置可以考慮用數組去代替
16。建立跟線程綁定的事件的時候最好指定名稱-------//有名稱的事件在AP層面都可以去操作的,這樣在沒有實際的環境下就可以去類比驅動的操作
有名稱事件在整個系統裡面是唯一的,多次開啟指向的是同一個事件
17。靈活定義IOCONTROL宏,方便AP操作,AP類比驅動的資料格式與操作,方便在沒有實際環境的條件下走通驅動的整個流程
18。還有就是WINCE的驅動調試助手--------//很方便使用的,這樣也不用每次去更新NK
19。CETK工具可以玩玩但我也沒怎麼玩過啊!!!
20。還有we-hjb這個牛人寫的一個工具軟體----寄存器讀寫工具 ,用於WINCE50和WINCE60的版本都有.
可以隨時看SFR的配置情況,很好用的一個工具軟體.
21。編譯開關與調試代碼
1》#if/#else/#endif的靈活使用--------//這樣可以在調試代碼與實際代碼間靈活地切換
2》現在有一種思路那就是測試先行,在寫代碼只前就得寫好測試的代碼,沒有經過測試的代碼那隻是垃圾代碼
22。硬體工具的靈活使用,常用的工具有
1》萬用表
2》示波器---------//看看波形有沒受幹擾,看看要不要接上拉電阻,應該接多少
3》邏輯分析儀-----//可以抓幾K資料進行分析,常見的匯流排形式也可以分析的
4》頻譜儀
23。串列資料通訊一幀幀資料區別開來(斷開幀)的方法
要處理資料的時候去判斷CS線的狀態?
這樣就知道串列通訊還有沒在發資料,CS線為低就不進行資料處理(忙),CS線為高就進行資料處理(不忙)。
把有效資料揀出來,無效資料就去掉,
處理到整個接收緩衝區一個資料都沒有為止(增加程式的容錯性,資料錯誤就直接扔掉,並不能影響下一幀資料的接收與處理),
不知道這樣是否可行,還得做實驗驗證一下!
定個時間間隔再處理可能存在不準的情況.不知道還有沒更好的方法.