rtems 4.11 启动流程(arm, beagle)

请参照官方的 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操作系统的初始化步骤已经大体清晰了^_^

时间: 2024-08-24 02:00:53

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

rtems 4.11 IRQ (arm,beagle)

arm IRQ入口在 cpukit/score/arm/arm_exec_interrupt.S 中,其中BSP最关心就是 bl bsp_interrupt_dispatch 这句,看看beagle BSP的实现, c/src/lib/libbsp/arm/beagle/irq.c,实现很简单,找到是哪一个中断源(vector number)引起的中断,然后调用 bsp_interrupt_handler_dispatch 即可,最后中断处理完后,通知中断控制器中断处理结束,可以引入下一个中断了

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

作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 :  -- u-boot 源码 : http://download.csdn.net/detail/han1202012/8342761 -- S3C2440 文档 : http://download.csdn.net/detail/han1202012/8342701 -- S5PV210_iROM_Applicati

15.ARM处理器的启动流程

15.ARM处理器的启动流程 ARM处理器启动流程涉及三方面的知识: 启动方式 地址布局 启动流程 S3c2440的ARM处理器的启动流程: 2440支持 Nor Flash启动,Nor Flash的大小2MB ????Nand Flash启动,Nand Flash的大小256MB 所以2440把uboot和kernel.FileSystem放到Nand Flash来启动的 地址布局:

rtems 4.11 时钟驱动(arm, beagle)

根据bsp_howto手册,时钟驱动的框架主要在 c/src/lib/libbsp/shared/Clockdrv_shell.h 文件中实现 时钟初始化 时钟驱动初始化函数为 Clock_initialize(),这个函数在哪里被调用了呢? cpukit/include/rtems/clockdrv.h 中定义了 CLOCK_DRIVER_TABLE_ENTRY #define CLOCK_DRIVER_TABLE_ENTRY \ { Clock_initialize, NULL, NULL,

rtems 4.11 console驱动 (arm, beagle)

console驱动框架主要文件是 c/src/lib/libbsp/shared/console.c,驱动的入口是 console_initialize()主要作用是初始化BSP提供的全局变量 Console_Configuration_Ports[Console_Configuration_Count],初始化termios架构,注册console设备的文件节点. c/src/lib/libbsp/arm/beagle/console/console-config.c 是beagle BSP提

rtems 4.11 RTC驱动 (arm, beagle)

RTC驱动的框架在 c/src/lib/libbsp/shared/tod.c 中,大部分功能都已经实现了,入口函数是 rtc_initialize(),BSP要实现的东西非常少. beagle的实现在 c/src/lib/libbsp/arm/beagle/rtc.c中,提供一个 rtc_tbl RTC_Table[] 数组,数组的大小存储在 RTC_Count 全局变量中,每一个RTC_Table元素就是一个可能的RTC芯片,rtc_initialize()时,会调用每个RTC_Table元

Arm启动流程解析

谈到arm的启动流程不得不说的是bootloader,但是我这篇文章主要来谈谈arm启动流程的,所以bootloader只是跟大家简介一下就ok.这篇文章我会谈到以下内容: 1.bootloader简介以及其作用 2.2440.6410.210当下比较常见的3款处理器的启动流程进行简单分析,通过这三款处理器的分析希望大家掌握arm处理器的启动分析. Ok我们进入主题 l  Bootloader简介及其作用 在我看来bootloader的作用是初始化必要的硬件,引导内核启动.(当然这是主要作用,今

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

转自:http://www.veryarm.com/1491.html ARM Linux启动流程大致为:bootloader ---->kernel---->root filesystem.bootloader 是一上电就拿到cpu 的控制权的,而bootloader实现了硬件的初始化.bootloader俨然就成了Power on 之后”第一个吃螃蟹”的代码. 谈到这就得想到硬件机制是如何满足这个功能的了.CPU内部一般都集成小容量的SRAM (又叫stapping stone,垫脚石),

[国嵌笔记][029][ARM处理器启动流程分析v2]

2440启动流程 启动方式:nor flash启动.nand flash启动 地址布局: 选择nor flash启动时,SROM(nor flash)地址为0x00000000 选择nand flash启动时,SRAM(SteppingStone)地址为0x00000000 SDRAM(内存)地址为0x30000000 启动流程: 1.第一阶段 首先,处理器复制nand flash的BL1(前4KB)到Steppingstone中,执行BL1(bootloader第一部分).然后,复制BL2(b