初学嵌入式遇到的几个问题

来源:互联网 发布:js前端面试题单选题 编辑:程序博客网 时间:2024/05/17 05:56

        1、RVDS编译选项中的RO base、RW base、entry point有何作用?

        ARM镜像文件分为RO(只读)、RW(读写)和ZI(零初始化)三个部分。这三个部分的地址又分为两种,加载时地址和运行时地址。编译选项中的RO、RW确定了映像文件由flash加载到内存中各部分的起始地址,即运行时地址。对于s3c6410而言,在镜像文件小于8KB时,没有设置这些地址的必要。但是当镜像文件大于8KB时,就需要分配各部分的地址。entry point指定了镜像文件的入口点的地址。每个镜像文件都有且只有一个入口点,通常都是将该入口点设置为0。


        2、RVDS中如何设置堆栈?

        这个问题还没有搞懂。在测试流水灯的程序中,通过汇编调用C之前没有设置堆栈,代码也能正常运行,猜测是编译器自己设置了堆栈。但总不能让编译器随便设置堆栈的地址吧?今后找个机会搞懂。


       3、6410启动时为什么会把nand flash中的前8K复制到内存中?

         在6410手册的第8章NFCON中,开头就介绍了这么两句“The 6410 is equipped with an internal SRAM buffer called ‘Steppingstone’. Generally, the boot code will copy NAND flash content to SDRAM.”这个steppingstone就是6410的内置SRAM,大小为8KB。这就是为什么在韦东山的视频里我们可以看到将SP指向8KB地址的原因。在镜像文件小于8KB的情况下,可以完全不用考虑RO、RW的运行时地址的设置;而在镜像文件大于8KB的情况下,需要将RO、RW等进行一定的设置,而在开始的8KB代码中只进行必要的初始化操作,之后跳转到指定的地址执行。


       4、6410启动时为什么要将外设地址告诉CPU?

         在韦东山的视频里我们看到硬件初始化的两个操作。一个将外设的基地址告诉CPU,一个是关看门狗定时器。关看门狗定时器在6410手册的34章watch dog中,提到看门狗定时器的复位使能默认为1,即上电后自动复位。因此我们需要将其置为0。这个很容易理解。但是为什么要将外设的基地址告诉CPU?因为arm11将memory和Peripheral分开,如果不告诉CPU外设的基地址,则CPU会将外设当作memory来访问,这必然是不正确的。


       5、下载代码时为何要下载到0x50008000这个地址?

        这个问题猜测是因为uboot占用了0x50000000到0x50007FFF这段地址,具体原因还不清楚。等研究了uboot之后再弄明白。

0 0
原创粉丝点击