变量数据是怎么进ARM中的RAM中?
这篇文章 是从网上复制过来的。觉得不错,分享给大家。原文地址:http://eetrend.com/forum/100028828
ARM的体系结构有很多很多介绍的地方,从其7种模式到CPSR状态寄存器,这些都是属于最底层的硬件直接相关的ARM属性,再向上一点,考虑一下在ARM上运行的嵌入式应用,一般称在ARM上直接运行的嵌入式应用为Image就是直接烧进flash运行的可执行文件,这种可执行文件是由IAR,ADS,ARM-EABI-GCC等编译器经过编译所直接生成的。由于没有操作系统的支持,这种镜像文件是需要自己管理底层存储空间的分配的。这里我主要说一下关于Image镜像与ROM,RAM的关系。
首先在ARM上电启动时Image是在ROM中的,这就有问题了,我们知道,程序是由指令与数据共同组成的,指令可以放在ROM中,但数据变量必须放在RAM中才能够运行啊,可ARM上电时RAM空间是清空的啊,这就产生一个问题,变量数据是怎么进到RAM中的,由谁来做的。介绍一下ARM程序中各种标志,在ARM中有CODE,READONLY DATA, READWRITE DATA, ZI,他们分别表示
CODE:ARM 指令,
READONLY DATA指只读数据,如const int tst = 1;
READWRITE DATA可读写数据,就是我们常说的变量,已经被初始的变量才是READWRITE DATA。如 int tst = 2;
ZI:Zero Init数据,就是不初始化,或者用0初始化的变量。
在IAR,ADS等开发工具中,其配置文件中需要为编译后的镜像指定各段所在的地址空间,由可读写属性上可以主要分为
READONLY 包括CODE,READONLY DATA
READWRITE 包括READWRITE DATA,ZI。
了解了这些基础知识后,回到最初的问题,ARM的Image就是由上面所说的各个段组成的,那在只读的ROM空间,如何将READWRITE的数据放入RAM中的那,在代码中我们并没有作这些事啊。其实,这部分工作是由Image自动进行的不需要认为干预,在启动时,Image自动将数据拷贝到RAM中,这里还要强调一下,拷贝的只是READWRITE变量,对ZI的变量,直接将所在内存段清0即可,无需拷贝。
在编写嵌入式程序过程中,需要重点将存储空间中各段位置考虑好,在进行Image的编译,Image起始地址必须是0x00,或者CPU指定的运行地址,重点是分配各个特殊状态的STACK空间,以及用于动态分配的HEAP空间。在IAR中有关于 initialize by copy/manule的指令,就是用来将RW数据段拷入RAM中的,这里一定要将RW拷入,否则会导致运行错误。
变量数据是怎么进ARM中的RAM中?的更多相关文章
- python2/3中 将base64数据写成图片,并将图片数据转为16进制数据的方法、bytes/string的区别
1.python2将base64数据写成图片,并将数据转为16进制字符串的方法 import binascii img = u'R0lGODlhagAeAIcAAAAAAAAARAAAiAAAzABE ...
- 4. 在Inspector面板中显示类中变量+ 拓展编辑器
1. C#脚本如下: using UnityEngine; using System.Collections; public class MyTest : MonoBehaviour { ; ; [S ...
- 向post请求中写入数据,最终保存在了HttpWebRequest.Params中
一.向post请求中写入数据,最终保存在了HttpWebRequest.Params中: 1)如果存入的是IDictionary类型的字符串变量,如:“username=administrator”, ...
- 嵌入式应用中CGI编程中POST、GET及环境变量详解
原载地址:http://3633188.blog.51cto.com/3623188/828095 1.POST和GET 一个CGI程序在于服务器之间的信息传输和数据传输一般通过两种方法,即 ...
- C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期
全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内 ...
- MySQL 服务器变量 数据操作DML-视图
原文:MySQL 服务器变量 数据操作DML-视图 SQL语言的组成部分 常见分类: DDL:数据定义语言 DCL:数据控制语言,如授权 DML:数据操作语言 其它分类: 完整性定义语言: DDL的一 ...
- Matlab中导入文本文件中的数据 矩阵合并 以及C++中删除文件操作
今天用到了Matlab读取文本文件中按照一定格式存储好的数据,然后进行后续的分析计算等,因此涉及到Matlab的文件读取,记录在这里,供以后查阅: fid = fopen('train.set', ' ...
- java读取url中json文件中的json数据
有时候需要远程从其他接口中获取json数据,如果遇到返回的json数据是一个文件而不直接是数据,那么可以通过以下方法进行读取: /** * 从数据接口获取到数据 * @return * @throws ...
- python基础知识四 小数据池,深浅拷贝,集合+菜中菜
四.小数据池,深浅拷贝,集合+菜中菜 1小数据池 --缓存机制(驻留机制) '==' 判断两边内容是否相等 'is' 基于内存地址进行判断是否相同 a = 10 b = 10 print(a ...
随机推荐
- 探求Floyd算法的动态规划本质(转)
---恢复内容开始--- Floyd–Warshall(简称Floyd算法)是一种著名的解决任意两点间的最短路径(All Paris Shortest Paths,APSP)的算法.从表面上粗看,Fl ...
- typedef与define的区别
1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错.例如:#define PI 3.1415 ...
- 写两个线程,一个对n每次加一,一个对n每次减一
public class A{ private static Integer n = 0; } public class B extends A implements Runnable ...
- MKMapView and Zoom Levels: A Visual Guide
原帖:http://troybrant.net/blog/2010/01/mkmapview-and-zoom-levels-a-visual-guide/ So, how exactly does ...
- jq指定行切换
function G(){ var item=$('.req_list_item>li'); item.find($('.req_show')).hover(function(){ $(this ...
- 【蓝桥杯】PREV-5 错误票据
题目链接:gpid=T28">http://lx.lanqiao.org/problem.page? gpid=T28 历届试题 错误票据 时间限制:1.0s 内存限制:2 ...
- 苹果有益让老iPhone变慢以迫使消费者购买新一代的iPhone?
首先,来一组来自谷歌Trends的图片.(谷歌Trends记录了某段时间内相关关键词搜索的次数.) 假设你做数据,那么你应该会有些感觉. 特别是第一幅图,它规律似乎比第二幅更明显,第二幅图仅仅是一个普 ...
- C语言排序算法复习
排序算法有很多种,这里在复习和分析的基础上,做一个自己的总结: 首先要知道有哪些排序算法,google一下,有云C语言7大经典排序算法(也有8大).主要包括冒泡排序,快速排序,选择排序,插入排序,希尔 ...
- android常用软件下载资源链接
最新内容请看:http://www.androiddevtools.cn/ https://github.com/inferjay/AndroidDevTools 官方adt下载地址:http://d ...
- 关于MyEclipse查看底层源码出现source not found的问题(MyEclipse、Eclipse配置JAD)
一.MyEclipse 第一步: 下载jad.exe文件:jad下载地址 eclipse插件:net.sf.jadclipse_版本号.jar下载地址一 net.sf.jadclipse_版 ...