请参照官方的 bsp_howto 文档,对arm来说,首先执行的文件是start.S

start.S

c/src/lib/libbsp/arm/shared/start/start.S

1、从 _start 开始执行
2、关CPU中断,初始化寄存器,设置好各mode的栈,调用 bsp_start_hook_0(),注意:此时异常向量表还没有配置好
3、然后拷贝vector到真正的位置(但没有设置cp15)
4、调用 bsp_start_hook_1()
5、最后调用 boot_card(),这个函数不应该返回,如果不幸返回,将会调用 bsp_reset() 重启
 
根据 bsp_howto 文档,在调用boot_card()之前应该做的事情如下:
1、init stack
2、zero .bss
3、disable irq
4、copy .data to RAM
其中第2和4项没有在start.S中出现,它们在哪里呢? 让我们看看beagle的bsp_start_hook_0()和bsp_start_hook_1(),它们在
 
c/src/lib/libbsp/arm/beagle/startup/bspstarthooks.c
 
bsp_start_hook_0() 什么也没干
 
bsp_start_hook_1()
  arm_a8core_start_hook_1() => c/src/lib/libbsp/arm/include/arm-a8core-start.h  告诉cp15,中断向量的位置
  bsp_start_copy_sections() => c/src/lib/libbsp/arm/include/start.h  拷贝标准sections到内存,包括.data初始化数据到内存
  beagle_setup_mmu_and_cache() => c/src/lib/libbsp/arm/beagle/startup/bspstartmmu.c 设置板子的mmu
  bsp_start_clear_bss() => c/src/lib/libbsp/arm/include/start.h  清零.bss段
 
至此 bsp_howto 中boot_card()之前的各项任务都已经完成,接下来看看 boot_card()

boot_card()

boot_card()的默认实现在 c/src/lib/libbsp/shared/bootcard.c,实现很简单:
1、关中断
2、记录命令行(如果bootloader是uboot,可能会有命令行)
3、调用 rtems_initialize_executive() 进入rtems的核心地带~
 
rtems_initialize_executive()在 cpukit/sapi/src/exinit.c
把所有注册的 rtems_sysinit_item (初始化项)都调用一遍,之后操作系统正式开始运行
 
话说 rtems_sysinit_item 是哪里来的呢?说到这里咱还得回想下 bsp_howto 手册里说好的 bsp_work_area_initialize/bsp_start/bsp_predriver_hook都哪里了,回头看看 bootcard.c 吧,在boot_card()函数之上还有这些定义

RTEMS_SYSINIT_ITEM(
bsp_work_area_initialize,
RTEMS_SYSINIT_BSP_WORK_AREAS,
RTEMS_SYSINIT_ORDER_MIDDLE
); RTEMS_SYSINIT_ITEM(
bsp_start,
RTEMS_SYSINIT_BSP_START,
RTEMS_SYSINIT_ORDER_MIDDLE
); RTEMS_SYSINIT_ITEM(
bsp_predriver_hook,
RTEMS_SYSINIT_BSP_PRE_DRIVERS,
RTEMS_SYSINIT_ORDER_MIDDLE
);

rtems_sysinit_item 就是这么定义的!那它们的顺序是怎么样的呢,看看 cpukit/score/include/rtems/sysinit.h 大概就是按照这个定义的顺序,至于如何按定义的顺序执行,我现在也不知道,先挖个坑 。
 
bsp_work_area_initialize() 在 c/src/lib/libbsp/shared/bspgetworkarea.c,一般采用默认实现
bsp_start() 在 c/src/lib/libbsp/arm/beagle/startup/bspstart.c 调用 bsp_interrupt_initialize() => bsp_interrupt_facility_initialize() 初始化中断控制器(正如bsp_howto手册里说的一样)(在 c/src/lib/libbsp/arm/beagle/irq.c 中)
bsp_predriver_hook() 默认实现在 c/src/lib/libbsp/shared/bsppredriverhook.c 什么也没做

其他

bsp_reset()在 c/src/lib/libbsp/arm/beagle/startup/bspreset.c 主要作用就是重启系统
 
beagle_setup_mmu_and_cache()初始化MMU,根据section配置表初始化MMU,而这个表大部分都是 ARMV7_CP15_START_DEFAULT_SECTIONS,定义在 c/src/lib/libbsp/arm/shared/include/arm-cp15-start.h 中!
 
至此,rtems操作系统的初始化步骤已经大体清晰了^_^

rtems 4.11 启动流程(arm, beagle)的更多相关文章

  1. rtems 4.11 IRQ (arm,beagle)

    arm IRQ入口在 cpukit/score/arm/arm_exec_interrupt.S 中,其中BSP最关心就是 bl bsp_interrupt_dispatch 这句,看看beagle ...

  2. 【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 :  -- u-boo ...

  3. rtems 4.11 console驱动 (arm, beagle)

    console驱动框架主要文件是 c/src/lib/libbsp/shared/console.c,驱动的入口是 console_initialize()主要作用是初始化BSP提供的全局变量 Con ...

  4. rtems 4.11 时钟驱动(arm, beagle)

    根据bsp_howto手册,时钟驱动的框架主要在 c/src/lib/libbsp/shared/Clockdrv_shell.h 文件中实现 时钟初始化 时钟驱动初始化函数为 Clock_initi ...

  5. rtems 4.11 RTC驱动 (arm, beagle)

    RTC驱动的框架在 c/src/lib/libbsp/shared/tod.c 中,大部分功能都已经实现了,入口函数是 rtc_initialize(),BSP要实现的东西非常少. beagle的实现 ...

  6. ARM Linux从Bootloader、kernel到filesystem启动流程

    转自:http://www.veryarm.com/1491.html ARM Linux启动流程大致为:bootloader ---->kernel---->root filesyste ...

  7. ARM启动流程

    S3C2440支持两种启动方式:norflash启动和nandflash启动. 一.norflash启动 NOR Flash 的特点是芯片内执行(XIP ,eXecute In Place),这样应用 ...

  8. arm处理器启动流程分析

    2440: 启动方式:nor , nand 地址布局: 启动流程: 开发板在上电后,会从0x0地址处运行. 如果从nor flash启动,则代码要放在nor 的0地址处: 如果从nand flash启 ...

  9. Arm启动流程解析

    谈到arm的启动流程不得不说的是bootloader,但是我这篇文章主要来谈谈arm启动流程的,所以bootloader只是跟大家简介一下就ok.这篇文章我会谈到以下内容: 1.bootloader简 ...

随机推荐

  1. pat 甲级 1127. ZigZagging on a Tree (30)

    1127. ZigZagging on a Tree (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...

  2. pat 团体天梯赛 L3-010. 是否完全二叉搜索树

    L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...

  3. BZOJ1709超级弹珠

    1709: [Usaco2007 Oct]Super Paintball超级弹珠 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 352  Solved:  ...

  4. http://www.codeproject.com/KB/validation/MultipleDataAnnotations.aspx

    原文发布时间为:2011-08-12 -- 来源于本人的百度文章 [由搬家工具导入] http://www.codeproject.com/KB/validation/MultipleDataAnno ...

  5. js scrollTop, 滚动条操作

    设置页面加载时滚动条自动滚到底的方法: jQuery: 复制代码 代码如下: $(function(){ var h = $(document).height()-$(window).height() ...

  6. Push pull, open drain circuit, pull up, pull down resistor

    Push pull 就以下面這個 電路來說, 因為沒有 pull up resistor, 所以 output voltage 由 low 往 high 的速度會較快. 有兩個電晶體,一個on,一個 ...

  7. 和菜鸟一起学android4.0.3源码之lcd屏幕背光调节

    周六的中午还是依旧来了公司,本来也没有打算来的,既然来了,那就把上次遗留下来的一些问题给解决吧,把android下的pwm调lcd背光给总结下吧.关于android的背光,是用pwm波来控制的,通过占 ...

  8. jdbc in postgres

    try { Class.forName("org.postgresql.Driver").newInstance(); String url = "jdbc:postgr ...

  9. vue element-ui Tabs 标签页实现【更多】功能

    element-ui Tabs本身是没有更多功能的,如果在外边添加一个更多按钮,又非常不好看, 而利用API中Tabs Attributes的before-leave勾子方法可以实现这个功能, 简单P ...

  10. 查询执行慢的SQL

    --执行慢的SQL: SELECT S.SQL_TEXT, S.SQL_FULLTEXT, S.SQL_ID, ROUND(ELAPSED_TIME / 1000000 / (CASE WHEN (E ...