FSL之深入理解ARM:Cortex核MCU Region Table存储格式是什么?

2020-02-20 21:08发布

本帖最后由 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的范围是
  1.     Region$Table$Base                      0x0000070c   Number         0  anon$obj.o(Region$Table)
  2.     Region$Table$Limit                     0x0000073c   Number         0  anon$obj.o(Region$Table)
复制代码
Region Table为
  1. 0000 073C
  2. 1FFF FC00
  3. 0000 03F4
  4. 0000 03BA
  5. 0000 0750
  6. 2000 0000
  7. 0000 0014
  8. 0000 0104
  9. 0000 0764
  10. 2000 0014
  11. 0000 0264
  12. 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 上传 点击文件名下载附件
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
25条回答
pcbddd
1楼-- · 2020-02-22 03:15
不明白,帮顶
richards
2楼-- · 2020-02-22 05:11
http://blog.csdn.net/dickydicky117/article/details/38638465
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 段的大小没有变化,但是实际在使用时已经有了不同,比如:









sunnyqd
3楼-- · 2020-02-22 10:34
richards 发表于 2014-8-29 21:47
http://blog.csdn.net/dickydicky117/article/details/38638465
http://blog.csdn.net/dickydicky117/artic ...

我问的不是.sct的事情,不过还是多谢啦
zhongjiequan
4楼-- · 2020-02-22 12:13
学习了~~~
abszy
5楼-- · 2020-02-22 15:25
 精彩回答 2  元偷偷看……
sunnyqd
6楼-- · 2020-02-22 21:18
abszy 发表于 2014-8-30 17:11
楼主还没解决吗?

没有呢   

一周热门 更多>