这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » ARM ARM上电后的第一条指令在哪里开始

共2条 1/1 1 跳转至

ARM ARM上电后的第一条指令在哪里开始

院士
2006-09-17 18:14:16     打赏
ARM ARM上电后的第一条指令在哪里开始



关键词: 上电     后的     一条     指令     在哪里     开始    

院士
2006-12-22 22:43:00     打赏
2楼
问 这玩意儿不像那些8位机好懂。它执行的指令是在RAM中还是ROM中?
一般的8位机好像程序都是从ROM中读一条执行一条。RAM只是放了一点中间产生的结果。
PC机好像就是先从BIOS中读点东西。但程序什么的还是得在RAM中运行的。那么ARM是怎么工作的呢? 1: ARM上电后的第一条指令  ARM上电后的第一次执行复位向量处指令,该指令通常是在ROM中.上电后ARM 首先要初始化内部环境(它包括内部资源的配置,并将ROM中的程序复制到RAM).其次,强制程序转到RAM中取指(因为从RAM中取指比ROM中快).建议看看相关的BOOTLOADER 程序 2: 和51单片机一样,对比着学习!!!程序一般只有在仿真调试时才放在片内或片外RAM中运行,最终的程序要放在片内或片外的flash
存储器中运行。一般只有atmel公司有些型号的ARM芯片在片内集成了大量的
flash 程序存储器。
3: 我是这样理解的
   其实我是这样理解的:

   我们可以看到 启动代码里面有这样一段代码:

Vectors
        LDR     PC, ResetAddr
        
ResetAddr           DCD     Reset


Reset
        BL      InitStack               ;初始化堆栈
        BL      TargetResetInit         ;目标板基本初始化
                                        ;跳转到c语言入口
        B       __main

可见,复位后,首先执行的指令应该是 “初始化堆栈”,目标板基本初始化,跳转到c语言入口 三个部分的程序。

4: 我的理解复位后,ARM先从地址0开始执行,经过一段初始化程序,比如什么堆栈啊,寄存器什么的。
由于ARM的执行文件里包括RO,RW,ZI段。
RO段呢就是真正的执行命令,不能改写的。
RW段是指ARM运行过程中的一些变量什么的,运行过程中可改写的。
ZI段其实也是包括在RW段中,只是这些值开始需要被初始化为0。
但是用ADS编译链接好的文件RO,RW段地址应该是连在一起的,也是被一起烧入到ARM系统的ROM或FLASH中的.所以这时RO,RW都在ROM中。
因此,ARM得初始化过程需要将RW转移也就是搬运到ARM系统的RAM中,以便以后程序得以改写它并正确运行。
原来的RO段可以在ROM中运行,当然啦,速度可能不会快,所以呢,把RO段也搬到RAM中,但是这出现一个问题,此时RO段的地址已经不是从0开始了,那么以后的指令执行就会出问题。解决这个问题的方法就是对地址进行REMAP,重新定位RAM,ROM的地址,可以通过改写ARM中相关的存储器管理寄存器来达到这个目的。
不知道上述表达是否有误,请大侠拍砖! 5: 复位! 复位!各位:ARM复位时是PC=[0X00000000] ,即从地址为0X00000000开始运行.!
     我不管它是SRAM或FLASH!

你可以通过REMAP把CPU骗,将[0X?????????]误为[0X00000000].但是PC=[0X0000000]不会错. 通常复位时PC指向FLASH(其CS有效),要不然程序从哪儿来呀!ARM板怎么能运行呀!

又因为指令格式: 操作码+地址码, 因此地址码设置是连接器来完成的(LINKER).
我们告诉LINKER那里是SRAM(RW)地址开始.那里是ROM(RO)地址开始.

话说回来,干吗一定要REMAP呀,别管他不行吗?反正复位时PC指向FLASH(其CS有效).









6: 复位后从地址0开始工作当然没有问题了讨论一下ARM的启动过程还是有必要的,毕竟是个基础.
7: 不一定对于CPU来时是从00000000开始,但具体芯片会将一个可含有启动程序的地址映射过来进行启动。有些启动地址是芯片内部不开放的ROM,也可使flash,也可是外部扩展空间(当然要接ROM型的)。有些芯片可从IIC或SPI接口启动,实际上实现运行了内部不开放的ROM程序启动外部接口初始化和数据加载,就好像PC机从U盘或网卡启动 8: 看一般根据ARM的启动模式确定从cs0Flash、片内ROM、串口、u口、spi等接口处启动,
以cs0处flash为例,
启动时,cs0地址为0,程序在flash中读取并执行,但这个过程一般为boot过程,很短,不大,并且有一大部分是将cs0中程序拷贝到片内sram中,然后remap,程序再在sram中执行,然后进行sdram等内设控制器寄存器的设置,
最后boot 过程从cs0FLASH中拷贝BOOTLOADER到SDRAM中(可能涉及解压缩),最后将PC挑砖至SDRAM中BOOTLOADER起始地址,开始BOOTLOADER过程;

BOOTLOADER过程典型德代表如U-BOOT等程序,类似PC机的BIOS,具体就
不多说了,只是最后要将系统代码及文件系统拷贝到SDRAM 的预定地质,然后是执行操作系统自举;

操作系统之后当然是用户程序了,就不多说了!


其实高级的ARM内部有I-CACHE,D-CACHE,或者上电后根据根据系统慢时钟(32.768K)执行CS0处FLASH或内部ROM代码。

因此,这个问题没有唯一答案!

9: 洗耳恭听! 10: 大家先分清"启动"是操作系统的启动还是没有操作系统的启动!因为ARM也可以不用os
带操作系统的启动过程我认为和大家所说的一样,没有os的应用的启动过程可以没有这么复杂!除了初始化自己的系统硬件外,就可以执行自己的程序了(和51一样)。当然也可以把程序搬到ram中执行(更快一些)。例如s3c44b0x。
多说一些:
根据我们所用的各种开发板,程序都是从硬件线性非易失性存储器(flash、eeprom等)的0x0位置开始执行,该位置除了有bootloader以外,bootloader后面也可以存储os(linux、ucosii等),执行完bootloader以后将os复制到ram中,让os在ram中运行,没有os的程序在不在ram中运行都可以,(至于运行时的地址由编译器和链接器、你的硬件设计决定)。
还有一种启动比较象普通计算机的启动方式,那就是os并不在硬件线性非易失性存储器中,而是在外部并行存储器中(非线性的,没有地址线、数据线的那种,有点象硬盘)。这时,硬件线性非易失性存储器中存储的bootloader(有点象普通计算机的BIOS)执行时要从并行外部存储器中读出os放到ram中,然后交给os控制权,让os管理一切!这和普通计算机的启动过程基本是一样的!
当然这其中还有remap等等问题,应该都是由bootloader(BIOS)程序和你的编译链接器来解决!
个人的一点认识,欢迎大家扔砖头。 11: mabaoqiu你好,可不可以说说不带OS的简单程序设计过程?再次请教,我想请问DX,怎样设计一个LED闪烁程序(包括ARM的启动代码,生成可以下载到ARM上的文件的整个过程)。在网上抄了一个程序,不知道是不是完整的。
;**************************************************************
;这个是不是启动代码呢?            
;**************************************************************
    IMPORT        Main
    AREA        Ini,CODE,READONLY
    ENTRY
    LDR    R0, =0x3FF0000         
    LDR    R1, =0xE7FFFF80
    STR        R1, [R0]          
    LDR    SP, =0x3FE1000    
    BL        Main
    B        .
         END        
//***************************************************************
//C语言程序
//***************************************************************
#define  IOPMOD       (*(volatile unsigned *)0x03FF5000) //IO port mode register
#define  IOPDATA  (*(volatile unsigned *)0x03FF5008) //IO port data register
void Delay(unsigned int);
int Main()
{
unsigned long  LED;
IOPMOD=0xFFFFFFFF;       //将IO口置为输出模式
IOPDATA=0x01;
for(;;){
        LED=IOPDATA;
        LED=(LED<<1);
        IOPDATA=LED;
        Delay(10);
        if(!(IOPDATA&0x0F))
            IOPDATA=0x01;
}
return(0);    
}
void Delay(unsigned int x)
{
unsigned int i,j,k;
for(i=0;i<=x;i++)
            for(j=0;j<0xff;j++)
                for(k=0;k<0xff;k++);
}
这个程序包括你们说得BOOTLOADER了吗?程序复制到SRAM中了吗? 12: 个人认为:1、所谓的bootloader是个学术上的名词,从字面上理解bootloader有点像专门负责启动os的(因为“boot”、“loader”),当然也许这个名词本身就是在有os的系统上才有!实际上当你制作51系统时,你总需要初始化你的硬件(当然没有ARM那么复杂),这些初始化的代码未尝不是一种bootloader。只是ARM系统复杂一些,需要做更多的工作,需要启动os而已(好像你要是用ARM,那么不用os就有点浪费资源)。51系统一般不会跑os(极少),所以不会有人专门在51上用这个名词!
实际上现在我觉得一些名词很混乱,bootloader、bsp、bios等等他们在概念上都有重叠的地方(有时可以混用?),又有不同的地方!按我现在的理解,这些名词一般用在不同的os上!(例如:bsp在wince、vxworks上用的较多,bootloader在linux上用的较多)当然这也可能和一些商业运作、竞争有一定的关系。
2、至于你的程序,很惭愧!我实际应用也不多(看的理论比实际干活多,当然理论上我也不是很通!;-))。
因为没有具体的硬件作参考,大概看了一下,硬着头皮说一下:
上面的汇编应该是启动代码,当然你也可以把它看作bootloader,我觉得更应该叫初始化代码,(象51,因为他做的工作太少了!)你的程序不是在ram中运行的!因为没有复制到ram。拽个名词叫XIP! 13: 感谢你的耐心,那么请问这样可以复制到RAM中呢? 14: 这不是一二句可以说明的,你还是找一个bootloader,研究一下吧! 15: re首先运行0x0处的跳转指令 16: 跟普通单片机没有本质区别

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]