社区
驱动开发/核心开发
帖子详情
关于开发板加电后,CPU执行的第一条指令地址
tongjinjiang123
2011-11-03 05:05:46
请问各位,在一个基于ARM内核的嵌入式系统中,系统在加电或复位时通常是从地址0X00000000处开始执行,
我想问:1、为什么会是在0X00000000这个地址执行第一条指令??
2、为什么第一条指令会是在FLASH中0X0000000寻找,这是什么原理??
请各位高手给我详细解答一下,小弟我虚心求教,不胜感激!!
...全文
459
9
打赏
收藏
关于开发板加电后,CPU执行的第一条指令地址
请问各位,在一个基于ARM内核的嵌入式系统中,系统在加电或复位时通常是从地址0X00000000处开始执行, 我想问:1、为什么会是在0X00000000这个地址执行第一条指令?? 2、为什么第一条指令会是在FLASH中0X0000000寻找,这是什么原理?? 请各位高手给我详细解答一下,小弟我虚心求教,不胜感激!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
bjtea
2011-11-04
打赏
举报
回复
相对于CPU而言,程序起跳的这个0地址是唯一的,不可能同时存在两个0地址单元,第1条指令就安排在这个地方。
Vincent_Song
2011-11-04
打赏
举报
回复
重启后PC寄存器的值为0x0,所以CPU就去0x0去取指令了,至于为什么去flash中取,是因为一般都将固态存储器(掉电非易失)在嵌入式平台中通常是flash安放在CPU的bank0上,也就是地址段开始的地方,所以编址也就是从flash开始,CPU去指令时就去flahs中取了。
希望能够帮到你!
ezword
2011-11-04
打赏
举报
回复
的确没什么道理的,硬件决定的。
AnYidan
2011-11-04
打赏
举报
回复
没什么道理,约定而已
hong60104
2011-11-04
打赏
举报
回复
为什么去FLASH中取指?我个人的理解是FLASH已经被映射到了0x0地址处;CPU总是有一个起点的,就如我们的每天醒来总是 先想着去刷牙一样,CPU约定俗成的在0x0地址处开始工作而已。
tongjinjiang123
2011-11-03
打赏
举报
回复
[Quote=引用 1 楼 youzi722 的回复:]
因为芯片CPU的数字电路逻辑就是这样的。
ARM的CPU就像一个流水线,一般按取指、分析、执行三级流水线设计。
取指就是从存储空间中(也可能是CACHE中)取出指令来,为保证其可控进行,用一个寄存器指示当前取那个地址的指令,这个寄存器通常称为PC寄存器。这个寄存器在硬件复位后被硬件复位为0x00000000。所以复位后从0地址开始执行。某些单片机可以不从0地址执行,是因为硬件复位后这个……
[/Quote]
其实我理论也学了有一段时间了,你说的就是PC寄存器的原因,如果加电或者复位,PC寄存器都会初始化0X00000000地址开始执行,但是我不知道为什么是去执行FLASH当中的地址,而不是其他存储器的0地址,是不是需要设置,我主要是不明白这点,困惑我几天了,希望你能把我解答。不过在此之前非常感谢你
tongjinjiang123
2011-11-03
打赏
举报
回复
[Quote=引用 2 楼 yoveldf 的回复:]
个人理解:
第一条执行的指令应该是在cpu自带的iROM中,一般iROM中都会固化一段代码(出厂时应该就烧录好)。这段代码会做好cpu最最基本的初始化,如时钟、堆、栈等。然后根据启动方式(根据cpu某些管脚的电平状态来判断从哪里启动)将boot从对应的启动设备拷贝至ram里启动。
[/Quote]
你说的这些,在基于ARM嵌入式系统当中,各个设备好像不会有固化代码初始化,因为没有固化程序基于ARM嵌入式系统当中,需要用bootloader来初始化各个硬件以及设置堆栈等操作,为后期加载系统做准备!
yoveldf
2011-11-03
打赏
举报
回复
个人理解:
第一条执行的指令应该是在cpu自带的iROM中,一般iROM中都会固化一段代码(出厂时应该就烧录好)。这段代码会做好cpu最最基本的初始化,如时钟、堆、栈等。然后根据启动方式(根据cpu某些管脚的电平状态来判断从哪里启动)将boot从对应的启动设备拷贝至ram里启动。
youzi722
2011-11-03
打赏
举报
回复
因为芯片CPU的数字电路逻辑就是这样的。
ARM的CPU就像一个流水线,一般按取指、分析、执行三级流水线设计。
取指就是从存储空间中(也可能是CACHE中)取出指令来,为保证其可控进行,用一个寄存器指示当前取那个地址的指令,这个寄存器通常称为PC寄存器。这个寄存器在硬件复位后被硬件复位为0x00000000。所以复位后从0地址开始执行。某些单片机可以不从0地址执行,是因为硬件复位后这个PC寄存器不指向0地址。在ARM中取出的指令其实就是CPU可识别的32bits的二进制序列。
分析逻辑单元负责分析取指取出来得二进制序列,如果可识别,就送执行,如果不可识别就进异常。分析过程还分析此指令需要那些资源等(如用那个寄存器,是否需要访问总线,是否需要转移等)。
执行单元就是执行了,就好比你面前有一堆按钮,分析单元告诉你按那个你就按那个喽。
之所以分三级流水线,是为了提高CPU的速度,因为这三步相互之间比较独立。如果不用流水线,只能第一个时钟取指,然后第二个时钟周期分析,第三个时钟周期开始执行。这样效率不高,流水线过程就是在第一个指令执行的时候,分析第二条指令,取第三条指令。因为CPU大多数情况下是顺序执行的,所以这样可以提高效率。其他的CPU,如DSP采用6级流水线结构,分的更细。
LZ可能初学ARM吧,类似这样的问题建议您先存疑,而不必把精力过多的放到这些特别细节的东西上,因为这些东西的细节基本都是设计CPU的人才需要关心的,作为软件和硬件应用,基本上你知道大概就可以了,时间久了,有了一定的经验和知识的积累,这些问题就很好理解了,当然这只是我个人看法,希望能帮到你。
U-BOOT启动流程详解
开发板
上电后,
执行
U-Boot的
第一条
指令
,然后顺序
执行
U-Boot启动函数。函数调用顺序如图6.3所示。 看一下board/smsk2410/u-boot.lds这个链接脚本,可以知道目标程序的各部分链接顺序。第一个要链接的是
cpu
/arm920t/start.o,那么U-Boot的入口
指令
一定位于这个程序中。下面详细分析一下程序跳转和函数的调用关系以及函数实现。
U-Boot启动过程
开发板
上电后,
执行
U-Boot的
第一条
指令
,然后顺序
执行
U-Boot启动函数。看一下board/smdk2410/u-boot.lds这个链接脚本,可以知道目标程序的各部分链接顺序。第一个要链接的是
cpu
/arm920t/start.o,那么U-Boot的入口
指令
一定位于这个程序中。下面分两阶段介绍启动流程:
玩转你的
开发板
-1.4.第1季第4部分
本课程是《朱有鹏老师单片机完全学习系列课程》第1季第4个课程,主要内容是带领大家玩转课程配套
开发板
,包括:
开发板
的整体配件认识、检测、程序下载及接线、实验现象的确认等。目的是让大家学会下载程序进行实验,以便后续自己编写程序时可以去实验验证。
MC20_Hardware_移远GSM
开发板
指导文档.rar_GNSS_GPS_GSM_chargejoo_mc20
第2部分: MC20硬件文档和设计指导 -
开发板
指导文档 Quectel移远MC20 GSM/GNSS/BLE模块的全部文档、资源,大部分未曾公开。分7个部分上传: 1. MC20模块介绍、
指令
/软件/使用手册、应用/生产指导、驱动 2. MC20硬件文档和设计指导 3. MC20 Open
CPU
文档 4. MC20 Open
CPU
SDK V1.1 5. MC20 Open
CPU
SDK V1.3 6. MC20开发工具,含全部版本的QFlash 7. MC20开发Open
CPU
所需的GCC编译器
SOPC系统入门教程
第一章 概述 1.1 SOPC 的概念 1.2 SOPC 系统设计流程 1.2.1 SOPC Builder 的设计流程 1.2.2 SOPC Builder 的设计阶段 1.2.3 SOPC 系统开发流程 1.3 SOPC 系统开发环境 1.4 本书中的系统配置 第二章 SOPC 系统构架 2.1 系统模块框图 2.2 Nios
CPU
2.2.1
指令
总线主端口 2.2.2 数据总线主端口 2.2.3 缓冲存储器 2.2.4 移位单元 2.2.5 乘法支持 2.2.6 中断支持 2.2.7 Nios 片上调试模块 2.2.8 开发环境 2.3 Avalon 总线 2.3.1 基本概念 2.3.2 Avalon 总线传输 2.3.3 Avalon 三态接口 2.3.4
地址
对齐 2.4 外设IP 模块 2.4.1 通用异步串行接口(UART ) 2.4.2 可编程并行输入/输出模块(PIO ) 2.4.3 定时器 2.4.4 DMA 控制器 第三章 系统硬件开发 3.1 硬件开发流程 3.2 创建Quartus II 工程 3.3 创建Nios 系统模块 3.3.1 开始使用SOPC Builder 3.3.2 系统频率 3.3.3 添加
CPU
和外设模块 3.3.4 指定基
地址
3.3.5 生成系统模块 3.3.6 添加符号到BDF 中 3.4 编译设计(Compilation) 3.5 编程(Programming ) 3.5.1 配置FPGA 3.5.2 用户微控制器 3.5.3 在Nios 系统上运行软件 3.6 下载设计到 Flash 存储器 第四章 系统软件开发 4.1 软件开发流程 4.2 软件开发环境 4.3 文件系统 4.4 软件开发工具 4.4.1 GNUPro 工具 4.4.2 Nios OCI 调试模块 4.4.3 Nios OCI 调试控制台 4.4.4 Nios SDK Shell 4.5 可配置的处理器硬件属性 4.5.1 乘法器 4.5.2 数据和
指令
高速缓冲器 4.5.3 用户
指令
4.5.4 同时
执行
的多主(Multi-Master)总线结构和 DMA 4.5.5 数据和
指令
高速缓冲器 4.5.6 外设和存储器接口 4.6 Nios SDK 4.6.1 inc 目录 4.6.2 lib 目录 4.6.3 src 目录 4.7 软件开发应用 4.7.1 开始前的准备 4.7.2 打开 Nios SDK Shell 4.7.3 编译程序 4.7.4 用insight 下载、运行和调试程序 4.7.5 用Nios OCI 调制控制台下载、运行和调试程序 4.7.6 重建(rebuild)软件 4.7.7 下载软件到 Flash 4.7.8 第三方开发和调试工具 4.8 使用.hexout 4.9 其它的
开发板
通信和调试方法 4.9.1 GERMS 监视器 4.9.2 Insight:GNU调试器 4.9.3 Gprof:GNU Profiler 4.10 Nios SDK Shell提示信息 4.11 在 Nios 系统中实现中断服务程序(ISR) 4.12 用户自定义
指令
4.12.1 用户自定义
指令
的概念 4.12.2 加速效果 4.12.3 用户自定义
指令
应用 第五章 系统模拟与调试 5.1 软件配置 5.2 模拟设置 5.2.1 存储器初始化 5.2.2 UART 外设模拟设置 5.2.3 SOPC Builder模拟设置 5.2.4 通用系统模拟文件 5.3 ModelSim 模拟 5.4 模拟结果分析 5.4.1 通过 UART 外设同 GERMS 监控程序交互 5.4.2
执行
PIO 外设操作的 C 程序 5.5 增加/删除波形图信号 5.6 片外存储器模拟 5.6.1 使用自动产生的存储器模块 5.6.2 指定一个定制模块 5.6.3 定义存储器模块内容 5.7 调试 5.7.1 使用 SignalTap II 逻辑分析器 5.7.2 使用 SignalProbe 5.7.3 使用 Chip Editor 第六章 系统设计实例 6.1 建立硬件需求 6.2 创建一个基本的Nios 设计 6.3 GDB 调试 6.4 添加用户外设 6.5 RTL 仿真 6.6 Flash 编程 6.7 用户
指令
和DMA 6.8 MP3 播放器 附录 1:Nios 嵌入式处理器 32 位
指令
集 附录 2:Nios 嵌入式处理器
开发板
-APEX 20K200E 附录 3:Nios 嵌入式处理器
开发板
-Cyclone_1C20 附录 4:Nios 嵌入式处理器
开发板
-Stratix_1S10 附录 5:Nios 嵌入式处理器
开发板
-Stratix_1S40 参考文献
驱动开发/核心开发
21,600
社区成员
21,708
社区内容
发帖
与我相关
我的任务
驱动开发/核心开发
硬件/嵌入开发 驱动开发/核心开发
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章