S3C2440 Boot Loader引导代码功能简述

最新更新时间:2021-10-14来源: eefocus关键字:S3C2440  Boot  Loader 手机看文章 扫描二维码
随时随地手机看文章

【前言】开始学习ARM的时候,基本上都要从裸机编程开始。为了减低入门的门槛,很多时候只要修改模板里的主函数main.c,可是,久而久之,就会产生些疑问,问什么下载了这些C代码编译链接生成出来的BIN就能在ARM上跑了呢?原因就在于,有几个文件已经不声不响的帮我们提前干了很多的事,而这些事C语言是干不了的,只能由汇编完成,美其名曰:ARM汇编引导代码。其实不光“裸奔”需要,Boot Loader也同样需要。那么到底这些汇编帮我干了些什么呢?笔者就结合S3C2440的Boot Loader引导代码简单分析整理下。


【一】变量及相关宏定义

开始首先用GET(相当于C语言里的#include)伪指令包含进来了三个头文件option.inc、memcfg.inc、2440addr.inc,其中option.inc里定义芯片相关的配置,memcfg.inc里定义存储器配置,2440addr.inc里定义了寄存器符号。


USERMODE    EQU 0x10


FIQMODE      EQU0x11


IRQMODE      EQU0x12


SVCMODE      EQU0x13


ABORTMODE   EQU 0x17


UNDEFMODE   EQU 0x1b


MODEMASK    EQU 0x1f 


NOINT         EQU0xc0


上面的几行进行了一些处理器模式的定义,下面定义了一些各模式下的常量,等到了【四】这一块再详细说。


UserStack   EQU(_STACK_BASEADDRESS-0x3800);0x33ff4800 ~  


SVCStack    EQU(_STACK_BASEADDRESS-0x2800);0x33ff5800 ~


UndefStack  EQU (_STACK_BASEADDRESS-0x2400);0x33ff5c00 ~


AbortStack  EQU (_STACK_BASEADDRESS-0x2000);0x33ff6000 ~


IRQStack    EQU(_STACK_BASEADDRESS-0x1000);0x33ff7000 ~


FIQStack    EQU(_STACK_BASEADDRESS-0x0);0x33ff8000 ~


注:_STACK_BASEADDRESS在option.inc中有相关定义


接下来的定义要到最后才能用到,THUMBCODE作为全局变量,其实就是一个指示的作用,在跳转到main前进行模式的切换。


下面的宏定义可能就不太好理解了,这个是一个中断跳转的工具,到【二】这再解释。


MACRO


$HandlerLabel HANDLER $HandleLabel


$HandlerLabel        ;标号


sub sp,sp,#4          ;(1)减少sp(用于存放转跳地址)


stmfd sp!,{r0}         ;(2)把工作寄存器压入栈


ldr     r0,=$HandleLabel   ;将HandleXXX的址址放入r0


ldr     r0,[r0]              ;把HandleXXX所指向的内容(也就是中断程序的入口)放入r0


str     r0,[sp,#4]            ;(3)把中断服务程序(ISR)压入栈


ldmfd   sp!,{r0,pc} ;(4)用出栈方式恢复r0原值和为pc设定新值(即完成了到ISR的转跳)


MEND


还有一些,留到后面用到的时候再说。


【二】中断向量表以及其相关跳转设置

在上述定义完成之后就算真正意义来到了函数的入口处,这里处理的比较复杂,会有大小


端的处理,因为对我们理解引导代码没多少作用,暂且将其简化处理掉。省略这些之后,其实入口就是这几行代码:


b ResetHandler   ;上电复位中断;0x00


b HandlerUndef   ;handlerfor Undefined mode  ;0x04


b HandlerSWI     ;handler for SWI interrupt  ;0x08


b HandlerPabort ;handler for PAbort    ;0x0c


b HandlerDabort ;handler for DAbort    ;0x10


b .                ;其实是个死循环   ;0x14


b HandlerIRQ     ;handler for IRQ interrupt  ;0x18


b HandlerFIQ      ;handler for FIQ interrupt  ;0x1c


这就是我们有名的中断向量表!中断向量表必须位于启动代码的开始部分连续8*4字节的连续空间,它是用户程序与启动代码之间以及启动代码的各部分之间联系的纽带。它由一个一个的跳转函数组成,它就象一个普通的散转函数,只不过散转的过程中有硬件机制参与,当系统发生异常时,ARM 处理器会通过硬件机制强制将PC 指针指向中断向量表中对应的异常跳转函数存储的地址,然后程序会跳转到相应的中断服务程序去执行。因为我们开机的第一个中断是上电复位,所以进来之后首先是跳转到ResetHandler中断函数里去进行一些必要的系统设置,故在0x00处就是bResetHandler。


对于ARM的中断,其实有两种模式(可通过相关寄存器设置):向量中断模式和普通中断模式。简单的区分这两个就是:对于向量中断模式,当中断发生时,CPU会跳转到向量表中相应中断类型的表项,直接把中断服务例程的起始地址送到PC,这个有个优点就是速度快;对于普通中断模式,在跳转到中断向量表之后还要进行一次跳转查询,最红由返回ISR的最红中断处理函数的地址给PC,现在就可以说说【一】中宏定义$HandlerLabel HANDLER $HandleLabel的作用了。这个宏是用于第一次查表过程的实现中断向量的重定向,在_ISR_STARTADDRESS里定义的第一级中断向量表是采用型如Handle###的方式的,而在程序的开始处采用的是b Handler###的方式,在这里Handler###就是通过HANDLER这个宏和Handle###建立联系的.所以在后面其实还有一段初始化程序作为宏展开。


HandlerFIQ      HANDLER HandleFIQ


HandlerIRQ      HANDLER HandleIRQ


HandlerUndef    HANDLER HandleUndef


HandlerSWI      HANDLER HandleSWI


HandlerDabort   HANDLER HandleDabort


HandlerPabort   HANDLER HandlePabort


这种方式的优点就是正真定义的向量数据在内存空间里,而不是在ENTRY处的ROM空间里,这样就可以在程序里灵活的改动向量的数据了.这段程序用于把中断服务程序的首地址装载到pc中,也可以称之为“加载程序”。


接着跳转那一块继续说,因为外部中断几乎都是通过IRQ引入的(其实FIQ理论上也可以,但是在linux几乎用不到),于是便跳到了HandleIRQ,但是此时HandleIRQ又是多少呢,在程序的下面还有一段也必须拿上来说:


ldr r0,=HandleIRQ        ;This routine is needed


ldr r1,=IsrIRQ             ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c


str r1,[r0]


可见,HandleIRQ和IsrIRQ其实等价了!于是可以把IsrIRQ处的处理函数拿来分析一下:


IsrIRQ


sub sp,sp,#4            ;给PC寄存器保留 reserved for PC


stmfd sp!,{r8-r9}              ;把r8-r9压入栈


;把INTOFFSET的地址装入r9, INTOFFSET是一个内部的寄存器,存着中断的偏移


ldr r9,=INTOFFSET


ldr r9,[r9]                  ;I_ISR


ldr r8,=HandleEINT0    ;这就是我们第二个中断向量表的入口的,先装入r8


add r8,r8,r9,lsl #2  ;地址对齐,每个中断向量占4个字节,即isr = IvectTable + Offeset * 4


ldr r8,[r8]    ;装入中断服务程序的入口


str r8,[sp,#8]   ;把入口也入栈,准备用旧招


ldmfd sp!,{r8-r9,pc} ;弹出栈,顺便把r8弹出到PC了,跳转成功!


 


【三】初始化硬件

终于可以开始对硬件真正的干涉了,ARM要能形成一个可以供C语言工作的环境,还要


要干下面的几件事:


1、 关看门狗,看门狗是用来解决软件崩溃的,这里不需要


ldr r0,=WTCON     


ldr r1,=0x0        


str r1,[r0]


2、关中断,引导代码里不需要处理中断事件,除了上电复位中断其它都交给C的主函数完成


ldr r0,=INTMSK


ldr r1,=0xffffffff 


str r1,[r0]


3、关子中断,同上


ldr r0,=INTSUBMSK


ldr r1,=0x7fff  


str r1,[r0]


4、减少PLL的lock time,调整LOCKTIME寄存器


ldr r0,=LOCKTIME


ldr r1,=0xffffff


str r1,[r0]


5、设定PLL,这个直接关系到板子的快慢,不过也不是越快越好,除了要考虑功耗外还要满足下面的公式:


Fpllo=(m*Fin)/(p*2^s)


m=MDIV+8,p=PDIV+2,s=SDIV(1<=P<=62, 1<=M<=248)


Fpllo必须大于200Mhz小于600Mhz


Fpllo*2^s必须小于1.2GHz


PLLCON设定中的M_DIV P_DIV S_DIV是取自option.inc中的


6、设置系统存储寄存器,其中SMRDATA在程序段的后面有详细描述,这里知道作用就好


adrl r0, SMRDATA 


ldr r1,=BWSCON  ;BWSCON Address


add r2, r0, #52  ;SMRDATA数据的结束地址,共有52字节的数据


0


ldr r3, [r0], #4


str r3, [r1], #4


cmp r2, r0


bne %B0  ;%表示搜索,B表示反向-back(F表示向前-forward),0为局部标号(0~99)


 


【四】 初始化堆栈

ARM 有7 种模式,用户模式,快速中断模式,中断模式,管理模式,中止模式,未定义模式和系统模式。系统堆栈的初始化主要是给各个处理器模式分配堆栈空间。堆栈是为中断或程序跳转服务的,当发生中断或程序跳转时,需要将当前处理器的状态及一些参数保持在堆栈中,当中断处理完毕以后或程序执行完后返回时,再将堆栈保存的现场数据进行恢复,以保证原来的程序正确运行。在【一】中已经提到了一些与堆栈有关的变量定义。可以这样简单说,堆栈的初始化分为两个步骤:1、指定堆栈的位置和大小,这些在【一】中已经完成了;2、将各个模式下的堆栈指针指向相应的栈,下面做的就是这个工作。


InitStacks


mrs r0,cpsr


bic r0,r0,#MODEMASK


orr r1,r0,#UNDEFMODE|NOINT


msr cpsr_cxsf,r1  ;UndefMode


ldr sp,=UndefStack  ; UndefStack=0x33FF_5C00


orr r1,r0,#ABORTMODE|NOINT


msr cpsr_cxsf,r1  ;AbortMode


ldr sp,=AbortStack ; AbortStack=0x33FF_6000


orr r1,r0,#IRQMODE|NOINT


msr cpsr_cxsf,r1  ;IRQMode


ldr sp,=IRQStack  ; IRQStack=0x33FF_7000


orr r1,r0,#FIQMODE|NOINT


msr cpsr_cxsf,r1 ;FIQMode


ldr sp,=FIQStack ; FIQStack=0x33FF_8000


bic r0,r0,#MODEMASK|NOINT


orr r1,r0,#SVCMODE


msr cpsr_cxsf,r1 ;SVCMode


ldr sp,=SVCStack  ; SVCStack=0x33FF_5800


注:仔细看看发现没有初始化user模式下的堆栈,为什么呢?很明显嘛,你一开始就运行在了user模式下了!


 


 


【五】C主函数接管前的数据搬移及入口设定

其实一直还有个东西没说,这个在进入代码段前就定义了,我提到了,后面用到会详细说,


现在是时候了。在【一】时用IMPORT伪指令引入了|Image

RO

RO

Base|  |Image

RO

RO

Limit|...这些变量是通过ADS、RVDS,MDK等工具的工程设置里面设定的RO Base和RW Base设定的,这个应该有印象,可能很多人感觉这个没用,其实很有用呢!那为什么要引入这玩意呢,最简单的用处是可以根据它们拷贝自己,这些变量是编译器生成的。


RO,RW, ZI这三个段都保存在Flash中,但RW,ZI在Flash中的地址肯定不是程序运行时变量所存储的位置,因此我们的程序在初始化时应该把Flash中的RW,ZI拷贝到RAM的对应位置。一般情况下,我们可以利用编译器替我们实现这个操作。比如我们跳转到main()时,使用 b  __Main,编译器就会在__Main和Main之间插入一段汇编代码,来替我们完成RW,ZI段的初始化。 如果我们使用b  Main, 那么初始化工作要我们自己做。编译器会生成如下变量告诉我们RO,RW,ZI三个段应该位于什么位置,但是它并没有告诉我们RW,ZI在Flash中存储在什么位置,实际上RW,ZI在Flash中的位置就紧接着RO存储。


IMPORT  |Image

RO

RO

Base| ; Base of ROM code


IMPORT  |Image

RO

RO

Limit|  ; End of ROM code (=start of ROM data)


IMPORT  |Image

RW

RW

Base|   ; Baseof RAM to initialise


IMPORT  |Image

ZI

ZI

Base|   ; Base and limit of area


IMPORT  |Image

ZI

ZI

Limit| ; to zero initialize


在程序的最后,通过下面的代码就可以进入main()了。


[ :LNOT:THUMBCODE;ifthumbcode={false} bl main   L代表logic变量


     bl Main       ;Don't use main() because ......


     b .           ;注意小圆点         


 ]


 [ THUMBCODE        ;for start-up code for Thumb mode


     orr lr,pc,#1


     bx lr


     CODE16


     bl Main        ;Don't use main() because ......


     b .          ;注意小圆点


     CODE32


 ]


现在,就可以顺便回顾下【一】中提到的THUMBCODE了,这不就是一个指示的作用吗?!

【后记】总的来说,ARM光初始化都要这样折腾,如果这个都折腾会了,后面的就慢慢来吧!

关键字:S3C2440  Boot  Loader 编辑:什么鱼 引用地址:S3C2440 Boot Loader引导代码功能简述

上一篇:s3c2440的Memory Controller与外设地址线错位连接分析
下一篇:s3c2440学习之路-001 汇编点亮led

推荐阅读

基于S3C2440在Linux上实现视频监控系统的FFmpeg编解码设计
引言随着视频编解码技术、计算机网络技术、数字信号处理技术和嵌入式系统的发展,以嵌入式网络视频服务器为核心的远程视频监控系统开始在市场上崭露头角。该系统把摄像机输出的模拟视频信号通过内置的嵌入式视频编码器直接转换成视频流,通过计算机网络传输出去。嵌入式网络视频服务器具备视频编码处理、网络通信、系统控制等强大功能,直接支持网络视频传输和网络管理,使得监控范围达到前所未有的广度。在远程视频监控系统中,摄像头获取的原始视频流在传输之前需要压缩,而FFmpeg可以将原始视频压缩为H264格式视频流,H264是一种被广泛使用的高精度视频的录制、压缩和发布格式,因此采用FFmpeg来实现。1、系统方案系统是在S3C2440平台上运行嵌入式Linu
发表于 2023-01-13
基于<font color='red'>S3C2440</font>在Linux上实现视频监控系统的FFmpeg编解码设计
S3C2440+嵌入式Linux的移动视频监控终端设计
随着人们对生活和工作环境的安全性的要求不断提高,安全防范的重要性越来越突出。视频监控技术在各个领域发挥着越来越重要的作用,比如对森林、旅游景点、城市小区等通过视频监控来实时监控现场发生的情况。将嵌入式技术和无线网络技术应用于视频监控终端,与传统的有线视频监控相比,无线视频监控摆脱了网络电缆的束缚,提高了视频监控的灵活性和可扩展性。监控人员可以携带手持监控设备而不必在固定位置值守来监控现场。在无线网络环境下传输视频,庞大的视频信息量对有限的传输带宽是难以承受的,成为阻碍其应用的瓶颈之一,因此,需要高效率的视频压缩标准来满足无线传输带宽的需求。新一代视频压缩标准H.264是面向Internet和无线网络的视频图像编解码技术,它不仅提高了
发表于 2023-01-13
S3C2440+嵌入式Linux的移动视频监控终端设计
基于S3C2440芯片和单片机设计压装数据采集系统的设计
引言随着经济和社会的发展,我国的工业水平和信息技术水平也得到了飞速发展。其中工业中最为常见的零部件组装和装备压装监测设备也得到了不断的改进。压装的过程其实就是按规定的技术要求将零部件进行组培和连接,使之成为半成品或者成品的工艺过程。如图1所示,就是将两个零部件进行过盈无键组装配合,使之牢固结合在一起。工业中很多机械设备都是通过这种压装方式组合到一起的,包括火车轮对、轴承、汽车发动机、变速器、底盘等关键部件。压装的质量决定了以后产品的使用质量和人民的生命财产都息息相关。我们知道压装质量的评判标准,主要是根据压装过程中压力和位移的变化曲线来确定的。而压力位移曲线的获取这就需要由良好的运行稳定的数据采集系统来提供。基于此,本文提出一种基于
发表于 2023-01-13
基于<font color='red'>S3C2440</font>芯片和单片机设计压装数据采集系统的设计
S3C2440为核心的嵌入式温室环境监测系统设计
温室生产作为高效、高科技含量的大规模生产方式已经成为世界农业的发展趋势。温室设施的自动监测和控制技术可以为农作物创造良好的生长环境,节约人力成本,提高农作物的产量,因此需要开发与温室相关的自动化技术,以降低运行成本、提高效率、实现环境的精确控制。我国目前的温室没施综合监测水平不高,控制能力比较差,带有综合环境自动调节的高科技温室主要从国外引进。笔者开发了以S3C2 440为核心的嵌入式环境监测系统可以完成温室环境参数的监测和收集,同时通过输出机构实时控制温室环境以达到温室监测和控制智能化的目的,具有精度高,智能控制等优点。软件工程领域最重要的、具有划时代意义成果之一的就是统一建模语言UML(Unified Modeling Lang
发表于 2023-01-13
以<font color='red'>S3C2440</font>为核心的嵌入式温室环境监测系统设计
了解S3C2440触摸屏驱动的原理及其应用
一、开发环境主 机:VMWare--Fedora 9开发板:Mini2440--64MB Nand, Kernel:2.6.30.4编译器:arm-linux-gcc-4.3.2二、前提知识1、Linux输入子系统(Input Subsystem):在Linux中,输入子系统是由输入子系统设备驱动层、输入子系统核心层(Input Core)和输入子系统事件处理层(Event Handler)组成。其中设备驱动层提供对硬件各寄存器的读写访问和将底层硬件对用户输入访问的响应转换为标准的输入事件,再通过核心层提交给事件处理层;而核心层对下提供了设备驱动层的编程接口,对上又提供了事件处理层的编程接口;而事件处理层就为我们用户空间的应用程序提
发表于 2023-01-12
了解<font color='red'>S3C2440</font>触摸屏驱动的原理及其应用
基于CC2420射频芯片和S3C2440芯片实现网络协调器的设计
1 概 述无线通信的方式有多样,与蓝牙、Wi-Fi、GSM移动通信方式相比,ZigBee联盟制定的 ZigBee方式具有功耗低、数据传输可靠、兼容性好、实现成本低以及组网方便的优点,非常适合低速率传输的无线传感器网络。ZigBee联盟成立于 2001年,2002年Invensys公司、三菱电气公司、摩托罗拉公司以及飞利浦半导体公司加盟,现在正迅速发展壮大。该联盟在基于IEEE 802.15.4的PHY层、MAC层及数据链路层之上,研究开发适合无线传感器网络的其他高层协议。物理层的2个标准是2.4 GHz和868/915 MHz,都基于直接序列扩频DSSS(Direct Sequence SpreadSpec-trum)技术,使用相同
发表于 2023-01-12
基于CC2420射频芯片和<font color='red'>S3C2440</font>芯片实现网络协调器的设计

推荐帖子

太阳能大功率LED路灯的设计
  1太阳能电池板与蓄电池的选取   1.1太阳能电池板选取   目前单晶硅太阳能电池的光电转换效率约为15%,最高达到24%,是目前所有种类的太阳能电池中光电转换效率最高的,技术也最为成熟。使用寿命一般可达15a,最高可达25a。多晶硅太阳能电池比单晶硅太阳能电池的光电转换效率要降低不少,其光电转换效率约12%,同时多晶硅太阳能电池的使用寿命也要比单晶硅太阳能电池短。非晶硅薄膜太阳能电池光电转换效率偏低,目前国际先进水平约为10%,且不够稳定,随着时间的延长,其转换效率衰减,直接
探路者 LED专区
makefile应选择手写还是工具生成?
如果已经可以针对某个项目编写makefile,完成编译链接功能 还可以用脚本提供编译选项界面 当然还没能实现跨平台 还有没有必要去学习使用类似GNUAutotools和cmake类似的工具自动生成makefile呢? makefile应选择手写还是工具生成?
yipfung 嵌入式系统
客户价值评估体系的建立和管理
客户价值评估体系的建立和管理客户价值评估体系的建立和管理
lorant RF/无线
梦之旅同学EZ430系列学习笔记和智能家居系统项目之内部温度采集和串口显示
收到板子有几天了,一直没时间弄,昨天弄了一下,就有以下方面的结果,以前没有接触过msp430,呵呵,本来说是昨天出测评的,但因为有其他事情,只好今天早上一大早跑过来写测评,上午都有课,希望中午回来时候能够看到惊喜。 首先,来个项目介绍: 项目:智能家居系统无线温湿度传感器DHT11传感节点 介绍:利用本EZ430系统完成一个温湿度传感节点功能,在从节点采集DHT11的数据,通过无线把他发到AP节点,然后通过上位机在电脑上面显示。 上位机界面:准备在FXW451的燃气系统的上位机
梦之旅 微控制器 MCU
开贴搞个四轴之打样归来
这两天板子回来了,一调才发现wifi部分少了一根线,唉悲剧啊。 这两天看MPU6050看的四元数,欧拉角,一头雾水。不过好歹有角度信息了。今天就发几张板子的图和点资料。周末接着搞啊。 附上一份网上找的四轴代码 开贴搞个四轴之打样归来
908508455a 单片机
Qorvo 将在 CES2023 上展示消费电子产品的连接、保护和供电解决方案
移动应用、基础设施与航空航天、国防应用中RF解决方案的领先供应商Qorvo®,Inc.(纳斯达克代码:QRVO)将在CES®2023(#CES2023)上展示其最新的物联网(IoT)、智能家居、5G、Wi-Fi、超宽带(UWB)、传感器和电源产品。Qorvo技术能够为消费电子、通信、宽带和汽车/EV等众多应用提供更高的数据容量、可靠且持续的在线性能,以及低延迟。相关产品将于1月5日至8日的CES期间,在拉斯维加斯威尼斯会展中心的51216
石榴姐 RF/无线
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2023 EEWORLD.com.cn, Inc. All rights reserved