1 程序調試方式
(1) 使用SEGGER J-Flash(J-Link)下載程序到閃存中運行。
(2) 使用串口ISP 來下載HEX 文件到CPU 中運行。
(3) J-Link + MDK 組合,來在線調試程序(可下載、單步調試)。
下載:是將具體的文件如.axf或HEX下載到開發板的flash(SRAM)中去,在開發板啟動之后就會運行所下載文件。根據運行結果再將修改的程序下至開發板中運行。
- 通過J-Link下載.axf文件時是在J-Link開發板與PC連接好后,通過點擊KEIL中的“load”按鈕將.axf文件下載到開發板內。
- 通過串口ISP下載HEX文件在C51中常見,如51下載程序到單片機內。
在線調試:通過調試器(如J-Link)將開發板和PC相連,既將程序下載到開發板中運行又能看見程序運行的結果(如變量的值)。
2 MDK-RAM-keil + J-Link在線調試
(1) J-Link + 開發板連接PC
Figure1:使用在線調試工具J-Link
(2) 設置項目編譯屬性
因為是使用J-Link在線調試程序,需要選擇J-Link調試工具(建立工程的時候如果設置好了就不用再設置了)。如果J-Link連接開發板的接口為JTAG則PORT要選擇”JTAG”。如下圖:
Figure2:選擇J-Link調試器
如果“JTAG Device Chain”處有內容則說明檢測到了設備。
還需要在Utilities選項中做一些設置:
Figure3:Utilities設置
在”settings”中,點擊”Add”按鈕時選中開發板的控制芯片即可。然后點擊OK保存。現在就可以進行在線調試了。
(3) 在線調試
[1] 單步調試
開始調試
程序經1編譯通過后(第一個按鈕表示只編譯當前處在編輯界面的文件,第二個按鈕表示編譯整個工程中修改過或還未編譯過的文件,最后一個按鈕表示重新編譯所有的文件)。確認J-Link連接完好,開發板已上電后,點擊2中的按鈕開始/結束在線調試。
Figure4:在線調試開始
1:綠色圖標表示光標所在的行,黃色圖標處為要運行的下一條語句。在線調試開始時處在mian()入口處。
2:這是調試開始后彈出的窗口,watch窗口用來觀察程序中各種變量的“值”及“類型”,可以在watch窗口中手動添加待觀察變量。
3:程序中的tx_data為具11個元素的數組,從值可以看出來程序還未運行到175行處。
單步調試按鈕
單步模式下可以點擊以下圖標讓程序往下執行:
以上幾個圖標對應的快捷鍵依次是:
- F11: 單步執行,每次執行一行。
- F10: 跳過當前行語句。
- Ctrl + F11: 跳出當前函數。
- Ctrl+ F10: 運行到光標所處的行。
按F11到176行時,經執行過得tx_data數組個元素的值就在watch窗口中顯示出來。
工具欄窗口
在“在線調試”狀態下,許多“工具欄小窗口”會冒出來。
在紅色方框內的幾個小窗口從左到右依次是:
- Register Window: 用於顯示各寄存器的值,並顯示運行時間。
- Call Stack Window: 用於顯示main函數內的變量及所調用的子函數地址/值。
- Watch Window: 用來查看特殊變量的窗口。用戶可自行輸入某個變量名,根據程序運行的進度查看其值。
其它的窗口也有其特殊的用途,在對其有需要時可以打開瞧瞧。打開和關閉這些窗口的方式都是點擊一下圖標的方式。
查看寄存器值
- 進入調試之后,點擊"Peripherals",然后選擇要查看的寄存器名稱。
- 進入調試之后,點擊"View->SystemVier",然后選擇要查看的寄存器名稱。
- 進入調試之后,點擊"View->Watch Windows"或者點擊工具欄,只輸入指針所指的寄存器的名稱。
[2] 設置斷點調試
單步調試畢竟是單步或者跳過函數的執行。在程序十分龐大時,F系列的鍵或者鼠標都要被按壞,設置斷點后,程序運行到斷點處就停下了,然后就可以再用單步調試的方式進行調試。
開始在線調試
點擊調試按鈕開始調試,如圖Figure 5。
斷點設置
到想要運行的代碼處設置一個斷點。設置斷點的方法:
- 在源代碼行號前雙擊。
- 用開始/停止在線調試旁邊的圖標。
- Debug >> Insert/Remove Breakpoint(F9)。
使能/消除使能/移除斷點的方法也是以上列舉的3點。
點擊Run
- Debug>> Run(F5)
經以上3個步驟后,代碼就從上一次代碼停留處運行到斷點處,結合Figure 4看下圖。
Figure6:斷點處
3 C基本數據類型占內存大小查看
將以下變量聲明為全局變量后,在Watch窗口中觀察的各變量的值。
cl =sizeof(char); ucl = sizeof(unsigned char); scl = sizeof(signed char);
il = sizeof(int); ui = sizeof(unsigned int); sil = sizeof(signed int);
ll = sizeof(long); ul = sizeof(unsigned long); sl = sizeof(signed long); lll = sizeof(long long);
fl = sizeof(float);
dl = sizeof(double); ldl =sizeof(long double); |
Watch窗口中各變量的值:
Figure7:Cortex-M3 C語言基本類型大小
在keil下的編譯器+stm32f10xxx芯片下,char占一個字節,int占4個字節,long占4個字節,long long 占8個字節,float占4個字節,double占8個字節, long double 占8個字節。