您的位置:首页 > 编程语言 > C语言/C++

OK6410学习之遇到的问题与C语言实现 流水灯

2014-04-12 08:25 387 查看
一、编译用C实现 裸机点亮led程序的时候报错

led.o:(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'

解决方法:
arm-linux-gcc编译的命令后面加一个参数 -nostdlib
禁用标准库文件和标准启动文件,因为裸机程序是通过自己写的汇编程序start.S来启动的

二、不能用烧录到RAM的方法测试

具体原因不清楚,烧到0x50008000的运行看不到效果

猜测应该是要烧录到nandflash上,通电的时候nandflash的8k空间的内容复制到6410的片内8k内存,然后执行,才可以成功

烧录到nandflash的方法:

先烧写到RAM空间0x50008000

然后擦除nand的1M空间:
nand erase 0 100000

把RAM的数据的拷贝到nandflashd的0——1M空间 
nand write 50008000 0 100000



第一个流水灯程序~~加油~

start.S

.globl _start
_start:

/* Peri port setup */
ldr r0, =0x70000000
orr r0, r0, #0x13
mcr p15,0,r0,c15,c2,4

ldr r0, =0x7E004000
mov r1, #0
str r1, [r0]

/* 设置栈 */
ldr sp, =8*1024
bl main
halt:
b halt


led.c
void delay()
{
volatile int i=0;
while(i < 20000)
i++;
}

int main(void)
{
volatile unsigned long * gpmcon = (volatile unsigned long *)(0x7F008820);
volatile unsigned long * gpmdat = (volatile unsigned long *)(0x7F008824);

int i = 0;
*gpmcon = 0x1111;

while(1)
{
for(i=0;i<4;i++)
{
*gpmdat = ~(1<<i);
delay();
}
}
return 0;
}


Makefile

led.bin:start.o led.o
arm-linux-ld -Ttext 0 -o led.elf start.o led.o
arm-linux-objcopy -O binary led.elf led.bin
arm-linux-objdump -D led.elf > led.dis

start.o:start.S
arm-linux-gcc -o start.o start.S -c -nostdlib
led.o:led.c
arm-linux-gcc -o led.o led.c -c -nostdlib

clean:
rm *.o led.elf led.dis led.bin
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息