您好,登錄后才能下訂單哦!
Linux驅(qū)動開發(fā)中如何使用匯編語言點亮一個LED,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
電路原理圖如下:
其中,LED和2440的GPF4端口相連;GPF4端口輸出低電平LED點亮。
S3C2440A芯片的GPF端口信息如下:
匯編語言如下:
@******************************************************************************
@ File:led_on.S
@ 功能:LED點燈程序,點亮LED1
@******************************************************************************
.text
.global _start
_start:
LDR R0,=0x56000050 @ R0設為GPFCON寄存器。此寄存器
@ 用于選擇端口B各引腳的功能:
@ 是輸出、是輸入、還是其他
MOV R1,#0x00000100
STR R1,[R0] @ 設置GPF4為輸出口, 位[8:7]=0b01
LDR R0,=0x56000054 @ R0設為GPBDAT寄存器。此寄存器
@ 用于讀/寫端口B各引腳的數(shù)據(jù)
MOV R1,#0x00000000 @ 此值改為0x00000010,
@ 可讓LED1熄滅
STR R1,[R0] @ GPF4輸出0,LED1點亮
MAIN_LOOP:
B MAIN_LOOP
代碼中主要指令解釋:
@后面的東西都是注釋;
.text:是偽指令,表示其下面的語句都屬于代碼段;
.global:將本文件中的某個程序標號定義為全局的,比如上面的代碼表示_start是個全局函數(shù);
LDR:大范圍的地址讀取偽指令;
LDR R0, =0x56000050 //表示將GPF端口配置寄存器地址0x56000050(常數(shù))賦給寄存器R0;
MOV:可以把一個寄存器的值賦給另一個寄存器,或把一個常數(shù)賦給寄存器;
MOV R1, #0x00000100 //#將常數(shù)0x00000100賦給寄存器R1;
STR:將寄存器中的值存儲到內(nèi)存中;
STR R1, [R0] //將R1寄存器中的數(shù)據(jù)保存到地址為R0的內(nèi)存單元中;實際上就是將0x00000100數(shù)據(jù)保存到GPF引腳配置地址0x56000050當中,從而完成對GPF引腳的配置,就是將GPF4引腳配置為輸出引腳。
LDR R0, =0x56000054 //表示將GPF端口數(shù)據(jù)寄存器地址0x56000050(常數(shù))賦給寄存器R0;
MOV R1, #0x00000000 //將常數(shù)0x00000000賦給寄存器R1;
STR R1, [R0] //將將R1寄存器中的數(shù)據(jù)保存到地址為R0的內(nèi)存單元中;其實就是將0x00000000數(shù)據(jù)保存到內(nèi)存地址為0x56000054當中,就是使GPF4輸出低電平。
B:跳轉(zhuǎn)指令,可以在程序中實現(xiàn)跳轉(zhuǎn)功能;在程序中首先定義一個代碼塊MAIN_LOOP,而后跳轉(zhuǎn)到MAIN_LOOP,死循環(huán),程序一直在這里執(zhí)行。
Makefile文件如下:
led_on.bin : led_on.S
arm-linux-gcc -g -c -o led_on.o led_on.S
arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf
arm-linux-objcopy -O binary -S led_on_elf led_on.bin
clean:
rm -f led_on.bin led_on_elf *.o
主要指令介紹:
arm-linux-gcc:交叉編譯工具, 將匯編源碼文件led_on.S經(jīng)過預處理、編譯、匯編生成OBJ目標文件led_on.o;
arm-linux-ld:用于將多個目標文件、庫文件連接成可執(zhí)行文件。
arm-linux-objcopy:用來復制一個目標文件的內(nèi)容到另一個文件中,可以使用不同于源文件的格式來輸出目的文件,即可以進行格式轉(zhuǎn)換。
編輯完源碼之后,可以將源碼和Makefile文件一起拷貝到Ubuntu里面,然后執(zhí)行make命令,生成led_on.bin文件。最后將目標文件燒寫到開發(fā)板中。
關(guān)于Linux驅(qū)動開發(fā)中如何使用匯編語言點亮一個LED問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。