sunnyqd 发表于 2014-8-26 11:29:09

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

本帖最后由 sunnyqd 于 2014-8-26 11:47 编辑


Region Table即位图中红色圈圈内的的一部分,另一部分是压缩后的数据,由Region Table指向
FLASH中,const和代码(.text)存放在图中绿色圈圈里
我想知道图中红色圈圈的存储格式是什么,因为分散加载到内存中的时候,有一个复制或解压缩过程
我尝试的是在KL02下做的仿真
Region Table的范围是
    Region$Table$Base                      0x0000070c   Number         0anon$obj.o(Region$Table)
    Region$Table$Limit                     0x0000073c   Number         0anon$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工程

FSL_TICS_ZJJ 发表于 2014-8-26 11:49:20

楼主,能否标出你楼上的图片出处?

sunnyqd 发表于 2014-8-26 11:55:57

FSL_TICS_ZJJ 发表于 2014-8-26 11:49
楼主,能否标出你楼上的图片出处?

Keil帮助文档里,或ARM Linker文档里也有,路径
Linker User Guide: Type 2 image, one load region and non-contiguous execution regions

dr2001 发表于 2014-8-26 11:59:30

这个Table是C RTL初始化代码内部使用的,即RVCT的输出Image的部分内容与C RTL初始化代码是紧耦合的。换个RVCT的版本,含义可能会产生变化。。。
尤其是RVCT的数据搬运可能会用压缩格式压缩数据。

如果非要弄明白字段的含义,编译完成以后,单步跟踪进__main,开始的一段就是数据搬运,很容易弄明白干啥的。那个压缩格式很简单……

sunnyqd 发表于 2014-8-26 12:19:54

dr2001 发表于 2014-8-26 11:59
这个Table是C RTL初始化代码内部使用的,即RVCT的输出Image的部分内容与C RTL初始化代码是紧耦合的。换个RV ...

单步调试过,__scatterload()函数,但没有很容易的弄明白是干啥的。。

sunnyqd 发表于 2014-8-26 12:20:19

dr2001 发表于 2014-8-26 11:59
这个Table是C RTL初始化代码内部使用的,即RVCT的输出Image的部分内容与C RTL初始化代码是紧耦合的。换个RV ...

官方这方面有文档吗?我找了一遍官网,没有找到呢

浪里白条 发表于 2014-8-26 13:28:36

感觉楼主研究得好深入,这种问题简直闻所未闻,值得学习。

dr2001 发表于 2014-8-26 13:31:18

sunnyqd 发表于 2014-8-26 12:20
官方这方面有文档吗?我找了一遍官网,没有找到呢

没文档,如果有兴趣研究,就只能反汇编。关键是研究这个没太大价值。。。

实际上和IAR的引导代码类似。

sunnyqd 发表于 2014-8-26 14:51:59

dr2001 发表于 2014-8-26 13:31
没文档,如果有兴趣研究,就只能反汇编。关键是研究这个没太大价值。。。

实际上和IAR的引导代码类似。 ...

比较好奇,只是想了解一下

sunnyqd 发表于 2014-8-29 15:48:36

顶一下   

qwert1213131 发表于 2014-8-29 17:35:13

只能帮你顶

sunnyqd 发表于 2014-8-29 21:10:30

qwert1213131 发表于 2014-8-29 17:35
只能帮你顶

估计很少有人搞过,多谢~

浪里白条 发表于 2014-8-29 21:16:48

sunnyqd 发表于 2014-8-29 21:10
估计很少有人搞过,多谢~

你这个太深入了,一般人都是做普通的开发应用,很少会去关心这些的

pcbddd 发表于 2014-8-29 21:25:40

不明白,帮顶

richards 发表于 2014-8-29 21:47:48

http://blog.csdn.net/dickydicky117/article/details/38638465
http://blog.csdn.net/dickydicky117/article/details/38638465

view plaincopy
<span style="font-size:18px;"></span>   

这样的利用主要有两个原因,第一在进行stm32开发时没有了code这样的关键字 将数据放入代码段,第二stm32f4 具有ccm ram 这段ram地地址不是连续的,并且只能有内核访。所以就要涉及到散列文件的修改了。



有两种方法可以做到。先介绍最简单的,但是却又最不好用的一种

view plaincopy
<span style="font-size:18px;">#include “absacc.h”

char CCMRAMBUF__at (0×10000000) ;</span>
这样可以分配绝对地址给这个缓冲区,但是如果有多个数据块需要放置,你就必须人工分配地址,保证不会有重叠。



第二种方法需要简单的配置下项目的属性



这时候代码编辑区有如下代码

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)
view plaincopy
}
view plaincopy
}
修改如下:

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>}
}
注意红色的段: 之后需要放置在CCMRAM的内容这样修饰

view plaincopy
#include "absacc.h"

//vu8 Graph_FB__at(0x10000000); //Òº¾§ÏÔʾ»º³åÇø
vu8 Graph_FB__section("CCMRAM"); //Òº¾§ÏÔʾ»º³åÇø
放置到CODE段的内容

view plaincopy
const u8 Ascii5x8E[]__attribute__ ((section("CODE")))=            // ASCII
{
    0x00,0x00,0x00,0x00,0x00, // - -

    0x00,0x00,0xFA,0x00,0x00, // -!-
....................................................................
}
虽然查看RW ZI 段的大小没有变化,但是实际在使用时已经有了不同,比如:









sunnyqd 发表于 2014-8-29 21:52:10

richards 发表于 2014-8-29 21:47
http://blog.csdn.net/dickydicky117/article/details/38638465
http://blog.csdn.net/dickydicky117/artic ...

我问的不是.sct的事情,不过还是多谢啦

zhongjiequan 发表于 2014-8-29 22:30:55

学习了~~~

abszy 发表于 2014-8-30 17:11:31

楼主还没解决吗?

sunnyqd 发表于 2014-8-30 20:38:38

abszy 发表于 2014-8-30 17:11
楼主还没解决吗?

没有呢   

sunnyqd 发表于 2014-9-3 14:35:32

顶一下再

湛泸骏驰 发表于 2014-9-3 16:03:29

帮顶。。。。。。romram在一个空间内?这是普林斯顿结构?不太懂。。。只是今天上课老师讲了下一个和哈佛结构。。看到那个图有点好奇。。

sunnyqd 发表于 2014-9-3 16:06:37

湛泸骏驰 发表于 2014-9-3 16:03
帮顶。。。。。。romram在一个空间内?这是普林斯顿结构?不太懂。。。只是今天上课老师讲了下一个和哈 ...

ROM和RAM可以放在一个同一个空间,Cortex有三条总线,D、I、S,挂载到I、S的都可以执行指令(貌似是,但我不确定)。。啥啥结构的,书上的东西太老了,甭管

湛泸骏驰 发表于 2014-9-3 16:09:23

sunnyqd 发表于 2014-9-3 16:06
ROM和RAM可以放在一个同一个空间,Cortex有三条总线,D、I、S,挂载到I、S的都可以执行指令(貌似是,但 ...

喔。还有待学习。。谢谢。

sunnyqd 发表于 2014-9-3 16:18:43

湛泸骏驰 发表于 2014-9-3 16:09
喔。还有待学习。。谢谢。

好好学呢,架构这东西看起来挺有意思的

sunnyqd 发表于 2014-9-10 16:35:18

找到了部分线索,以后用到的时候再详细了解吧
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0206h/Bhccgbbe.html

qq11qqviki 发表于 2014-9-17 16:26:03

顶一下{:smile:}
页: [1]
查看完整版本: FSL之深入理解ARM:Cortex核MCU Region Table存储格式是什么?