Linux驅(qū)動開發(fā)中如何使用匯編語言點亮一個LED,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
十年的嘉蔭網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。全網(wǎng)整合營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整嘉蔭建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“嘉蔭網(wǎng)站設(shè)計”,“嘉蔭網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。
電路原理圖如下:
其中,LED和2440的GPF4端口相連;GPF4端口輸出低電平LED點亮。
S3C2440A芯片的GPF端口信息如下:
匯編語言如下:
@******************************************************************************
@ File:led_on.S
@ 功能:LED點燈程序,點亮LED1
@******************************************************************************
.text
.global _start
_start:
LDR R0,=0x56000050 @ R0設(shè)為GPFCON寄存器。此寄存器
@ 用于選擇端口B各引腳的功能:
@ 是輸出、是輸入、還是其他
MOV R1,#0x00000100
STR R1,[R0] @ 設(shè)置GPF4為輸出口, 位[8:7]=0b01
LDR R0,=0x56000054 @ R0設(shè)為GPBDAT寄存器。此寄存器
@ 用于讀/寫端口B各引腳的數(shù)據(jù)
MOV R1,#0x00000000 @ 此值改為0x00000010,
@ 可讓LED1熄滅
STR R1,[R0] @ GPF4輸出0,LED1點亮
MAIN_LOOP:
B MAIN_LOOP
代碼中主要指令解釋:
@后面的東西都是注釋;
.text:是偽指令,表示其下面的語句都屬于代碼段;
.global:將本文件中的某個程序標(biāo)號定義為全局的,比如上面的代碼表示_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當(dāng)中,從而完成對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當(dāng)中,就是使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)過預(yù)處理、編譯、匯編生成OBJ目標(biāo)文件led_on.o;
arm-linux-ld:用于將多個目標(biāo)文件、庫文件連接成可執(zhí)行文件。
arm-linux-objcopy:用來復(fù)制一個目標(biāo)文件的內(nèi)容到另一個文件中,可以使用不同于源文件的格式來輸出目的文件,即可以進行格式轉(zhuǎn)換。
編輯完源碼之后,可以將源碼和Makefile文件一起拷貝到Ubuntu里面,然后執(zhí)行make命令,生成led_on.bin文件。最后將目標(biāo)文件燒寫到開發(fā)板中。
關(guān)于Linux驅(qū)動開發(fā)中如何使用匯編語言點亮一個LED問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。