最近剛剛開始學習ARM-linux,上周買了塊tq2416的板子,給的Linux資料太復雜太深奧不願看,等不及想要把2416跑起來。於是到處找相關裸跑資料,可是用2416的人實在少,網上的資料更少,裸跑的資料幾乎是空白。最后在amobbs上找到一個相關的帖子http://www.amobbs.com/thread-5529091-1-1.html,並通過同事下載了Tifosi_分享的代碼,再通過自己的摸索,終於實現s3c2416的裸跑,這里向Tifosi_及我那位同事淵哥表示感謝!
調試軟件環境:Keil uVision 4.7,這里需要特別注意,有些版本的Keil支持s3c2416 Device,但是不能通過編譯,例如Keil uVision 4.1,會提示不支持ARM926EJ-S
調試工具:J-link V8
目標板:tq2416,當然也可以是其它的板子,前提是引出JTAG引腳,這里一切描述以tq2416為例
Keil配置:下載安裝好Keil uVision 4.7,創建一個新工程,進入target options對話框對編譯環境設置,這里主要設置的地方是Target選項、Debug選項和Utilities選項
Target選項設置
這里使用2416的SRAM進行調試,但是我們這里似乎犯了一個錯誤,因為2416的用戶手冊上提供的memory map上明明標識SRAM的起始位置是0x40000000。其實我確實在這里犯了錯誤,而且這個錯誤持續了好幾天才發現。2416最先啟動的代碼是IROM中固化的程序,IROM的地址是0x00000000,它負責將所選啟動源的啟動代碼拷貝到SRAM,然后把SRAM的地址強制映射至0x00000000,至此,IROM消失了,運行的是SRAM中的代碼。自然,0x40000000處不再有SRAM。這塊被成為Steppingstone的SRAM一共64KB空間,上圖所示將其前32KB設置成ROM,相當於程序存儲器,后32KB設置成RAM,即數據存儲器。

Debug選項配置
這里主要選擇下調試工具(J-LINK),更重要的是添加一個配置腳本文件(如上圖所示.\StartUp\Start.ini文件),這個腳本文件可以通過J-LINK在調試之前使CPU執行命令,這里主要是載入可執行文件以及設置程序執行起始地址,腳本文件內容如下:
1 FUNC void SetupForStart (void) 2 { 3 SP = 0x0000f000; 4 PC = 0x00000000; 5 } 6 LOAD .\Object\s3c2416.axf INCREMENTAL 7 SetupForStart();
接下來設置Utilities選項,參照下圖即可

Utilities選項配置
完成上述設置后,保存,即完成了編譯調試環境設置。接下來需要寫一段代碼,以驗證2416能否正常運行,代碼比較簡單,是用匯編寫的計算1+...+100和的小程序。在工程"s3c2416"中,新建一個"s3c2416_Add.s"文件,寫入以下代碼:
1 AREA RESET, CODE, READONLY;, ALIGN = 3 2 ARM 3 ;PRESERVE8 4 5 ENTRY 6 7 LDR R0,=0x00 ;R0=0 8 LDR R1,=0x00 ;R1=0 9 LDR R2,=0x00008000 ;R2=0x00008000 10 ADDER ADD R0,R0,#0x01 ;R0++ 11 ADD R1,R1,R0 ;R1+=R0 12 CMP R0,#100 ;R0==100?LOOP:ADDER 13 BEQ LOOP 14 B ADDER 15 16 STR R1,[R2] ;*(0x00008000)=R1 17 LOOP B LOOP ;while(1); 18 END
上述代碼的大概思路是:R0為計數器,從1到100;R1為累加器,記錄每次相加的結果;R2是一個指向0x00008000的指針,最終的結果將保存至上述地址;程序開始時先初始化寄存器的值,然后進入循環累加,累加結束后將結果保存至0x00008000處,最終進入一個死循環。保存文件與設置,編譯,無錯誤后便可開始調試。調試前需要保證J-link驅動裝好,並且與開發板上的JTAG口接好。

調試界面
點擊調試按鈕,進入調試界面,調試開始,可以單步執行,觀察各寄存器的值及程序的執行步驟。程序的邏輯很簡單,對或錯關系不大,最重要的意義在於——終於能夠使s3c2416裸跑了!
