基于MDK的分散加载文件
2015-11-18 17:18
357 查看
面对这样一个新东西,先去官网看看,或者看看IDE的帮助,基本上你想要的东西都有了,BAIDU来的都不全面,这是一种学习方法。
http://www.keil.com/support/man/docs/armlink/armlink_BABDDHBF.htm
这个链接是我在官网上找到的关于分散加载文件的资料。讲的比较详细了。这里通过一个例子记录下我学习的过程,通过分散加载文件把代码从flash里拷贝到ram里运行, 基于LPC1788。
先贴下我的sct文件:
这里有两个加载域(load region)LR_IROM1和LR_IROM2,LR_IROM1是初始化程序,拷贝代码等,从ROM的地址0开始,LR_ROM2是应用程序,从ROM的0x2000开始。+RO表示只读,代码或者只读数据,一般用来表示代码,+RW表示可读可写的数据,+ZI表示初始化为0的数据。大括号里面的为运行域(execution region),一个加载域可以包含几个运行域,LR_ROM2里面有两个运行域,VECTOR和ER_IRAM1,我用VECTOR来表示中断向量区域,ER_IRAM1来表示应用程序区,+0表示紧接着VECTOR排放,EMPTY表示空的,这里空出0xE4的大小,用来放中断向量,.ANY表示除了上面用到的代码之外的代码,官网上有专门解释.ANY的一节。
下面用一张图来表示这个程序的加载域和执行域:
其实加载域的empty这块区域是不用空出来的,主要是运行域要空出来,用来拷贝中断向量,看个人喜好了,我觉得空出来方便引用这块区域的执行域地址。
这样框架就比较清楚了,拷贝的程序清单如下:
其中拷贝中断向量的时候要指定中断向量的偏移地址。
http://www.keil.com/support/man/docs/armlink/armlink_BABDDHBF.htm
这个链接是我在官网上找到的关于分散加载文件的资料。讲的比较详细了。这里通过一个例子记录下我学习的过程,通过分散加载文件把代码从flash里拷贝到ram里运行, 基于LPC1788。
先贴下我的sct文件:
LR_IROM1 0x00000000 0x00002000 { ER_IROM1 0x00000000 0x00020000 { *.o (RESET, +First) *(InRoot$$Sections) startup_lpc177x_8x.o (+RO) system_LPC177x_8x.o (+RO) } RW_IRAM1 0x20000000 0x00004000 { .ANY (+RW +ZI) } } LR_IROM2 0x00002000 0x0007E000 { VECTOR 0x10000000 EMPTY 0xE4 { } ER_IRAM1 +0 { .ANY (+RO) } }
这里有两个加载域(load region)LR_IROM1和LR_IROM2,LR_IROM1是初始化程序,拷贝代码等,从ROM的地址0开始,LR_ROM2是应用程序,从ROM的0x2000开始。+RO表示只读,代码或者只读数据,一般用来表示代码,+RW表示可读可写的数据,+ZI表示初始化为0的数据。大括号里面的为运行域(execution region),一个加载域可以包含几个运行域,LR_ROM2里面有两个运行域,VECTOR和ER_IRAM1,我用VECTOR来表示中断向量区域,ER_IRAM1来表示应用程序区,+0表示紧接着VECTOR排放,EMPTY表示空的,这里空出0xE4的大小,用来放中断向量,.ANY表示除了上面用到的代码之外的代码,官网上有专门解释.ANY的一节。
下面用一张图来表示这个程序的加载域和执行域:
其实加载域的empty这块区域是不用空出来的,主要是运行域要空出来,用来拷贝中断向量,看个人喜好了,我觉得空出来方便引用这块区域的执行域地址。
这样框架就比较清楚了,拷贝的程序清单如下:
extern unsigned char Image$$VECTOR$$Base; extern unsigned char Image$$VECTOR$$Length; extern unsigned char Load$$ER_IRAM1$$Base; extern unsigned char Image$$ER_IRAM1$$Base; extern unsigned char Image$$ER_IRAM1$$Length; void CopyCode2Ram () { unsigned char *pSrc, *pDes; unsigned int count; SCB->VTOR = 0x10000000; pSrc = 0; pDes = (unsigned char*)&Image$$VECTOR$$Base; count = 0xE4; while (count--) { *pDes++ = *pSrc++; } count = (unsigned int)&Image$$ER_IRAM1$$Length; pDes = (unsigned char*)&Image$$ER_IRAM1$$Base; pSrc = (unsigned char*)(&Load$$ER_IRAM1$$Base + 0xE4); while (count--) { *pDes++ = *pSrc++; } }
其中拷贝中断向量的时候要指定中断向量的偏移地址。
Load$$ER_IRAM1$$Base表示执行域
ER_IRAM1的加载地址;
Image$$ER_IRAM1$$Base表示执行域
ER_IRAM1的执行地址;
Image$$ER_IRAM1$$Length表示执行域
ER_IRAM1的实际长度,VECTOR区域因为是EMPTY,所以实际长度是0,而中断向量的长度是固定的,所以程序里就写了个常数。
相关文章推荐
- 分散加载文件浅析
- keil .sct分散加载文件及其应用
- SVM(Support Vector Machine)读书笔记一(最佳分割超平面)
- Android Context完全解析,你所不知道的Context的各种细节
- Linux ps命令详解与示例说明
- android中之断点续传
- 数据库必备知识
- 初识WCF
- poj 1459 Power Network SAP
- Android自定义手势识别
- 【Android学习笔记】Broadcast receiver
- android进行录音功能并保存播放
- 自定义控件(23)---FloatView悬浮窗(2)
- Itoa 函数
- 【转载】Linux必学的60个命令
- 2015-11-18-线程总结篇1
- java for循环实现乘法表
- AT指令对wavecom串口GSM工业手机发送短信(英文和PDU短信)
- 老李分享:大数据测试之HDFS文件系统
- 数根