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操作系统的初始化步骤已经大体清晰了^_^
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 ...
- 【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 : -- u-boo ...
- rtems 4.11 console驱动 (arm, beagle)
console驱动框架主要文件是 c/src/lib/libbsp/shared/console.c,驱动的入口是 console_initialize()主要作用是初始化BSP提供的全局变量 Con ...
- rtems 4.11 时钟驱动(arm, beagle)
根据bsp_howto手册,时钟驱动的框架主要在 c/src/lib/libbsp/shared/Clockdrv_shell.h 文件中实现 时钟初始化 时钟驱动初始化函数为 Clock_initi ...
- rtems 4.11 RTC驱动 (arm, beagle)
RTC驱动的框架在 c/src/lib/libbsp/shared/tod.c 中,大部分功能都已经实现了,入口函数是 rtc_initialize(),BSP要实现的东西非常少. beagle的实现 ...
- ARM Linux从Bootloader、kernel到filesystem启动流程
转自:http://www.veryarm.com/1491.html ARM Linux启动流程大致为:bootloader ---->kernel---->root filesyste ...
- ARM启动流程
S3C2440支持两种启动方式:norflash启动和nandflash启动. 一.norflash启动 NOR Flash 的特点是芯片内执行(XIP ,eXecute In Place),这样应用 ...
- arm处理器启动流程分析
2440: 启动方式:nor , nand 地址布局: 启动流程: 开发板在上电后,会从0x0地址处运行. 如果从nor flash启动,则代码要放在nor 的0地址处: 如果从nand flash启 ...
- Arm启动流程解析
谈到arm的启动流程不得不说的是bootloader,但是我这篇文章主要来谈谈arm启动流程的,所以bootloader只是跟大家简介一下就ok.这篇文章我会谈到以下内容: 1.bootloader简 ...
随机推荐
- BZOJ 2146 Construct
Construct [问题描述] 随着改革开放的深入推进…… 小T家要拆迁了…… 当对未来生活充满美好憧憬的小T看到拆迁协议书的时候,小T从一位大好的社会主义青年变成了绝望的钉子户. 由于小T的家位于 ...
- [LeetCode] Rotate List 单项链表旋转
Given a list, rotate the list to the right by k places, where k is non-negative. For example:Given 1 ...
- TCP/IP协议详解笔记——IP协议
简介 TCP/IP协议族中最核心的协议,提供不可靠.无连接的数据报传输服务. 不可靠:不能保证IP数据报能成功送达. 无连接:并不维护后续数据报的状态信息,每个数据报的处理都是相互独立.数据报可能不会 ...
- 【Visual Studio】“rc.exe”已退出,代码为 5 ("rc.exe" exited with code 5.)
[解决方案]找到 rc.exe 所在目录,然后 方法1:添加该目录到 VC++ Directories --> Executable Directories中 方法2:添加到系统变量中的Path ...
- DB2 With语句递归
WITH T1 (T11 , T22 , T33 , T44) AS (SELECT TASKID , REPLY , ROWNUMBER () OVER (PARTITION BY TASKID) ...
- Educational Codeforces Round 39 (Rated for Div. 2) B. Weird Subtraction Process[数论/欧几里得算法]
https://zh.wikipedia.org/wiki/%E8%BC%BE%E8%BD%89%E7%9B%B8%E9%99%A4%E6%B3%95 取模也是一样的,就当多减几次. 在欧几里得最初的 ...
- BZOJ3631 松鼠的新家(树链剖分)
题目链接 松鼠的新家 差不多可以说是树链剖分的模板题了,直接维护即可. #include <bits/stdc++.h> using namespace std; #define REP( ...
- 洛谷——P2040 打开所有的灯
P2040 打开所有的灯 题目背景 pmshz在玩一个益(ruo)智(zhi)的小游戏,目的是打开九盏灯所有的灯,这样的游戏难倒了pmshz... 题目描述 这个灯很奇(fan)怪(ren),点一下就 ...
- 洛谷——P1227 [JSOI2008]完美的对称
P1227 [JSOI2008]完美的对称 题目描述 在峰会期间,必须使用许多保镖保卫参加会议的各国代表.代表们除了由他自己的随身保镖保护外,组委会还指派了一些其他的特工和阻击手保护他们.为了使他们的 ...
- 双网卡环境导致Oracle连接异常
现在就是流行向最高水平看齐,这次项目的部署,好好的SQL Server扔了(有正版授权的企业版,神啊...),逢人就夸:“俺们那上的可是最顶级的Oracle Database System!”.看了看 ...