在Startup.s文件中包含一个startup的入口函数,该函数为EBOOT的最开始的入口。在系统上电或者冷启动的时候,这是第一个被执行的函数。该函数都是由汇编语言编写的,完成基于硬件平台的最初的初始化,也就是CPU的相关初始化,如果有必要,也可以在这里对外围的设备进行初始化。该函数执行到最后,会跳转到C语言的入口,一般是Main函数,或者叫做EBootMain函数。

这里要多说的一件事情就是在BSP当中存在两个Startup.s文件,一个是EBOOT的Startup.s用于EBOOT本身,另一个是OAL的Startup.s用于WinCE内核。在很多情况下,两个Startup.s所完成的任务非常的相近,所以一般都会合并成一个Startup.s来完成相应的功能。比如你在EBOOT的Startup.s中完成了相关的初始化操作以后,在OAL的Startup.s中只需要include位于EBOOT下的Startup.s就可以了。当然,这两个Startup.s也许不能完全一样,所以不管是真的存在两个Startup.s文件还是共用一个Startup.s文件,你可能都需要在Startup.s中通过条件编译或者判断某个变量的方法来区分。

下面具体说一下在Startup.s中,到底应该做些什么事情:

1.       在系统上电或者复位时,先将CPU设置到正确的模式下面。一般CPU本身会有几种模式,比如对于ARM来说,这个时候一般会设置为管理模式

2.       关闭所有的CPU中断。

3.       关闭内存管理单元MMU和TLB。

4.       关闭写缓冲和Cache。

5.       初始化内存控制器。

6.       设置CPU的PLL,设置时钟。

7.       创建堆栈。

8.       设置并打开MMU和Cache。

9.       如果需要,自己拷贝EBOOT从Flash到RAM中。

10.   跳转到C代码中,一般是Main函数或者EBootMain函数。

下面以ARM为例,来看一个Startup.s的模板:

  • STARTUPTEXT
  • LEAF_ENTRY StartUp
  • ; 设置ARM的CPSR寄存器来设置ARM为管理模式并屏蔽所有中断
  • mov        r0, #(SVC32Mode :OR: NoINTS)
  • msr        cpsr_c, r0
  • ; 设置CP15协处理器,关闭MMU和Cache
  • ldr                r0, =CP15ControlInit
  • WRMMU_STATE        r0
  • ldr                r0, =CP15AuxControlInit
  • WRMMU_AUX_STATE   r0
  • ; 刷新TLB表和Cache
  • mov        r0, #0x0
  • WRMMU_FlushTB       r0
  • WRCACHE_FlushIDC    r0
  • ; 释放写缓冲
  • mov     r0, #0
  • mcr     p15, 0, r0, c7, c10, 4
  • CPWAIT
  • ; 创建一个临时的堆栈,使用SRAM中的头32KB
  • ldr     sp, =(CPU_SRAM0 + SZ_32K - 4)
  • bl      disableInts                     ; 屏蔽外部中断
  • bl      initUART                       ; 初始化串口
  • bl      initClocks                      ; 初始化系统时钟
  • bl      initStaticMem                 ; 初始化Flash片选控制器
  • bl      initSDRAM                    ; 初始化SDRAM控制器
  • bl      sizeSDRAM                   ; 返回SDRAM的大小
  • IF EBOOT
  • ; 重定位Flash中的代码到RAM中
  • bl       EverythingRelocate
  • ; 重定位成功后,跳转到RealStartup新地址运行,否则接着运行
  • cmp     r0, #-1
  • movne   pc, r0
  • ENDIF
  • RealStartup
  • IF EBOOT
  • bl      EbootMain       ; 跳转到EbootMain函数,就是EBOOT的C语言代码中
  • ELSE
  • adr     r0, OEMAddressTable     ; r0 = physical address of OEMMemoryMap
  • bl      KernelStart      ; 跳转到KernelStart函数,并传入物理虚拟地址映射表
  • ENDIF
  • ; 这里是一个死循环,代码应该永远也执行不到这里
  • spin    b       spin
  • ENTRY_END

整个Startup.s的流程就是这样,一般开发这段代码需要对处理器及汇编语言比较了解,其实也不是很复杂,就是做最基本的初始化,该函数一般也就几百行。调试可能稍微费劲一些,在最开始的时候一般通过点灯(Led)的方式来调试,就是说写个小的汇编函数,通过把GPIO拉高拉低来点亮和熄灭LED灯。然后在Startup.s中的不同位置调用该函数从而判断函数是否执行到相应的地方。

startup.c的更多相关文章

  1. 学习ASP.NET Core, 怎能不了解请求处理管道[5]: 中间件注册可以除了可以使用Startup之外,还可以选择StartupFilter

    中间件的注册除了可以借助Startup对象(DelegateStartup或者ConventionBasedStartup)来完成之外,也可以利用另一个叫做StartupFilter的对象来实现.所谓 ...

  2. 学习ASP.NET Core, 怎能不了解请求处理管道[4]: 应用的入口——Startup

    一个ASP.NET Core应用被启动之后就具有了针对请求的处理能力,而这个能力是由管道赋予的,所以应用的启动同时意味着管道的成功构建.由于管道是由注册的服务器和若干中间件构成的,所以应用启动过程中一 ...

  3. ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)

    ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件) Startup Class 1.Startup Constructor(构造函数) 2.Configure ...

  4. Tips for Planning Your Business Startup

    原文链接:http://domaintree.me/?p=1037 By Robert Thibodeau –  Starting a business can be a very daunting ...

  5. Asp.Net MVC<九>:OWIN,关于StartUp.cs

    https://msdn.microsoft.com/zh-cn/magazine/dn451439.aspx(Katana 项目入门) 一不小心写了个WEB服务器 快刀斩乱麻之 Katana OWI ...

  6. Startup配置类 居然又是约定

    Microsoft.Owin.Host.SystemWeb 这个dll可以让OWin接管IIS的请求,虽然同样是托管在IIS,但是所有的请求都会被OWin来处理.在OWin的4层结构中(Applica ...

  7. java.lang.ClassNotFoundException: org.apache.catalina.startup.VersionLoggerListener

    解决办法 找到Tomcat配置文件server.xml   apache-tomcat-7.0.57/conf 将<Listener className="org.apache.cat ...

  8. eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错? java.lang.ClassNotFoundException: com.branchitech.app.startup.AppStartupContextListener java.lang.ClassN

    eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错?java. ...

  9. warnin php startup in unknown on line 0:

    PHP Warning:  PHP Startup:  in Unknown on line 0 这种情况是因为扩展路径有问题导致的路径或错,或没有该扩展但ini中开启了此扩展

  10. schematool -dbType mysql -initSchema hive startup failed...try this

    schematool -dbType mysql -initSchema hive startup failed

随机推荐

  1. URAL 1658. Sum of Digits(DP)

    题目链接 隔了一年零三个月,重新刷URAL,这题挺麻烦的输出路径.输出路径挺扯的,乱写了写乱改改就A了...我本来想用很靠谱,记录每一条路径的,然后输出最小的,结果Tle,然后我使劲水水又过了一组,发 ...

  2. 【BZOJ2818】Gcd 欧拉筛

    Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sam ...

  3. 【noiOJ】p6253

    t6253:用二分法求方程的根 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 用二分法求下面方程在(-10, 10)之间的一个根. 2x3- 4x2+ 3x ...

  4. NOI模拟赛Day3

    终于A题啦鼓掌~开心~ 开考看完题后,觉得第二题很好捏(傻叉上线 搞到十一点准备弃疗了然后突然发现我会做第一题 于是瞎码了码,就去准备饭票了... 好了,停止扯淡(就我一个我妹子每天不说话好难受QAQ ...

  5. spring源码学习之路---环境搭建(一)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近已经开始了spring源 ...

  6. IOS启动顺序

    一.UIApplicationMain的执行步骤1.创建一个UIApplication对象,一个程序对应一个UIApplication对象(单例),UIApplication对象是程序的象征2.接下来 ...

  7. DBLink创建 ORA-12154: TNS: 无法解析指定的连接标识符

    因为对oracle不了解,这个问题可TM的搞了好久! 走的弯路: 1. 在客服端的PLSQL连接工具上折腾,而不是在服务器的PLSQL解决 2. 配置的tnsnames.org文件在环境变量path( ...

  8. JS文档生成工具:JSDoc 介绍

    JSDoc是一个根据javascript文件中注释的信息,生成API文档的工具.生成的文档是html文件.类似JavaDoc和PHPDoc. 用法 /** 一坨注释之类的 */JSDoc会从/**开头 ...

  9. CAS单点登录配置

    见http://download.csdn.net/detail/u010786672/6942715下载.

  10. github的git.exe的目录所在

    github的git.exe位于 C:\Users\[username]\AppData\Local\GitHub\PortableGit_25d850739bc178b2eb13c3e2a9faaf ...