历史上的今天
返回首页

历史上的今天

今天是:2025年02月16日(星期日)

正在发生

2018年02月16日 | ARM RISC微处理器启动代码的设计分析

2018-02-16 来源:eefocus

    ARM体系结构

    目前,ARM系列的通用32位RISC微处理器有ARM7、ARM9、ARM9E、ARM10等多个产品,这些处理器可以工作于7种模式下。除User模式以外的其它模式都叫做特权模式,除User和System以外的其它5种模式叫做异常模式。大部分应用程序都在User模式下运行,当处理器处于User模式下时,执行的程序无法访问一些被保护的系统资源,以利于操作系统控制系统资源的使用,也不能改变模式,否则就会导致一次异常。对于System模式,任何异常都不会导致进入这一模式,而且它使用的寄存器和User模式下基本相同,主要是用于有访问系统资源请求而又避免使用额外的寄存器的操作系统任务。在特权模式下,它们可以完全访问系统资源,可以自由地改变模式。在处理特定的异常时,系统进入对应的异常模式下。这5种异常模式都有各自额外的寄存器,用于避免在发生异常的时候与用户模式下的程序发生冲突。

    在任意一种处理器模式中,都使用同一个寄存器来标识当前处理器的工作模式,这个寄存器叫做CPSR(当前程序状态寄存器),它的0~4位用来表示CPU模式,而且在每一种处理器异常模式下,都有一个对应的SPSR(缓存程序状态寄存器),用来保存进入异常模式前的CPSR的值。SPSR的作用就是当CPU从异常模式退出时,通过一条简单的汇编指令就能够恢复进入异常模式前的CPSR,该值保存在当前异常模式的SPSR中。

    启动代码的设计

    启动代码类似于电脑中的BIOS,它从系统上电开始接管CPU,依次需要负责初始化 CPU在各种模式下的堆栈空间、设定CPU的内存映射、对系统的各种控制寄存器做初始化、对CPU的外部存储器进行初始化、设定各外围设备的基地址、创建正确的中断向量表、为C代码执行创建ZI(零创建)区,然后进入到C代码。 在C代码中继续对时钟、RS232端口进行初始化,然后打开系统中断允许位。最后进入到应用代码中执行,执行期间响应各种不同的中断信号并调用预先设置好的中断服务程序处理这些中断。整个过程的流程图如图1所示。

23

图1 启动代码流程图

      堆栈初始化

      堆栈的初始化要处理的事情是为处理器的7个处理器模式分配堆栈空间。以下以FIQ模式下的堆栈设置为例说明:

    ORR r1, r0, #LOCKOUT | FIQ_MODE;把模式放在r1中,LOCKOUT用来屏蔽中断位;

    MSR cpsr, r1 ;改变CPU的CPSR寄存器,进入到指定的FIQ模式;

    MSR spsr, r2 ;保存前一模式;

    LDR sp, =FIQ_STACK ;把FIQ模式下的堆栈起始值赋给当前的SP,FIQ_STACK是分配给FIQ模式堆栈空间(比如说1K字节)的起始地址。按这种方式设置其它模式下的堆栈。

    DRAM的初始化根据系统配置信息来决定,因为系统不一定会用到DRAM,但是一定要做SDRAM的初始化。主要的处理内容是ROM和RAM基址的设定、数据总线的宽度、SDRAM的刷新时间等等,这些可以参照S3C4510B芯片的用户手册。特殊寄存器的设置主要是针对I/O口,比方说设定几个I/O位用做系统状态指示灯LED。寄存器的设定主要根据硬件的配置情况而定,值得注意的是由于这段启动代码是烧录到ROM中的,而中断向量必须位于零地址,所以在存储单元没有重新映射之前ROM基址的设定应该为零地址。

    拷贝(image)主要是为了提高运行速度,编译生成的映像文件代码从ROM内拷贝到RAM中去,而程序的执行也就在RAM中。当然,启动代码对运行速度的要求不是很严格,所以这个拷贝动作可以不用做,让代码存放在ROM中,代码的执行也在ROM中,而运行中所需要的数据在RAM中。

    内存的初始化是为C代码的运行开辟内存区,代码编译后会分为三个区:只读区、可读可写区,

    零初始化区。内存的初始化处理的内容是:当只读区截止地址等于可读可写区基址时,把零初始化区各字节清零;当只读区截止地址不等于可读可写区基址时,如果可读可写区基址小于零初始化基址,就从只读区截止地址处开始把数据拷贝到可读可写区基址处,直到到达零初始化基址,然后把零初始化区各字节清零,否则也只用把零初始化区各字节清零。

    中断向量表是用于处理异常情况的,当发生异常时,首先要保存当前程序的返回地址和CPSR寄存器的值,然后进入到相应的异常向量地址,一般来说在异常向量地址是一个跳转指令,使程序进入相应的异常处理过程。由于中断向量表要位于系统的零地址,当把启动代码烧录到EEPROM中运行时就需要把ROM的地址定义到零地址,所以程序的入口处如下:67

    系统重新映射当你为了提高运行速度而把ROM的Image拷贝到RAM后,中断向量表就不是在零地址处,因此要重新映射存储单元,把RAM的地址重新设定为零地址。映射就是把启动代码从ROM(EEPROM或者Flash)拷贝到SDRAM运行,同时再拷贝完毕以后进行内存的重新映射,把SDRAM映射到原来的ROM地址(0x0000)中,这样就可以用SDRAM中的代码写Flash,使得程序代码得以更新。但是需要注意的是,如果程序进行了映射,这样就对在线调试带来了困难,使得在线调试不可以在RAM中进行(如果写入EEPROM的代码是映射了的,则在调试器启动的时候必然也会对程序进行映射,使得程序在调试器中不可以定位到原来的地方,使得调试失败)。一个折中的方法是,不进行映射,就是说在调试的代码中不可以使用下载,这样就可以像普通的代码一样进行调试了。

  结 语

  做完这些初始化后,让CPU切换到用户模式下,并把堆栈指针SP指定到用户堆栈区,就可以进入到C代码区运行。在C代码中继续对时钟、RS232端口进行初始化,然后打开系统中断允许位,进入到应用代码中执行。此程序加载到处理器S3C4510B中经过调试,CPU可以正常启动,能够对中断请求做出及时的响应,上层应用的主代码可以加载到Flash中,移植实时操作系统RTXC后对多任务的调度控制正常。


推荐阅读

史海拾趣

Green Power Solutions公司的发展小趣事
可能是由于控制电路故障、磁放大器调整不当或电源电压波动过大等原因。
Concord Semiconductor Corp公司的发展小趣事

Concord Semiconductor Corp深知人才是企业发展的根本。因此,公司高度重视人才培养和引进工作。公司建立了一套完善的人才培养机制,通过内部培训、外部引进等方式,不断提升员工的技能水平和综合素质。同时,公司还积极营造良好的工作氛围和企业文化,吸引更多优秀人才加入。这些人才的加入为公司的持续发展提供了有力保障。

Excel-Display Corporation公司的发展小趣事

EDC一直将产品质量视为企业的生命线。为了确保产品质量,公司建立了严格的质量管理体系,从原材料采购到生产过程中的每一个环节都进行严格的质量控制。

此外,EDC还注重售后服务,为客户提供全方位的技术支持和解决方案。这些举措让EDC赢得了客户的信赖和好评,也为公司赢得了更多的市场份额。

Daewoo公司的发展小趣事

Daewoo公司最初由金宇中于1967年创建,起始于一个规模不大的纺织厂。然而,金宇中并不满足于纺织业的局限,他敏锐地察觉到了韩国经济快速发展的机遇。于是,Daewoo公司逐渐扩展业务领域,70年代侧重发展化学工业,80年代后更是进军汽车、电子和重工业领域,并积极参与国外资源的开发。这种前瞻性的战略布局,为Daewoo公司的快速发展奠定了基础。

恒连电子(EVERCOM)公司的发展小趣事

恒连电子成立于XX年代初,当时正值电子行业的快速发展期。创始人张先生凭借对电子技术的敏锐洞察力和对市场趋势的精准把握,决定投身于电子行业。然而,初创时期的公司面临着资金短缺、技术团队匮乏以及市场竞争激烈等多重挑战。张先生带领团队日夜兼程,通过自主研发和不断创新,逐渐在市场中站稳脚跟。他们首先推出了几款性能稳定、价格合理的电子产品,赢得了客户的信赖。随着产品的逐步推广,恒连电子逐渐在市场中打开了局面。

ERA Transformers公司的发展小趣事

在国内市场取得一定成功后,ERA Transformers公司开始将目光投向国际市场。为了打开国际市场,公司积极参加国际电子展会和交流活动,与多家国际知名企业建立了联系。通过深入了解国际市场需求和标准,公司对产品进行了针对性的改进和优化。经过一段时间的努力,ERA Transformers公司的产品成功打入了国际市场,并获得了良好的销售业绩和口碑。

问答坊 | AI 解惑

ABS+EBD

ABS是Anti-LockBrakeSystem的英文缩写,即“刹车防抱死系统”。在没有ABS时,如果紧急刹车会使轮胎抱死,刹车的距离变长,容易跑偏或甩尾。ABS是通过控制刹车油压的收放,来达到对车轮抱死的控制,使车辆始终处于临界抱死的间隙滚动状态。    ...…

查看全部问答>

请问以下C代码是什么意思?

请问如下代码的含义:据说hook function 是钩子函数,但我并没有在网上搜索到类似的函说说明。不管能否解答都欢迎大家来讨论 typedef void (* PFN_HOOK )(void);                  & ...…

查看全部问答>

PowerPCB (PADS9.0)使用技巧

PADS 9.0版产品的出现标志着下一代PADS流程技术的诞生。与以往的旧产品相比, PADS 9.0修复和改善了之前版本软件的不足和缺点,集成了许多全新的功能,拥有了更高的可扩展性和集成度,从而使设计者能够结合Mentor Graphics众多独特的创新技术,实现 ...…

查看全部问答>

DIY FPGA初级学习板,核心板已画好,欢迎大家继续提意见!

【背景贴】: “taikai001”俺想学习FPGA--有偿寻求合作开发FPGA学习板https://bbs.eeworld.com.cn/thread-93001-1-1.html 经过和taikai001的几次讨论,准备还是搞个简单点,适合入门的。 目前基本的功能我已经画好了,随后会把原理图发上来 ...…

查看全部问答>

请教下附图中的这个芯片的具体资料

哪位大虾知道这个芯片是做什么的,还有其具体的资料可以给我分享下,不尽感谢!…

查看全部问答>

请问Windows CE中有没有对DIB操作的函数?

以前开发过桌面系统的程序,桌面系统有一个dibapi.cpp和dibapi.h文件,里面提供了对DIB位图的操作函数,请问在WinCE平台下有没有,还是应该自己重写函数?…

查看全部问答>

转让arm9开发板 个人闲置

570买的,,现在 399元 包邮转让了   型号 HF2410A   配件资料全在,另送usb to RS232 数据线 要的 发站内信或加QQ 1047338257 …

查看全部问答>

请大侠指定:使用vscanf函数是,编译总是报没有找到定义。

请大侠指定:使用vscanf函数是,编译总是报没有找到定义。 操作系统:vxworks6.4 for PPC 提示信息: ld: warning: Undefined symbol \'vscanf\' in file \'partialImage.o\' dld: error: Undefined symbols found - no output written D:\\sy ...…

查看全部问答>

申请LM3S8962开发板

上传自己以前做的几个界面 [ 本帖最后由 zhengjiewen 于 2010-10-14 23:49 编辑 ]…

查看全部问答>

上电后P1IN为什么不是0x00?求高手解答

各位高手,我用的是M430G2553上电后P1IN为什么不是0x00?不是0x46就是0x06,是怎么回事?…

查看全部问答>