本帖最后由 sunnyqd 于 2014-8-26 11:47 编辑
Copy of k3.jpg (34.93 KB, 下载次数: 0)
下载附件
2014-8-26 11:18 上传
Region Table即位图中红 {MOD}圈圈内的的一部分,另一部分是压缩后的数据,由Region Table指向
FLASH中,const和代码(.text)存放在图中绿 {MOD}圈圈里
我想知道图中红 {MOD}圈圈的存储格式是什么,因为分散加载到内存中的时候,有一个复制或解压缩过程
我尝试的是在KL02下做的仿真
Region Table的范围是
- Region$Table$Base 0x0000070c Number 0 anon$obj.o(Region$Table)
- Region$Table$Limit 0x0000073c Number 0 anon$obj.o(Region$Table)
复制代码
Region Table为
- 0000 073C
- 1FFF FC00
- 0000 03F4
- 0000 03BA
- 0000 0750
- 2000 0000
- 0000 0014
- 0000 0104
- 0000 0764
- 2000 0014
- 0000 0264
- 0000 0120
复制代码
Region Table里面的格式应该是4个字一组
第一个word表示:源地址
第二个word表示:目的地址
第三个word表示:长度或其他值?
第四个word表示:应该是指定word1和word2位置的数据存储和压缩类型,可能是个结构体
上面没有找到官方的说明,一个老外问过
http://www.keil.com/forum/19386/,但也没有人解答
问我为什么这样用,楼主只是想了解一下内部详细的实现方式,以后或许会用的到
希望了解的来告知一下,大家有兴趣的话,也可以谈谈想法
附Keil MDK工程
Blinky.zip
(203.16 KB, 下载次数: 6)
2014-8-26 11:27 上传
点击文件名下载附件
http://blog.csdn.net/dickydicky117/article/details/38638465
[cpp] view plaincopy
<span style="font-size:18px;"></span>
这样的利用主要有两个原因,第一在进行stm32开发时没有了code这样的关键字 将数据放入代码段,第二stm32f4 具有ccm ram 这段ram地地址不是连续的,并且只能有内核访。所以就要涉及到散列文件的修改了。
有两种方法可以做到。先介绍最简单的,但是却又最不好用的一种
[cpp] view plaincopy
<span style="font-size:18px;">#include “absacc.h”
char CCMRAMBUF[0x10000] __at (0×10000000) ;</span>
这样可以分配绝对地址给这个缓冲区,但是如果有多个数据块需要放置,你就必须人工分配地址,保证不会有重叠。
第二种方法需要简单的配置下项目的属性
这时候代码编辑区有如下代码
[plain] view plaincopy
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00080000 { ; load region size_region
ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x10000000 0x00010000 {
.ANY (+RW +ZI)
[plain] view plaincopy
}
[plain] view plaincopy
}
修改如下:
[cpp] view plaincopy
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00080000 { ; load region size_region
ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
<span style="background-color: rgb(255, 0, 0);"> .ANY (CODE)
</span> }
RW_IRAM1 0x20000000 0x00020000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x10000000 0x00010000 {
<span style="color:#000000;background-color: rgb(255, 0, 0);"> .ANY (CCMRAM)
</span> }
}
注意红 {MOD}的段: 之后需要放置在CCMRAM的内容这样修饰
[cpp] view plaincopy
#include "absacc.h"
//vu8 Graph_FB[96*32/8] __at(0x10000000); //Òº¾§ÏÔʾ»º³åÇø
vu8 Graph_FB[96*32/8] __section("CCMRAM"); //Òº¾§ÏÔʾ»º³åÇø
放置到CODE段的内容
[cpp] view plaincopy
const u8 Ascii5x8E[] __attribute__ ((section("CODE")))= // ASCII
{
0x00,0x00,0x00,0x00,0x00, // - -
0x00,0x00,0xFA,0x00,0x00, // -!-
....................................................................
}
虽然查看RW ZI 段的大小没有变化,但是实际在使用时已经有了不同,比如:
我问的不是.sct的事情,不过还是多谢啦
没有呢
一周热门 更多>