硬體平台:使用友善之臂mini2440平台。
軟體平台:keil
下面直接給出例子和注釋。關於使用keil的一些注意事項,以及除錯的注意事項,放在本文末給出。
area led,code,readwrite;宣告乙個**段,可讀寫,名字為led
entry ;標記下面的指令為入口點
include registermap.asmheader;包含registermap.asmheader(見下文)檔案,include偽指令的解釋詳見《arm彙編程式設計學習筆記二》
start
ldr r0,
=gpbcon; r0存放gpbcon的位址
ldr r1,
[r0]
;將r0位址中的值讀入r1中
orr r1,r1,#(
0x01
<<10)
;將r1或(
0x01
<<10)
,並將結果放入r1中
str r1,
[r0]
;將r1中值放入r0所指的位置;;
;上面一段,用於配置gpbcon暫存器
ldr r0,
=gpbup
mov r1,#0xff
; str r1,
[r0];;
;上面一段,用於配置gpbup暫存器
led_loop
ldr r0,
=gpbdat
mov r1,#0x00
str r1,
[r0]
b led_loop;跳轉到led_loop標籤所指的位址,即開始迴圈
end;源程式結尾
;;定義為本程式需要用到的三個暫存器
gpbcon equ 0x56000010
gpbdat *
0x56000014
gpbup *
0x56000018
gpbcon equ 0x56000010
gpbdat *
0x56000014
gpbup *
0x56000018
wtcon *
0x53000000
因為我們需要使用c語言,所以,我們需要定義乙個c語言的入口,按照慣例,我們將其叫做main,但是為了體現是我們手動定義的,將其命名為smain。
c語言裡面的函式,需要用到堆疊,此時我們還需要設定堆疊指標,用於指向內部4k的頂部。
為了讓其具備一定的移植性,將上面的功能單獨成乙個startup.s檔案,如下
;本檔案為2440的啟動檔案
preserve8;注意:這裡應該是需要深究的,但是因為我的開發環境已經在上傳這篇文章時被損壞,沒有細看。如果沒有記錯的話,如果去掉這句,會導致單步除錯出現問題。
area startup,code,readonly,align=3
entry
include registermap.asmheader ;包含標頭檔案
start
; ldr r0,
=wtcon
; mov r1,#0x00
;str r1,
[r0]
;關閉看門狗
ldr sp,
=1024*4
;設定sp為內部4k的頂部
bl smain ;跳轉到main程式
smain
import asm_main
;str lr,
[sp,#-4]
!;將返回位址壓入棧中
;;處理引數
bl asm_main
add sp,sp,#4
; 將棧指標指向存放返回位址的地方
ldr pc,
[sp]
,#4;pc為sp的值加4
end
那麼對應的c檔案如下
#include
"registermap_c.h"
intasm_main()
同樣的,我們便於c語言使用暫存器,也將暫存器單獨在了乙個標頭檔案中,如下:
#define gpbcon (*(volatile unsigned long *)0x56000010)
#define gpbdat (*(volatile unsigned long *)0x56000014)
#define gpbup (*(volatile unsigned long *)0x56000018)
因為並不經常使用mini2440,每次都是幾個月才匆忙用一次,所以常常犯一些常識性問題,現將其記錄如下
單步除錯,需要將開關撥動到nand flash一側,否則無法進行除錯。
memory的對映一定要正確,一般從0開始,讀寫從0x30000000開始
mini2440將二進位制燒寫到nand flash時,可以使用minitools工具,該工具需要nor flash燒寫對應的軟體版本。
jflash在燒寫是需要撥動到nor flash
串列埠工具,在除錯之前需要安裝串列埠驅動,官方光碟中的驅動檔案,在win10中,執行不太好,需要重新在網上找
minitool 工具,需要android的adb驅動
arm學習筆記五 c c 與arm彙編混合程式設計
混合程式設計 常見方式 1 在c c 程式中嵌入彙編指令 語法格式 asm 2 在匯程式設計序中訪問c c 定義的全域性變數 示例 如下 test.c include int gvar 1 12 extern asmdouble void int main void test.s area asmf...
ARM彙編程式設計
arm彙編分類 目前常用的arm彙編指令有兩種 1 arm標準彙編 適用於arm公司的彙編器,適合在windows平台下使用,如ads中使用。2 gnu彙編 適用於gnu交叉編譯工具鏈中的彙編器,適合於linux開發平台。匯程式設計序的框架 section data 初始化的資料 section b...
ARM彙編學習筆記三
常規 ldr r2,r5 將r5為位址的儲存單元中的資料載入到r2中。str r1,r0,0x04 將r1中的內容存放在以 r0 0x04 的記憶體位址單元中。傳送指令型別 ldrb r3,r2 1 以r2為位址讀取乙個位元組資料到r3中。r2更新 r2 r2 1 strh r1,r0,2 半字送達...