关于ARM启动的一篇文章
写的不错, 应该对大家有所帮助:
基于ARM的芯片多数为复杂的片上系统,这种复杂系统里的多数硬件模块都是可配置的,需要由软件来设置其需要的工作状态。因此在用户的应用程序之前,需要由专门的一段代码来完成对系统的初始化。由于这类代码直接面对处理器内核和硬件控制器进行编程,一般都是用汇编语言。一般通用的内容包括:
中断向量表
初始化存储器系统
初始化堆栈
初始化有特殊要求的断口,设备
初始化用户程序执行环境
改变处理器模式
呼叫主应用程序
中断向量表
ARM要求中断向量表必须放置在从0地址开始,连续8X4字节的空间内。
每当一个中断发生以后,ARM处理器便强制把PC指针置为向量表中对应中断类型的地址值。因为每个中断只占据向量表中1个字的存储空间,只能放置一条ARM指令,使程序跳转到存储器的其他地方,再执行中断处理。
中断向量表的程序实现通常如下表示:
AREA Boot ,CODE, READONLY
ENTRY
B ResetHandler
B UndefHandler
B SWIHandler
B PreAbortHandler
B DataAbortHandler
B
B IRQHandler
B FIQHandler
其中关键字ENTRY是指定编译器保留这段代码,因为编译器可能会认为这是一段亢余代码而加以优化。链接的时候要确保这段代码被链接在0地址处,并且作为整个程序的入口。
初始化存储器系统
存储器类型和时序配置
通常Flash和SRAM同属于静态存储器类型,可以合用同一个存储器端口;而DRAM因为有动态刷新和地址线复用等特性,通常配有专用的存储器端口。
存储器端口的接口时序优化是非常重要的,这会影响到整个系统的性能。因为一般系统运行的速度瓶颈都存在于存储器访问,所以存储器访问时序应尽可能的快;而同时又要考虑到由此带来的稳定性问题。
存储器地址分布
一种典型的情况是启动ROM的地址重映射。
初始化堆栈
因为ARM有7种执行状态,每一种状态的堆栈指针寄存器(SP)都是独立的。因此,对程序中需要用到的每一种模式都要给SP定义一个堆栈地址。方法是改变状态寄存器内的状态位,使处理器切换到不同的状态,让后给SP赋值。注意:不要切换到User模式进行User模式的堆栈设置,因为进入User模式后就不能再操作CPSR回到别的模式了,可能会对接下去的程序执行造成影响。
这是一段堆栈初始化的代码示例,其中只定义了三种模式的SP指针:
MRS R0,CPSR
BIC R0,R0,#MODEMASK 安全起见,屏蔽模式位以外的其他位
ORR R1,R0,#IRQMODE
MSR CPSR_cxfs,R1
LDR SP,=UndefStack
ORR R1,R0,#FIQMODE
MSR CPSR_cxsf,R1
LDR SP,=FIQStack
ORR R1,R0,#SVCMODE
MSR CPSR_cxsf,R1
LDR SP,=SVCStack
初始化有特殊要求的端口,设备
初始化应用程序执行环境
映像一开始总是存储在ROM/Flash里面的,其RO部分即可以在ROM/Flash里面执行,也可以转移到速度更快的RAM中执行;而RW和ZI这两部分是必须转移到可写的RAM里去。所谓应用程序执行环境的初始化,就是完成必要的从ROM到RAM的数据传输和内容清零。
下面是在ADS下,一种常用存储器模型的直接实现:
LDR r0,= Image$$RO$$Limit 得到RW数据源的起始地址
LDR r1,= Image$$RW$$Base RW区在RAM里的执行区起始地址
LDR r2,= Image$$ZI$$Base ZI区在RAM里面的起始地址
CMP r0,r1 比较它们是否相等
BEQ %F1
0 CMP r1,r3
LDRCC r2,[r0],#4
STRCC r2,[r1],#4
BCC %B0
1 LDR r1,= Image$$ZI$$Limit
MOV r2,#0
2 CMP r3,r1
STRCC r2,[r3],#4
BCC %B2
程序实现了RW数据的拷贝和ZI区域的清零功能。其中引用到的4个符号是由链接器第一输出的。
Image$$RO$$Limit :表示RO区末地址后面的地址,即RW数据源的起始地址
Image$$RW$$Base :RW区在RAM里的执行区起始地址,也就是编译器选项RW_Base指定的地址
Image$$ZI$$Base :ZI区在RAM里面的起始地址
Image$$ZI$$Limit :ZI区在RAM里面的结束地址后面的一个地址
程序先把ROM里 Image$$RO$$Limt 开始的RW初始数据拷贝到RAM里面 Image$$RW$$Base 开始的地址,当RAM这边的目标地址到达 Image$$ZI$$Base 后就表示RW区的结束和ZI区的开始,接下去就对这片ZI区进行清零操作,直到遇到结束地址 Image$$ZI$$Limit
改变处理器模式
因为在初始化过程中,许多操作需要在特权模式下才能进行(比如对CPSR的修改),所以要特别注意不能过早的进入用户模式。
内核级的中断使能也可以考虑在这一步进行。如果系统中另外存在一个专门的中断控制器,这么做总是安全的。
呼叫主应用程序
当所有的系统初始化工作完成之后,就需要把程序流程转入主应用程序。最简单的一种情况是:
IMPORT main
B main
直接从启动代码跳转到应用程序的主函数入口,当然主函数名字可以由用户随便定义。
在ARM ADS环境中,还另外提供了一套系统级的呼叫机制。
IMPORT __main
B __main
__main()是编译系统提供的一个函数,负责完成库函数的初始化和初始化应用程序执行环境,最后自动跳转到main()函数。
转载于:https://blog.51cto.com/inkfish/473900
相关文章:

【Qt】QImage加载bmp位图数据
QImage直接加载bmp文件 QImage image(image.bmp); QImage加载已经获取的bmp数据 unsigned char *imageData = NULL; int imageLen = (102*3+2)*126+54; imageData = (unsigned char*)malloc(imageLen); FILE*stream; if((stream=fopen("image.bmp","r")…

CVPR 2019审稿满分论文:中国博士提出融合CV与NLP的视觉语言导航新方法
整理 | 刘畅、Jane 责编 | Jane 出品 | AI科技大本营(公众号id:rgznai100) 如何挑战百万年薪的人工智能! https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw CVPR 2019 接收论文编号公布以来,AI科技大本营开始陆续…
有无目标的人生差10倍!赶紧和娃把新年计划做起来
春节连续几天朋友圈都是吃吃喝喝、陪父母陪娃、游山玩水,一派国泰民安的祥和状。昨晚一大学闺蜜突发感概,哎, 2018都快过1/6了,新年计划还没开始做,难道还是只能一声轻叹“今年一定是非常有意义的一年”吗?…

installshield 2009实现安装包自动编译
1.根据当前日期,在服务器上建立一个以日期命名的文件夹,删除本地现有的文件夹并下载最新的文件到本地call mydate %DATE%Rem Copy files from common folder on the designer to the common folder on my computerrd "F:\MySourceFile\MMS2.0\progr…

首发 | 旷视14篇CVPR 2019论文,都有哪些亮点?
译者 | Linstancy 责编 | Jane 出品 | AI科技大本营(公众号id:rgznai100) 回顾 CVPR 2018 ,旷视科技有 8 篇论文被收录,如高效的移动端卷积神经网络 ShuffleNet、语义分割的判别特征网络 DFN、优化解决人群密集遮挡问…

【Qt】Qt多屏编程,在指定显示屏上显示指定对话框
问题描述 主机连接两个显示器,一主一副,要求主显示器显示主界面,副显示器显示一对话窗口 解决方法 使用QDesktopWidget QDialog dlg = new QDialog(this); QDesktopWidget* desktop = QApplication::desktop(); this->setGeometry(desktop->screenGeometry(0)); …

Kruskal算法 - C语言详解
最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树。 例如,对于如上图G4所示的连通网可以有多棵权值总和不相同的生成树。 克鲁斯卡尔…

JavaScript初学者应注意的七个细节
每种语言都有它特别的地方,对于JavaScript来说,使用var就可以声明任意类型的变量,这门脚本语言看起来很简单,然而想要写出优雅的代码却是需要不断积累经验的。本文利列举了JavaScript初学者应该注意的七个细节,与大家分…

开学季,教你用Python画大学教室座位神分区图!网友直呼“中枪”
作者 | 丁彦军转载自恋习Python(ID:sldata2017)我们上过大学的朋友们都知道,大学没有固定教室也没有固定的座位,所以大家可以随便找个自己喜欢的位置坐下。别看这些不起眼的座位,感觉没什么差别。其实,它们…

【Qt】在ubuntu上打包发布Qt程序,可以不依赖Qt环境
参考博客 https://blog.csdn.net/theArcticOcean/article/details/68069964 https://blog.csdn.net/hjl_1991/article/details/50365927 亲测过程 1、编译处release版本的Qt程序 2、创建打包文件夹 mkdir release 3、进入文件夹,将要打包的程序拷贝到文件中 cd r…

Smart template的控件能否当成普通控件来用
我的同事问过我这个问题: 只要弄清楚Smart control的原理,就能回答这个问题。 答案是: smart control可以像普通的控件一样在xml view中被定义和使用,但是必须结合OData annotation,否则没有意义。以Smart control里的Smart field…

60行代码爬取知乎“神回复”,句句戳中泪点
作者 | shenzhongqiang转载自Python与数据分析(ID:PythonML)之前的一篇文章《爬了下知乎神回复,笑死人了~》发布后,引发了大家热烈的反响。很多朋友觉得很神奇,在后台问强哥是怎么做到的,有的朋友还表示不太…

IDC行业前景,机遇与挑战并存
中国互联网信息中心(CNNIC)发布了截至2010年6月底中国互联网发展基本情况的报告。在这半年一次的例行报告中,照例有些鼓舞人心的好消息。报告显示中国网民规模达到4.2亿,较09年底增长2.9%,宽带普及率达到98.1%,宽带网民规模为3.64…

【Ubuntu】Ubuntu14.04添加163的源
1、简单的两步 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo wget -O /etc/apt/sources.list http://mirrors.163.com/.help/sources.list.trusty sudo apt update2、注意 这是更改Ubuntu14.04的源,针对ubuntu其它版本参见博客 【Ubuntu】将Ub…
用模板实现单例模式(线程安全)、模板方式实现动态创建对象
一、用模板实现单例模式 在前面的文章中,用过多种方法实现单例模式,现在用模板方式来实现: 为了实现线程安全,需要在linux 下使用pthread_mutex_t 加锁,请使用g 编译并需要链接 -lpthread 使用的是double-check lock&a…

推荐系统召回四模型之全能的FM模型
作者 | 张俊林作者简介:中国中文信息学会理事,中科院软件所博士。目前在新浪微博 AI Lab 担任资深算法专家。在此之前,张俊林曾经在阿里巴巴任资深技术专家并负责新技术团队,以及在百度和用友担任技术经理及技术总监等职务。同时他…

MIDP2.0引入了Push注册机制
PushMIDP2.0引入了Push注册机制,作为一种允许应用被自动启动的方法,由预先设置的警告或者经inbound连接收到的消息。 通过这种方法,MIDlets可以用来设置处理规则事件,如定时从服务器上同步数据,或者非规则事件如一个突…

【OpenCV】cv::Mat和std::vector之间的相互转换
Mat转换成Vector 以vector 为例,其它模型类似 vector getVector(const Mat & a) { Mat b; a.convertTo(b, CV_64F); return (vector)(b.reshape(1, 1)); } Vector转换成Mat 使用Mat的构造函数 std::vector responses; cv::Mat tres; tres Mat(resp…

mysql数据库密码忘记恢复脚本
#!/bin/bashread -p "请输入你要修改的密码:" passwordskipawk /skip-grant-tables/{print $1} /etc/my.cnfif [ ! -n "$skip" ];then ##判断是否有skip-grant-tablessed -i /^[mysqld]/askip-grant-tables /etc/my.cnf ##变量为空就执行插入el…

-16 | 12 等于多少
2019独角兽企业重金招聘Python工程师标准>>> 今天同事问到一个问题 -16 | 12 等于多少? 从教材中知道,二进制数的第一位是符号位,正数为0,负数为1,再根据取反的定义可得到如下算式(假设整形是占…

深度学习在自动驾驶感知领域的应用
程序员转行学什么语言? https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw 本次直播课程是由深度学习资深研究者-杨阳博士从百度Apollo自动驾驶感知技术出发,讲解环境感知中深度学习的实用性与高效性。 课程从Apollo 3.5感知技术介绍、自动驾驶中的目…

【Qt】QObject::moveToThread 总结
原型 void QObject::moveToThread(QThread *targetThread) 功能 将QObject及其孩子移动到 指定线程(targetThread)中。它的事件将在targetThread线程中处理。 注意事项 1、该对象不能有parent,否则无法移动。 2、如果targetThread为零,…

中国联通备战5G MWC发布《Edge-Cloud平台架构及产业生态白皮书》
2月26日-3月1日,中国联通受邀参加2018MWC世界移动通信大会,作为本次大会GSMA智慧城市展区参展的唯一中国运营商,中国联通提出以服务为驱动的面向5G网络切片的演进思路,为客户提供4G到5G演进阶段的一致性的网络服务&…

转自一个面试者的“提示”
转自CSDN:http://topic.csdn.net/u/20110112/15/FFCBED16-E346-4074-87EE-0D682EF67FE2.html 希望对2011年努力寻找工作的人有帮助。 最近一直在参与公司的面试,为公司招收SE和SA。今天总结发现最近一共面试了二十几份简历,并且都是经过HE和猎…

【OpenCV】读取csv文件
csv简介 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符…

300道Python面试题,备战春招!
作者 | kenwoodjw 责编 | Jane 出品 | Python大本营(ID:pythonnews) 程序员转行学什么语言? https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw 过年开工回来到现在,营长每天在地铁里只看到了两家公司的广告&…

稻盛和夫《活法》
以下内容是摘自<稻盛和夫>的《活着》中文翻译版。此生将托付于此书! “吾等定此血盟不为私利私欲,但求团结一致,为社会、为世人成就事业。特此聚合诸位同志,血印为誓。”——稻盛和夫 1.人类活着的意义、人生的目的到底是什…

【OpenCV】将图像数据由YUV格式转换成JPG格式直接使用,而不保存成文件
解决方法 使用OpenCV图像编码和解码函数:imencode、imdecode std::vector data_encode; imencode(“.png”, img_encode, data_encode); 参考博客: https://blog.csdn.net/tt_ren/article/details/53227900

一个装作异步的代码段
// 获取当前周期 getCurrentCycle(subDepartmentIdthis.props.subDepartmentId) {let { dispatch } this.propscalculateApi.currentKaoqinCycle({id:subDepartmentId}).then(res>{ if (res.data.id) { //console.log(res.data.name); this.setState({ cycleName: res.data…

拯救老电影——详解爱奇艺ZoomAI视频增强技术的应用
看各种视频节目已经成为当前娱乐休闲的一种方式,技术的进步和网速的升级提升了我们的视觉愉悦感,但是你总会遇到一些情况,比如老电影/电视剧的画面抖动、色彩灰暗;用户带宽受限,选择低码流的模式;UP主上传的…