平台:idea6410
编译器:arm-linux-gcc-4.3.2
当我们没有jtag等工具是也还是可以裸机调试的,不过的借助uboot;
下面是源码及步骤:
1、start.S
.text
.global _start
_start:
ldr r0,=0x7e004000 //关看门狗
mov r1,#0x0
str r1,[r0]
ldr sp,=0xc0008000 //设置运行时栈
bl main //跳转主函数
stop:
b stop
2、led.c
> File Name: led.c
> Author: hcm
> Mail: [email protected]
> Created Time: 2013年12月21日 星期六 00时43分26秒
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define GPFCON (*(volatile unsigned long *)0x7F0080A0)
#define GPFDAT (*(volatile unsigned long *)0x7F0080A4)
#define GPMCON (*(volatile unsigned long *)0x7F008820)
#define GPMDAT (*(volatile unsigned long *)0x7F008824)
void delay(int n);
int main(void)
{
GPFCON |= (1<<30);
GPFDAT |= (1<<15); //蜂鸣器一直响
GPMCON = 0x0;
GPMCON |= (1<<0)|(1<<4)|(1<<8)|(1<<12);
while(1) //四个led一闪一闪
{
GPMDAT |= 0xf;
delay(200000);
GPMDAT &= ~0xf;
delay(200000);
}
return 0;
}
void delay(int n) //延时
{
int i;
for(i=0; i<n; i++)
;
}
3、Makefile
led.bin:start.S led.c
arm-linux-gcc -c -nostdlib start.S -o start.o
arm-linux-gcc -c -nostdlib led.c -o led.o
arm-linux-ld -Ttext c0008000 start.o led.o -o led.elf
arm-linux-objcopy -O binary -S led.elf led.bin
clean:
rm *.o *.elf *.bin
4、make编译
5、将led.bin烧写到已经烧写好uboot的板子上,命令:
dnw c0008000
go c0008000
这样你就可以看到效果了(*^__^*) 嘻嘻……
注意:
在编译的时候如果不加上-nostdlib选项那么将出现:
ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'
make: *** [led_on_c.bin] Error 1
的错误!
提示的错误信息是EABI不支持导致的,建议编译裸奔程序时使用3.4.5的交叉编译器,EABI使用的很多代码(特别是汇编)可能会出错,目前网络上还没有找到专门介绍EABI编译器的编程的文档。修改etc/profile文件的配置,然后source /etc/profile即可
arm-linux-gcc加上-nostdlib选项也OK
因为-nostdlib不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。这个选项常用于编译内核、bootloader等程序,它们不需要启动文件、标准库文件。