当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]ARM启动代码的设计

 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所示。

  


 

  图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的地址定义到零地址,所以程序的入口处如下:

  

[!--empirenews.page--]

 

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

  结 语

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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

北京2022年10月19日 /美通社/ -- 随着云计算、大数据的普及发展,过去的"云"是服务于大企业的计算模型,而十多年过去了,越来越多的应用及业务走上"云端",对计算核心数需求...

关键字: ARM 大数据 云游戏 CPU

无线连接已成为许多产品的必备功能,但往往会增加系统设计的成本和复杂性,因为它通常必须作为更大应用的附加功能。Microchip Technology Inc.(美国微芯科技公司)今日推出首款基于Arm Cortex®-M...

关键字: Microchip ARM PIC

在这篇文章中,小编将对CPU中央处理器的相关内容和情况加以介绍以帮助大家增进对CPU中央处理器的了解程度,和小编一起来阅读以下内容吧。

关键字: CPU 中央处理器 晶圆

在桌面级处理器上,AMD多年来一直在多核上有优势,不过12代酷睿开始,Intel通过P、E核异构实现了反超,13代酷睿做到了24核32线程,核心数已经超过了锐龙7000的最大16核。在服务器处理器上,AMD优势更大,64...

关键字: AMD CPU Intel EUV

SAIHUB CAB 025M成功获得安全试验所UL美国与加拿大认证证书 新加坡2022年10月17日 /美通社/ -- SAI.TECH Global Corporation("SAI.TECH"...

关键字: AI BSP PS 清洁能源

华为麒麟芯片(HUAWEI Kirin)是华为技术有限公司于2019年9月6日在德国柏林和北京同时发布的一款新一代旗舰芯片。华为麒麟在3G芯片大战中,扮演了“黑马”的角色。

关键字: 麒麟 CPU 华为Mate 50

物联网正在扩大规模并加速发展,进而驱动着全新的经济。而Arm生态系统正是这一巨大机遇背后的推动力。

关键字: ARM 物联网

ARM公司是一家知识产权(IP)供应商,它与一般的半导体公司最大的不同就是不制造芯片且不向终端用户出售芯片,而是通过转让设计方案,由合作伙伴生产出各具特色的芯片。

关键字: ARM

据业内信息,近日ADM的一份内部报告显示,ADM正在计划降低其锐龙 7000 CPU的生产计划。现阶段全球市场PC的低迷和销量下滑,再加上AM5平台整体反响不佳等等一系列原因导致ADM采取这一行动计划。

关键字: PC ADM 锐龙 7000 CPU

北京2022年10月17日 /美通社/ --  "天下武功、唯快不破",数字经济时代尤甚。 数据极富价值,堪比新时代的石油。数字经济时代,数据价值如何快速、高效地释放显得尤为重要。自20...

关键字: 软件 IO SSD CPU

嵌入式软件

15715 篇文章

关注

发布文章

编辑精选

技术子站

关闭