天天看點

arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫

前言

arm ds軟體作為arm公司釋出的ADS、DS5軟體的延續,具備前兩款軟體的所有功能。同時将Keil MDK單片機開發軟體的功能直接整合到了arm ds軟體中。現在arm ds就相當于DS5+MDK兩款軟體的集合體。優點:能夠快速開發Cortex-M單片機程式,同時具備開發高端Cortex-A/R系列晶片的能力。

說明:以下裸機程式是運作在開發闆進入Uboot的狀态下,并非完全的裸機。arm ds軟體是windows端的、使用了arm官方的JTAG調試器——DSTREAM

軟體下載下傳

下載下傳arm ds軟體,可以從www.arm.com官網下載下傳。也可以從以下百度雲盤中下載下傳,試用申請需要注冊arm賬戶。

連結:https://pan.baidu.com/s/1Ww5mWiN9sWObYptJesC7Xw 

提取碼:jcmu 

工程執行個體:https://pan.baidu.com/s/1vd1nCuGxwvggMKCkdFUWTg 

提取碼:8xy1

建立工程

點選File >> New >> Project

arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫

編譯器選擇Arm Compiler 5,如果你開發的晶片為arm 64位的。請選擇arm compiler 6

arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫

點選Finish完成工程建立。

疑問:

1. 裸機程式如何運作C代碼?

這裡采用C語言來實作裸機LED的控制。但是有一個疑問C代碼運作需要有一個運作環境——必須有一個棧。不然C代碼中使用的變量無法使用。同時晶片啟動後這個C代碼運作環境需要使用彙編來設定。

2. 為什麼不全部采用彙編來編寫?

因為彙編屬于一種低級語言學習起來比較麻煩,需要記的東西比較多。而且對比較複雜功能的實作會異常麻煩而且不好維護與移植。現代晶片的開發大部都是采用彙編+C語言來開發的,因為C語言的移植性好同時效率也高。

總合上述原因:這裡采用彙編+C語言的模式來開發,彙編完成C語言運作環境的設定(常說的啟動代碼)、C語言完成具體的功能實作。

添加兩個檔案:start.s、main.c

arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫

start.s中設定棧給C代碼運作提供環境支援。以下start.s檔案中代碼

arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫

完整代碼:

PRESERVE8

	AREA  Led_4412, CODE, READONLY

	ENTRY
	;關閉開門狗
	LDR r0, =0x10060000
	MOV r1, #0
	STR r1, [r0]

	LDR sp,=0x02050000 ;設定C語言程式的棧位址為iRAM空間
	IMPORT main
	BL main
	B . ;死循環
 END
           

注意:arm工具中的彙編代碼與gun arm彙編風格不一樣,兩種不通用。這裡隻簡單介紹下arm工具中的彙編

分析以上代碼:

PRESERVE8:表示8位元組對齊,這個是固定的不加編譯器會報錯。想要詳細了解的請百度或者檢視arm ds幫助文檔arm彙編章節

AREA  Led_4412, CODE, READONLY:這個也是固定格式。其中led_4412為代碼段名稱可以自定義,這裡因為是4412開發闆上的LED程式是以使用了Led_4412

ENTRY:這個程式入口必須要有表示此彙程式設計式從這裡開始運作。工程中至少有一個ENTRY

這段代碼表示關閉看門狗,防止在運作程式時被自動複位了。0x10060000為Exynos 4412晶片的看門狗控制寄存器位址,具體可以檢視4412資料手冊。

LDR r0, =0x10060000
	MOV r1, #0
	STR r1, [r0]
           

LDR:從記憶體中将資料加載到寄存器中

MOV:将立即數存入寄存器中。

STR:将寄存器中的資料寫入記憶體中

這段是關鍵代碼,設定了棧位址以及從彙編跳轉到C代碼。其中0x02050000為iRAM空間位址,這個可以從4412手冊Memory Map章節檢視到。

LDR sp,=0x02050000 ;設定C語言程式的棧位址為iRAM空間
	IMPORT main
	BL main
           

IMPORT:表示後面的符号來自外部,這裡隻的就是C代碼。符号名稱可以随便修改,但是一定要和C代碼中的函數名稱對應上。

BL:跳轉指令

晶片記憶體位址結構(非常重要):

arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫

接下來編寫C代碼,這是一個LED流水燈程式

//擷取寄存器位址中的内容
#define GPK1CON (*(volatile unsigned long *)0x11000060)
#define GPL2CON (*(volatile unsigned long *)0x11000100)


#define GPK1DAT (*(volatile unsigned long *)0x11000064)
#define GPL2DAT (*(volatile unsigned long *)0x11000104)

void delay(int r0)
{
    volatile int count = r0;
    while (count--)
        ;
}

int main(void)
{
	GPL2CON = 0x00000001;
	GPK1CON = 0x00000010;

	while(1)
	{
		GPL2DAT = 0;
		GPK1DAT = 0x02;
		delay(0x80000);
		GPL2DAT = 1;
		GPK1DAT = 0x0;
		delay(0x80000);
	}
}
           

接下來我們可以試着編譯下

arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫

到這裡還沒有完,因為這些代碼放置在哪裡運作呢?這裡就引出了另外一個“大俠”scatter檔案——分散加載檔案。這個檔案與linux中的連結腳本檔案功能一樣。隻不過scatter不是在linux上的gnu風格的。具體詳細的scatter檔案如何使用,編寫可以百度或者arm ds的幫助文檔。

使用scatter檔案告訴armlinker如何将這些代碼放置在哪裡?因為嵌入式系統中使用的存儲器種類有很多,這個檔案就是指導連結器完成代碼的連結工作。

建立編寫scatter檔案

選中剛才建立的工程 右鍵 》》New 》》Other選擇scatter File

arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫
arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫

因為開發闆已經加載運作了uboot,是以我們現在可以使用DRAM空間(3G)。具體詳細的scatter檔案文法等請百度或者檢視arm ds的幫助文檔scatter章節

;Exynos 4412晶片的記憶體分布
;執行域中的内容所占位址是依次排列的。

LOAD_REGION 0x40008000 0xC800 ;設定用于儲存整個程式所用的空間:50K
{
	EXE_REGION 0x40008000 0xC800 ;根域:加載域==執行域
	{
		start.o ;start.S啟動檔案中的代碼先運作
		*(+RO)  ;接着是其他代碼
	}
	
	; 這個區域位址可以
	STACK_REGION 0x02050000 0x0400 ;由于比較簡單,沒有單獨給棧設定記憶體區域。是以的變量都放置在這裡
	{
		*(+RW,+ZI) ;程式中使用到的變量
	}	
}
           

注意:一個scatter檔案中必須至少有一個固定域。這個固定域用于儲存鏡像的初始入口。任何一個映像檔案都需要指定一個初始入口點(initial entry point),它是影響檔案運作時的入口點

加載域:代碼存放的位址。就是編譯之後得到的二進制檔案燒寫到rom中的這一段區域,所有的代碼RO、預定義變量RW、堆棧之類清不清空無關緊要的大片記憶體區域ZI,都包括在其中

執行域:代碼中變量資料存放的位址。就是把加載域進行‘解壓縮’後的樣子。比如:RO沒有變動還是在ROM中,RW被移到了SRAM中,而ZI被放置在SDRAM中

固定域:所謂固定域是指該域的加載時位址和運作時位址是相同的

scatter檔案格式,就是

加載域

{

      執行域1

     {

     }

      執行域2

     {

     }

}

上述代碼分析:

LOAD_REGION 0x40008000 0xC800:設定了加載域位址為0x40008000 ,這個位址可以從4412手冊memory map章節檢視到。0xC800為這個加載域的大小。LOAD_REGION是這個加載域的名稱可以随便取。

注意:加載域與執行域沒有包含關系,不要被代碼格式所欺騙。想當然的認為和C語言中”{}“一樣

到這裡整個工程就完整了,接下來就是要設定工程屬性中的Image layout

選中工程右鍵選擇Properties 》》 C/C++ Build 》》Settings 》》Arm Linker 5 》》Image layout

設定鏡像入口位址:0x40008000這個得與scatter檔案中的固定域一緻。

添加Scatter檔案的路徑。

arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫

好了到了這裡,我們終于把工程的配置設定完成了。執行編譯操作,檢視是否有錯誤

arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫

沒有問題後,我們開始調試

調試

硬體接線:

arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫

選中工程右鍵  》》 Debug As 選擇對應的晶片

注意:如果在晶片清單中沒有找到對應晶片需要自行建立晶片資料庫。請參考下一章節

arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫
arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫

這裡選擇Exynos 44XX >> Bare Metal Debug >> Debug Cortex-A9_0。表示在晶片的第一個A9核心上調試。

點選Browse選擇DSTREAM調試器

arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫

在File标簽中,選擇編譯生成的axf檔案

arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫

在Debugger标簽中選擇Debug from symbo main

arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫

最後點選Debug,等待DSTREAM連接配接上目标裝置。連接配接成功後軟體自動會停止在main函數處

arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫

點選運作程式,此時可以看到開發闆上LED燈來回閃爍

使用Arm ds與DSTREAM建立晶片資料庫

點選File >> New >> Other...

arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫

選擇Platform Configuration

arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫

選擇自動擷取晶片資料

arm ds開發調試裸機程式——iTOP4412開發闆前言軟體下載下傳建立工程調試使用Arm ds與DSTREAM建立晶片資料庫

然後一步一步按照向導完成晶片資料庫的建立即可