没有合适的资源?快使用搜索试试~ 我知道了~
首页深入解析S3C2440启动代码:嵌入式开发入门关键
"本文档深入解析了S3C2440启动代码,特别是针对嵌入式新手和进行裸机开发的工程师来说,这是一个极具价值的学习资料。启动文件在嵌入式系统中扮演着关键角色,它负责引导ARM处理器并使其进入可执行的C语言程序环境。在这个过程中,启动代码主要负责初始化硬件,如设置系统时钟、配置内存、配置中断向量表以及设定堆栈等基本任务。 作者强调了理解和熟悉启动代码的重要性,尽管可以直接使用现有的代码进行编程,但深入理解其内部逻辑有助于更好地掌握ARM体系结构,从而编写出性能更优的程序。通过详细剖析`2440INIT.S`文件,作者提供了对内存配置、中断处理、栈设置以及处理器模式切换等相关概念的讲解。例如,内存配置涉及选项、内存块和寄存器的初始化,而中断向量表设置则保证了程序能够正确响应各种中断事件。 CPSR(当前程序状态寄存器)在这里扮演了核心角色,其低5位用来定义不同的工作模式,包括用户模式、快速中断模式(FIQ)、中断模式(IRQ)、管理模式(SVC)、未定义模式和复位模式。中断控制也是启动文件的关键部分,通过设置NOINT,确保在某些模式下中断被禁止,以保持系统的稳定运行。 此外,文档还讨论了不同处理器模式下的栈地址设置,这些地址通常在`option.inc`文件中预先定义,对于理解程序的执行流程和内存管理至关重要。通过这部分内容,读者可以了解到如何有效地在嵌入式环境中进行内存管理和异常处理。 这篇分析详尽地揭示了S3C2440启动代码的内部逻辑,旨在帮助读者建立起对ARM启动过程和基本硬件配置的扎实基础,对于那些希望进一步探索嵌入式开发的人员来说,无疑是一份宝贵的学习资源。"
资源详情
资源推荐
;导入两个关于 MMU 的函数,用于设置时钟模式为异步模式和快速总线模式
IMPORTMMU_SetAsyncBusMode
IMPORTMMU_SetFastBusMode;
;导入 Main,它为 C 语言程序入口函数
IMPORTMain; The main entry of mon program
;导入用于复制从 Nand Flash 中的映像文件到 SDRAM 中的函数
IMPORTRdNF2SDRAM; Copy Image from Nand Flash to SDRAM
;定义代码段,名为 Init
AREAInit,CODE,READONLY
;在入口处(0x0)开始的 8 个字单元空间内,存放的是 ARM 异常中断向量表,
每个字单元空间都是一条跳转指令,当异常发生时,ARM 会自动跳转到相应的
中断向量处,并由该处的跳转指令再跳转到相应的执行函数处
ENTRY;程序入口处
EXPORT__ENTRY;导出__ENTRY,即导出代码段入口地址
__ENTRY;主要用于 MMU
ResetEntry
;1)The code, which converts to Big-endian, should be in little endian code.
;2)The following little endian code will be compiled in Big-Endian mode.
;The code byte order should be changed as the memory bus width.
;3)The pseudo instruction,DCD can not be used here because the linker generates
error.
;在 0x0 处的异常中断是复位异常中断,是上电后执行的第一条指令
;变量 ENDIAN_CHANGE 用于标记是否要从小端模式改变为大端模式,因为
编译器初始模式是小端模式,如果要用大端模式,就要事先把该变量设置为
TRUE,否则为 FLASE
;变量 ENTRY_BUS_WIDTH 用于设置总线的宽度,因为用 16 位和 8 位宽度来
表示 32 位数据时,在大端模式下,数据的含义是不同的
;由于要考虑到大端和小端模式,以及总线的宽度,因此该处看似较复杂,其
实只是一条跳转指令:当为大端模式时,跳转到 ChangeBigEndian 函数处,否
则跳转到 ResetHandler 函数处
ASSERT:DEF:ENDIAN_CHANGE;判断是否定义了
ENDIAN_CHANGE
;如果没有定义,则报告该处错误信息
[ ENDIAN_CHANGE;if ENDIAN_CHANGE ==TRUE
ASSERT:DEF:ENTRY_BUS_WIDTH;判断是否定义了
ENTRY_BUS_WIDTH
;如果没有定义,则报告该处错误信息
[ ENTRY_BUS_WIDTH=32;if ENTRY_BUS_WIDTH ==32
;跳转到 ChangeBigEndian(ChangeBigEndian 在 0x24),因此该条指令的机器
码为 0xea000007
;所以该语句与在该处(即 0x0 处)直接放入 0xea000007 数据(即 DCD
0xea000007)作用相同
bChangeBigEndian
]
[ ENTRY_BUS_WIDTH=16;if ENTRY_BUS_WIDTH ==16
;在小端模式下,用 16 位或 8 位数据总线宽度表示 32 位数据,与用 32 位总线
宽度表示 32 位数据,格式完全一致。但在大端模式下,格式就会发生变化
剩余25页未读,继续阅读
kafkbf
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- AirKiss技术详解:无线传递信息与智能家居连接
- Hibernate主键生成策略详解
- 操作系统实验:位示图法管理磁盘空闲空间
- JSON详解:数据交换的主流格式
- Win7安装Ubuntu双系统详细指南
- FPGA内部结构与工作原理探索
- 信用评分模型解析:WOE、IV与ROC
- 使用LVS+Keepalived构建高可用负载均衡集群
- 微信小程序驱动餐饮与服装业创新转型:便捷管理与低成本优势
- 机器学习入门指南:从基础到进阶
- 解决Win7 IIS配置错误500.22与0x80070032
- SQL-DFS:优化HDFS小文件存储的解决方案
- Hadoop、Hbase、Spark环境部署与主机配置详解
- Kisso:加密会话Cookie实现的单点登录SSO
- OpenCV读取与拼接多幅图像教程
- QT实战:轻松生成与解析JSON数据
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功