这里,我们要准备两个文件,一个是汇编文件start.S,另一个是C文件led.c。汇编文件套用C文件中的开关灯函数,C文件套用汇编文件中延时函数。
//start.S .global led_init led_init: @;GPC1CON @;GPC1PUD loop: mov r0,# @将1存到寄存器r0中,实现LED开灯效果 bl led_ops @调用C文件中的led_ops函数,此时led_ops函数调用的参数会自动从寄存器中取,即r0 mov r0,# @将0存到寄存器r0中,实现LED关灯效果 bl led_ops b loop @执行循环,使LED灯不停闪烁 delay: sub r0,r0,# cmp r0,# bne delay mov pc,lr
下面是C文件
//led.c void led_ops(int a){ if(a){ volatile int *p=(int *)0xe0200080; //volatile关键字确保本条指令不会因编译器的优化而省略,且要求每次直接读值,注意这个关键字在嵌入式C中非常重要 *p=*p | (<<); } else{ volatile int *p=(int *)0xe0200080; for(int i=;i<;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