溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux驅(qū)動開發(fā)中如何使用匯編語言點亮一個LED

發(fā)布時間:2021-10-22 09:52:43 來源:億速云 閱讀:197 作者:柒染 欄目:互聯(lián)網(wǎng)科技

Linux驅(qū)動開發(fā)中如何使用匯編語言點亮一個LED,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

電路原理圖如下:

Linux驅(qū)動開發(fā)中如何使用匯編語言點亮一個LED

其中,LED和2440的GPF4端口相連;GPF4端口輸出低電平LED點亮。

S3C2440A芯片的GPF端口信息如下:

Linux驅(qū)動開發(fā)中如何使用匯編語言點亮一個LED

Linux驅(qū)動開發(fā)中如何使用匯編語言點亮一個LED

Linux驅(qū)動開發(fā)中如何使用匯編語言點亮一個LED

匯編語言如下:

@******************************************************************************
@ 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)知識。

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI