×
单片机 > 单片机程序设计 > 详情

ARM学习笔记14——C语言和汇编相互套用

发布时间:2020-08-26 发布时间:
|

这里,我们要准备两个文件,一个是汇编文件start.S,另一个是C文件led.c。汇编文件套用C文件中的开关灯函数,C文件套用汇编文件中延时函数。


//start.S 


.global led_init 


led_init:    


  @;GPC1CON  


  @;GPC1PUD


loop:  


  mov r0,#1    @将1存到寄存器r0中,实现LED开灯效果


  bl led_ops   @调用C文件中的led_ops函数,此时led_ops函数调用的参数会自动从寄存器中取,即r0


   mov r0,#0    @将0存到寄存器r0中,实现LED关灯效果


  bl led_ops


   b loop      @执行循环,使LED灯不停闪烁


delay:  


  sub r0,r0,#1  


  cmp r0,#0  


  bne delay  


  mov pc,lr



下面是C文件


//led.c 


void led_ops(int a){  


  if(a){   


volatile int *p=(int *)0xe0200080;   //volatile关键字确保本条指令不会因编译器的优化而省略,且要求每次直接读值,注意这个关键字在嵌入式C中非常重要


    *p=*p | (1<<3);  


  }


  else{   


    volatile int *p=(int *)0xe0200080;   


    for(int i=0;i<3;i++){          //执行位清零操作


      *p++=0x00000000;   


    }  


  }  


  delay(0xff0000);             //调用汇编文件中delay标签,执行延时


}


编译方法如下:

arm-linux-gcc led.c -o led.o

arm-linux-gcc start.S -o start.o

arm-linux-gcc -nostartfiles -nostdlib start.o led.o 

关键字:ARM  C语言  汇编  相互套用 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR M16实验之六 DS18B20测温