一.S3C2440的启动方式

S3C2440的MMU有一种“steppingstone”.技术,是协助MCU从无法执行程序的NAND FLASH执行启动程序的一种方法,其启动步骤如下:

  • 1、系统上电后,首先自动判断是否是autoboot模式,如果使用 s3c2440是带有nandflash的,并且被设置成autoboot,从nandflash开始启动.
  • 2、在判断是autoboot模式后,mcu内置的nandflash控制器自动将nandflash的最前面的4k区域(这4k区域存放着 bootloader的最前面4k代码)拷贝到samsung所谓的"steppingstone"里面(steppingstone是在S3C2440 中,实际上是一块4k大小的SRAM,).
  • 3、在拷贝完前4k代码后,nandflash控制器自动将"steppingstone"映射到arm地址空间0x00000000开始的前4k区域.
  • 4、在映射过程完成后.nandflash控制器将pc指针直接指向arm地址空间的0x00000000位置,准备开始执行"steppingstone"上的代码.
  • 5、而"steppingstone"上从nandflash拷贝过来的4k代码,是程序员写的bootloader的前4k代码.这个 bootloader在之前写好,并已经被烧写到nandflash的0x00000000开始的最前面区域…而这"steppingstone"上的 4k代码就是bootloader的前4k代码.
  • 6、在pc指向arm地址空间的0x00000000后,系统就开始执行指令代码.这4k代码的任务是:初始化硬件,设置中断向量表,设置堆栈,然后一个很重要的任务是,将nandflash的最前面区域的bootloader(包含4k启动代码)拷贝到SDRAM中去,bootloader代码的大小是写好bootloader就确定的.然后只需要确定bootloader想映射到SDRAM的起始位置就ok.
  • 7、在完成对nandflash上的bootloader搬移后,找到4k代码的搬移代码最后一个指令的下一个指令在SDRAM的bootloader的地址,然后跳转到该位置,继续执行bootloader的剩余代码(引导系统).

二.代码

汇编代码:


  1. /* 相当于宏定义,定义存储控制器和SDRAM的基地址 */
  2. .equ MEM_CTL_BASE, 0x48000000
  3. .equ SDRAM_BASE, 0x30000000
  4. .text
  5. .global _start
  6. _start:
  7. /* 采用调用函数的形式 */
  8. bl watch_dog_close @关闭看门狗
  9. bl memsetup @设置存储控制器的13个寄存器
  10. bl copy_steppingstone_to_sdram @将Steppingstone4KB复制到SDRAM
  11. ldr pc, =on_sdram @当前程序跳转到SDRAM中去执行
  12. on_sdram:
  13. ldr sp, =0x34000000 @设置栈
  14. bl main @跳转去执行main函数
  15. halt_loop:
  16. b halt_loop
  17. watch_dog_close:
  18. /* 关闭看门狗,否则会一直重启,地址0x53000000,[0]位写0关闭 */
  19. ldr r0, =0x53000000
  20. ldr r1, =0
  21. str r1, [r0]
  22. mov pc, lr
  23. memsetup:
  24. /* 存储控制器的寄存器配置,配置存储控制器以使用SDRAM */
  25. mov r1, #MEM_CTL_BASE
  26. adrl r2, mem_cfg_val @将13个寄存器的值伪读取取到r2
  27. add r3, r1, #52 @r3=r1+52 52:13*4(13个4Byte寄存器)
  28. 1:
  29. ldr r4, [r2], #4 @将r2中的值读取到r4中,然后r2+4
  30. str r4, [r1], #4 @将r4的内容写到r1中存储的地址后,r1中地址+4(初次r1地址为MEM_CTL_BASE)
  31. cmp r1, r3 @比较r1中现在的地址,看看是否完成13个寄存器的相应配置(13*4Byte
  32. bne 1b @如果未完成,继续
  33. mov pc, lr @完成后,返回_start继续执行
  34. .align 4
  35. mem_cfg_val:
  36. /* 存储控制器的13个寄存器的设置值 */
  37. .long 0x22011110 @BWSCON
  38. .long 0x00000700 @BANKCON0
  39. .long 0x00000700 @BANKCON1
  40. .long 0x00000700 @BANKCON2
  41. .long 0x00000700 @BANKCON3
  42. .long 0x00000700 @BANKCON4
  43. .long 0x00000700 @BANKCON5
  44. .long 0x00018005 @BANKCON6
  45. .long 0x00018005 @BANKCON7
  46. .long 0x008c07a3 @REFRESH
  47. .long 0x000000b1 @BANKSIZE
  48. .long 0x00000030 @MRSRB6
  49. .long 0x00000030 @MRSRB7
  50. copy_steppingstone_to_sdram:
  51. /* 将Steppingstone的4KB数据复制到SDRAM中
  52. * Steppingstone的基地址为:0x00000000
  53. * SDRAM的基地址为:0x30000000
  54. */
  55. mov r1, #0 @Steppingstone基地址
  56. ldr r2, =SDRAM_BASE
  57. mov r3, #4*1024
  58. 1:
  59. ldr r4, [r1], #4 @从源地址读取4Byte数据
  60. str r4, [r2], #4 @将源地址的4Byte数据写入目标地址
  61. cmp r1,r3 @对比是否复制完毕
  62. bne 1b
  63. mov pc, lr @完成后,返回_start继续执行

Makefile:

  1. all:
  2. arm-linux-gcc -c -o main.o main.c
  3. arm-linux-gcc -c -o head.o head.S
  4. arm-linux-ld -Ttext 0x30000000 head.o main.o -o sdram.elf
  5. arm-linux-objcopy -O binary -S sdram.elf sdram.bin
  6. arm-linux-objdump -D sdram.elf > sdram.dis
  7. clean:
  8. rm *.o *.elf *.dis

Makefile中:arm-linux-ld -Ttext 0x30000000 head.o main.o -o sdram.elf连接到了SDRAM的基地址0x30000000

S3C2440—9.复制程序到SDRAM中执行的更多相关文章

  1. 用UBOOT自带loadb命令加载应用程序到SDRAM中运行的方法

    S3C44B0开发板中,用UBOOT自带loadb命令加载应用程序到SDRAM中运行的方法    1.开发板说明:  开发板上已有移植好的UBOOT运行.   2.交叉编译工具链为arm-linu-g ...

  2. 汇编语言第二版 程序在dos中执行情况.P86-87

    假设程序要被dos系统加载到sa:0000的内存中,在这个地址的内存开始会有256个字节的PSP程序,用于加载程序和dos系统的通信.ds中的地址为sa. 真正的程序会在这256个字节之后.所以真正程 ...

  3. 让LED程序在片外SDRAM中运行

    让LED程序在片外SDRAM中运行 一.引子 在前一篇文章中,我们已经成功点亮过LED了,为什么还要再重复一次呢? 我们已经知道,Mini2440开发板有两种启动模式:从NorFlash启动和从Nan ...

  4. Java程序在内存中运行详解

    目录 Java程序在内存中运行详解 一.JVM的内存分布 二.程序执行的过程 三.只有一个对象时的内存图 四.两个对象使用同一个方法的内存图 五.两个引用指向同一个对象的内存图 六.使用对象类型作为方 ...

  5. 【python之路2】CMD中执行python程序中文显示乱码

    在IDLE中执行下面代码,中文显示正常: # -*- coding:utf-8 -*- st=raw_input("请输入内容")print st 但在CMD中执行e:\hello ...

  6. 区分execl与system——应用程序中执行命令

    execl:相关函数:fork, execle, execlp, execv, execve, execvp表头文件:#include <unistd.h>函数定义:int execl(c ...

  7. [转]JAVA程序执行顺序,你了解了吗:JAVA中执行顺序,JAVA中赋值顺序

    本文主要介绍以下两块内容的执行顺序,熟悉的大虾可以直接飘过. 一.JAVA中执行顺序 静态块 块 构造器 父类构造器 二.JAVA中赋值顺序 静态块直接赋值 块直接赋值 父类继承的属性已赋值 静态变量 ...

  8. <转载>linux gcc编译器中使用gdb单步调试程序,程序不是顺序执行的。

    原文地址http://blog.csdn.net/abc78400123/article/details/6779108 在用gdb调试,使用s 或n单步执行程序时,发现程序不是按顺序运行的,有时莫名 ...

  9. 通过使用Web Workers,Web应用程序可以在独立于主线程的后台线程中,运行一个脚本操作。这样做的好处是可以在独立线程中执行费时的处理任务,从而允许主线程(通常是UI线程)不会因此被阻塞/放慢。

    Web Workers API - Web API 接口参考 | MDNhttps://developer.mozilla.org/zh-CN/docs/Web/API/Web_Workers_API ...

随机推荐

  1. SpringMVC(7)格式化显示

    在SpringMVC(六)数据验证中我们介绍了如何验证提交的数据的正确性,当数据验证通过后就会被我们保存起来.保存的数据会用于以后的展示,这才是保存的价值.那么在展示的时候如何按照要求显示?(比如:小 ...

  2. 23 shell 进程替换

    0.shell进程替换的用法 1.使用进程替换的必要性 2.进程替换的本质 进程替换和命令替换非常相似.命令替换是把一个命令的输出结果赋值给另一个变量,例如dir_files=`ls -l`或date ...

  3. R 语言学习过程全记录 ~

    RStudio介绍超详细的教程:https://www.jianshu.com/p/132919ca2ca9 前辈的心得:https://blog.csdn.net/kMD8d5R/article/d ...

  4. Spring常见异常说明

    文章要点 Spring bean 的声明方式 Spring bean 的注入规则 Spring bean 的依赖查找规则 Spring bean 的名称定义方式和默认名称规则 XXX required ...

  5. Thymeleaf模板引擎语法

    th:text    用于显示值 th:object      接收后台传来的对象 th:action      提交表单 th:value       绑定值 th:field         绑定 ...

  6. C语言:宏完美定义

    #include <stdio.h> #define M (n*n+3*n) #define M1 n*n+3*n int main(){ int sum, n; printf(" ...

  7. [刘阳Java]_EasyUI环境搭建_第2讲

    在EasyUI的第1讲中我们介绍了学习EasyUI能够做什么,这次我们得快速搭建一个EasyUI环境,来测试一下它的运行效果 1.jQuery EasyUI环境搭建 <script type=& ...

  8. Cannot read property 'data' of undefined —— 小程序开发

    由于疫情原因目前处于半下岗状态,在家的时候就研究起了小程序开发.由于是新手,所以总会遇到各种问题,顺便记录一下. wx.showModal({ title: '提示', content: '这是一个模 ...

  9. synchronized锁代码块(七)

    synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间.这种情况下可以尝试使用 ...

  10. Java程序员必学知识点

    JVM无论什么级别的Java从业者,JVM都是进阶时必须迈过的坎.不管是工作还是面试中,JVM都是必考题.如果不懂JVM的话,薪酬会非常吃亏(近70%的面试者挂在JVM上了) 详细介绍了JVM有关于线 ...