使用 Trace32 对 FLASH 编程
from:?? http://www.ibm.com/developerworks/cn/linux/l-trace32/
隨著軟硬件復雜性的增加,在嵌入式系統開發中,調試器對項目的開發進度、質量起著越來越重要的作用。在眾多的調試器中,Lauterbach 公司的 Trace32 憑借其強大的功能,出色的性能,成為目前嵌入式系統開發中,尤其是高端系統中普遍采用的調試工具。
Trace32 除了具有對代碼設置斷點、跟蹤調試等常規的功能以外,還能夠控制對目標系統的 FLASH 進行編程。本文首先對比了 Trace32 FLASH 編程的兩種方式:"Emulator controlled flash programming" 和 "Target controlled flash programming",指出"Target controlled flash programming"方式的優點;然后介紹了與 FLASH 編程相關的 Trace32 腳本命令,以及 Trace32 腳本命令與 FLASH 編程軟件之間的通信機制;最后,給出了 "Target controlled flash programming" 方式的控制流程。
注:本文中使用的"編程"一詞,除了具有對 FLASH 燒寫的含義外,還包括擦除、校驗等其它對 FLASH 的操作。
一、FLASH 編程的兩種方式
對目標系統中的 FLASH 有兩種方式進行編程,分別是 "Emulator controlled flash programming" 和 "Target controlled flash programming"。
在 "Emulator controlled flash programming" 方式下,所有對 FLASH 編程的操作都是由 Emulator 完成的,不使用目標系統的資源。Trace32 軟件支持市面上幾乎所有的 FLASH芯片(可以訪問 http://www.lauterbach.com/ylist.html 查詢 Trace32 支持的 FLASH 型號),只要在腳本命令 FLASH.Create 中指明目標 FLASH 的型號,地址范圍以及總線的配置,用戶就可以使用腳本命令直接將數據燒寫到 FLASH,不需要編寫任何對 FLASH 操作的代碼。
在 "Target controlled flash programming"方式下,對 FLASH 的編程控制是由運行在目標系統上的 FLASH 編程軟件完成的,而這個軟件必須由用戶自行開發。此時,Trace32通過使用腳本對目標系統內存地址空間的訪問,向 FLASH 編程軟件傳送控制參數和數據。
由于直接在目標系統的處理器上運行,采用 "Target controlled flash programming" 方式可以獲得比 "Emulator controlled flash programming"方式快得多的編程速度。這對于燒寫大的文件,以及生產線等場合來說十分重要。另外,只要編寫相應的 FLASH 編程軟件,用戶選擇的任何 FLASH 都能夠被支持。
因此,對于 FLASH 編程的內容較少,或者對編程的時間要求不高的情況下,可以使用"Emulator controlled flash programming" 方式;但是,對于需要編程較大的文件,而且對速度要求較高的情況下,"Target controlled flash programming" 方式是唯一的選擇。本文中只討論 "Target controlled flash programming" 方式。
?
| |
|
二、Trace32 腳本
在 Trace32 的界面中,可以使用菜單,鼠標完成操作,也可以完全使用命令操作。事實上,Trace32 內嵌了強大的命令和腳本處理功能。使用 Trace32 的命令不僅可以完成所有的功能,而且可以獲得比菜單方式更大的操縱性和靈活性。腳本以 .CMM 為后綴。
下面就介紹 Trace32 中與 FLASH 操作相關的命令,見下表:
?
這里列出后面需要使用到命令的詳細格式,以便參考。
1. FLASH.Create
格式:
FLASH.Create<unit_number> <physical_range> <sector_size> <family_code> |
?
例如,定義Am29LV640(16 bit mode, 16 bit bus, 128 sectors, 64Kbyte/sector)
FLASH.RESet
FLASH.Create 1. 0x0 -- 0x7FFFFF 0x10000 AM29LV100 Word
對于采用 "Target controlled flash programming" 方式,familiy_code 必須選擇為TARGET。與 FLASH 編程軟件的連接由 FLASH.Target 完成。
2. FLASH.Erase
格式:
FLASH.Erase<unit> | <address_range> | ALL |
?
例如:
FLASH.Erase 0x0 -- 0x1FFFF
FLASH.Erase ALL
3. FLASH.Program
格式:
FLASH.Program[<unit> | <address_range> | ALL | OFF ] |
?
一旦激活了編程模式,任何對 FLASH 地址空間的寫訪問操作將會導致對 FLASH 的編程。例如:
FLASH.Program ALL |
?
4. FLASH.TARGET
格式:
FLASH.TARGET<code_address> <data_address> [<buffer_size>] [<file>] <code_address> |
?
運行在目標系統上的 FLASH 編程軟件被下載到的 RAM 起始地址,占用的大小為FLASH 編程軟件本身的大小,另外再加上 32 字節。
- <data_address>
參數塊的起始地址,大小為 32 字節(參數塊)+ <buffer_size> + 256 字節(stack)。 - <buffer_size>
從 Trace32 軟件一次傳遞給 FLASH 編程軟件的數據字節數。建議的緩沖大小為 4KB。 - <FLASH_algorithm>
二進制形式的 FLASH 編程軟件。
使用上面這些命令進行 FLASH 編程的一般步驟是:
1) 首先使用 FLASH.Create 定義目標 FLASH 的地址空間,類型,及總線配置。
2) 對于"Target controlled flash programming"方式,必須向目標系統加載 FLASH 編程軟件。FLASH.Target 命令把 FLASH 編程軟件的起始地址,參數塊的起始地址,以及緩沖區大小等信息通知 Trace32。FLASH.Program 和 FLASH.Erase 命令就會調用確定的 FLASH 編程軟件,并傳遞合適的參數。
3) FLASH.Program 啟動編程模式后,如果有數據傳輸命令執行(如 Data.Set 或者Data.LOAD),Trace32 會檢查數據傳輸的地址是否落在 1)中定義的 FLASH 地址空間內。如果是,Trace32 會根據緩沖區的大小,把部分數據填充到數據緩沖區中,初始化參數塊,設置目標系統的 PC 為 FLASH 編程軟件的起始地址,并開始執行。執行結束后,控制權回到 Trace32。Trace32 檢查返回的信息(也在參數塊中),如果正常,繼續處理剩余的數據。
下面通過一個例子來說明:
目標系統的配置了的 FLASH 為 Intel Strata FLASH 28F320J3A(16 bit mode, word access),CPU 為 ARM core。
目標系統的內存影像(memory map)為:
- FLASH: 0x0 - 0x3FFFFF
- RAM 起始地址:0xA0000000
相應的 Trace32 腳本為:
FLASH.RESet |
?
首先,通過 FLASH.Create 創建一個 FLASH 區域1,地址范圍為 0x0 到 0x3FFFFF,Sector 的大小為 0x20000,對此 FLASH 區域的編程軟件由 TARGET 指定。WORD 參數則指明目標系統 CPU 訪問 FLASH 的數據寬度(還可以是 BYTE, LONG, QUAD)。
FLASH.Target 指定對 FLASH 區域編程軟件的位置在 0xA0000000,參數塊在0xA0001000。參數塊后面一般緊跟著數據緩沖區,緩沖區的大小為 0x1000。編程軟件是~~/demo/arm/FLASH/word/i28f200j3.bin。
接著擦除 FLASH 區域 1,然后啟動 FLASH 編程模式。
Data.load.elf 命令將 my_application.elf 裝載到 FLASH 區域,觸發了 FLASH 編程軟件,從而被寫入到指定的 FLASH 區域中。
最后,關閉 FLASH 編程模式。
?
| |
|
三、Trace32 命令與 FLASH 編程軟件之間的通信機制
從上面的例子可知,在 Trace32 軟件與 FLASH 操作程序之間有一個數據交換區-參數塊,用來傳遞控制命令和數據,并返回操作結果。參數塊的位置是由FLASH.Target命令中的data_address指定的。緊跟著參數塊是緩沖區。
參數塊的定義如下:
?
操作結束后,參數塊存放操作的返回結果:
參數塊以及緊跟的緩沖區的相應 C 語言定義如下:
struct { |
| |
|
四、Target controlled flash programming 流程
開發基于"Target controlled flash programming" 方式的一般流程為:
1. 編寫在目標系統上運行的 FLASH 編程軟件
2. 將 FLASH 編程軟件裝載到目標系統的 RAM 中(使用 Data.LOAD 命令)
3. 通過命令 FLASH.Create 和 FLASH.Target 命令將 Trace32 連接到目標系統上的FLASH 編程軟件
4. 使用命令 FLASH.Program,FLASH.Erase 等命令控制對目標系統上 FLASH 的操作,這些命令會調用 FLASH 編程軟件中相應的功能,并傳遞合適的參數
實例(AM29F800)
目標系統上有兩塊型號為 AM29F800 的 FLASH,每塊 FLASH 的數據寬度為 16bit,兩塊合并成 32bit 寬度。每塊 FLASH 有 1MB 的大小,它們的起始地址為 0x200000。
目標系統上還配置了 SRAM,大小為 8kB,地址范圍是 0H 到 1FFFH。
為目標系統開發的 FLASH 編程軟件為 FLASHprog.bin(大小為 450H 字節,二進制格式)。參數塊被安排在 SRAM 的地址 0H 開始。
需要燒入目標系統 FLASH 的應用程序為 application.elf(ELF 格式,起始位置為0x200000)。這里需要說明的是,在聯接產生 application.elf 時,必須通過聯接腳本 - SCL 文件指定其起始位置為 0x200000。這樣"Data.load.elf application.elf "命令就會將 application.elf 裝載到從 0x200000 開始的地址空間。
對于這樣的應用,需要編寫一個控制腳本(CMM 文件),同時還要開發一個 FLASH的編程軟件。下面首先介紹控制腳本的內容,然后給出了 FLASH 編程軟件的流程。
控制腳本
控制腳本的內容如下:
1) 進行必要的目標系統設置,特別是片選配置,使得 SRAM 和 FLASH 都落在安排的地址空間中
2) 將 FLASH 編程軟件 FLASHprog.bin 裝載到 SRAM 中地址 0x1200 處: Data.LOAD.B FLASHprog.bin 1200
3) 在 FLSAH 編程軟件的結束位置設置斷點(break.set swbp),這樣在執行結束后,控制可以交回給 Trace32
4) 通知 Trace32 關于 FLASH 的配置,FLASH 編程軟件的位置,參數塊以及數據緩沖區的位置
FLASH.Create 200000--3fffff TARGET LONG
FLASH.TARGET 1200 0 1000
此時 SRAM 的內存安排為:
5) 擦除整個 FLASH
FLASH.Erase ALL
6) 編程應用程序 application.elf
FLASH.Program ALL
Data.LOAD.elf application.elf
FLASH.Program OFF
執行 FLASH.Erase ALL 命令時,調用 FLASH 編程軟件的擦除功能,相應的參數塊填充為:
此時,數據緩沖區沒有內容。
擦除結束后,遇到設置的斷點,控制權交回給 Trace32,參數表中為返回的狀態:
執行 Data.LOAD.bin application.bin 時,調用 FLASH 編程軟件的編程功能,相應的參數塊填充為:
?
?
此時緩沖區中填充了需要編程的數據。
編程結束后,控制權交回給 Trace32,參數表中為返回的狀態:
?
如果沒有錯誤發生,以上的編程過程會一直下去,直到 application.bin 中的數據全部傳輸完畢。
FLASH 編程軟件
FLASH 編程軟件的流程為:
1) 定義參數塊的數據結構:
struct FlashParameter flash_param;
FlashParameter 的定義見上文。
2) 定義每個功能對應的功能號:
#define FLASH_PROGRAM 0x00000001 |
?
3) 主控制流程:
switch ( flash_param.status ) |
?
4) SCL 文件
RAM 0x200000
{
CODE 0x200000
{
main.o (+RO)
* (+RO)
}
APP_RAM +0x0
{
* (+RW, +ZI)
}
}
總結
以上是生活随笔為你收集整理的使用 Trace32 对 FLASH 编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是JTAG
- 下一篇: 基于S3C4510B的一个简单BSP的开