Part10.3-一跃进入C语言大门

首先我们怎么由汇编进入C,相对跳转还是绝对跳转?

如何判断我们代码执行成功呢?

 

 

可以看到我们的程序要从SRAM跳转到内存中

所以我们这里需要绝对跳转

但是在SRAM中也有一个代码段,是从内存中拷贝过去的

而我们一般不希望跳转到内存当中去,所以采用绝对跳转

 

 

 

首先新建lesson3,将上一步的内容都放到里面去

然后使用vi main.c

 

int gboot_main()

{

  return 0;

}

 

这个main函数里什么都不做

然后需要在start.S 里面在init_stack后面增加ldr  pc,=gboot_main

还要再Makefile里面增加all:gboot_main.o

 

 

 

make通过以后,我们需要一点改变,在第一阶段(也就是start.S里面,没跳转到main函数时)把点亮小灯的指令注释掉

然后把点亮小灯放到C语言当中完成(ultraedit)

 

 

 

 

#define GPKCON (volatile unsigned long*)0x7f008800//在C语言中地址需要加一个类型,而因为是地址,所以要加个星号表示指针;volatile为了避免不必要的优化

#define GPKDAT (volatile unsigned long*)0x7f008808

#include<stdio.h>

int gboot_main()

{

  *(GPKCON)=0x11110000;//给指针里的内容赋值,GPKCON已经是一个地址了

  *(GPKDAT)=0xa0;

  return 0;

}

 

 

编译,下载

 

如果没有亮,有两个可能:

1、代码写错了

2、210开发板不能点亮,因为从nand flash中把代码放到IRAM时加了一个16字节的头,存储映像长度等信息

但是如果从IRAM放到内存中时,这个头就不需要了,如果一起复制进去,会造成内存代码的  地址整体错乱

所以我们要跳过这个头,在复制代码的时候从垫脚石起点+16字节开始复制,而不是起点

 

posted @ 2017-07-01 21:23  郁兴力  阅读(206)  评论(0)    收藏  举报