單片機
返回首頁

s3c2440學習之路-003 匯編給C傳參數 點亮不同led燈

2021-09-09 來源:eefocus

硬件平臺:jz2440

軟件平臺:Ubuntu16.04 arm-linux-gcc-3.4.5

源碼位置: https://github.com/lian494362816/C/tree/master/2440/004_led_parma


1原理分析

當使用匯編調用C函數,碰到需要傳參時,可以使用R0-R3來傳遞參數。

R0代表第1個參數,R1代表第2個參數.......當參數超過4個時,就需要靠SP來實現了。

更詳細的說明可以去查“ATPCS規則“。

這里只討論參數不超過4個時的情況。


2源碼

led_on.c


void delay(int delay_time)

{

    while(delay_time --)

    {

        /* nothing */

    }

}


int led_on(int led_num)

{

    unsigned int *pGPF4CON = (unsigned int *)0x56000050;

    unsigned int *pGPFDAT = (unsigned int *)0x56000054;


    if (4 == led_num)

    {^M

        *pGPF4CON = 0x100;

    }

    else if (5 == led_num)

    {

        *pGPF4CON = 0x400;

    }


    *pGPFDAT = 0x0;


    return 0;

}


先看C文件,包含了2個函數,delay 和 led_on。

led_on:傳入4或5來點亮2個不同的LED燈

delay:對傳進來的參數做遞減, 以此來實現簡單的延時


start.s


.global _start

_start:


    ldr sp, =4096 /* for nand */

    /*ldr sp, =0x40000000 + 4096  /* for nor */


    mov r0, #4

    bl led_on

    ldr r0,=10000

    bl delay

    mov r0, #5

    bl led_on


loop:

    b loop


如之前所說的,R0代表第1個參數。 而led_on 和delay都只接收1個參數,所以需要把參數的值都賦值給R0。


(1)先將4賦值給R0然后調用led_on, 相當于調用led_on(4),

(2)然后把10000賦值給R0,再調用delay, 相當于調用delay(10000),

(3)再次把5賦值給R0, 然后調用led_on,相當于調用led_on(5)

這樣就實現了匯編給C傳參,點亮不同的led燈。 這樣簡單的led函數可以在調試u-boot時使用,尤其是當串口還未初始化時,可以通過點亮/熄滅 不同的led燈來判斷代碼執行到了什么位置。

進入單片機查看更多內容>>
相關視頻
  • TI 新一代 C2000? 微控制器:全方位助力伺服及馬達驅動應用

  • MSP430電容觸摸技術 - 防水Demo演示

  • 直播回放: Microchip Timberwolf? 音頻處理器在線研討會

  • 新唐 8051單片機教程

  • 基于靈動MM32W0系列MCU的指夾血氧儀控制及OTA升級應用方案分享

  • 基于靈動MM32SPIN系列MCU的無感FOC便攜冰箱應用方案分享

    相關電子頭條文章
萝卜大香蕉