关于开发板加电后,CPU执行的第一条指令地址

tongjinjiang123 2011-11-03 05:05:46
请问各位,在一个基于ARM内核的嵌入式系统中,系统在加电或复位时通常是从地址0X00000000处开始执行,
我想问:1、为什么会是在0X00000000这个地址执行第一条指令??
2、为什么第一条指令会是在FLASH中0X0000000寻找,这是什么原理??


请各位高手给我详细解答一下,小弟我虚心求教,不胜感激!!
...全文
459 9 打赏 收藏 转发到动态 举报
写回复
用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的人才需要关心的,作为软件和硬件应用,基本上你知道大概就可以了,时间久了,有了一定的经验和知识的积累,这些问题就很好理解了,当然这只是我个人看法,希望能帮到你。
第一章 概述 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

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧