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


      这里,我们要准备两个文件,一个是汇编文件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 

  • 相关阅读:
    1-7周成绩总结
    1-6周成绩总结
    第七周学习笔记
    前五周测验成绩总结
    第六周学习笔记
    第五周学习笔记
    2018-2019-2 20189206 Python3学习
    2018-2019-2 20189206 安全工具的学习
    2018-2019-2 20189206 《网络攻防实践》 第一周作业
    2018-2019-1 20189206 《Linux内核原理与分析》第九周作业
  • 原文地址:https://www.cnblogs.com/zjzsky/p/3534864.html
Copyright © 2020-2023  润新知