原创 [STM32]MDK下代码的分段管理 续2

2013-12-14 11:33 3706 22 23 分类: MCU/ 嵌入式 文集: STM32浅谈

前文所述的代码分段,限定比较大,对于使用

#pragma arm section code=".ARM.__at_0x8100000"

固定地址的方式,每个文件都需要指定不同的地址以区别。这样极大的不便,因为很多时候,你貌似没必要查看map去计算每个函数的大小吧。。。另外这样也可能造成资源的浪费。

本指望MDK可以像KEIL C那样可以在location页设置一些宏即可定位,无奈没有这个功能。转到最后还是走回了分散加载的路子。大家讨论的比较多,但是都比较泛泛,网络上能找到的,基本一个样子,抄来抄去。

查了半天帮助文档,经过几天的尝试,总算摸清了一点。现在分享给大家,希望有人可以一起讨论。

首先:我的目的是把我的代码分成两个段,BSP和APP彻底分开!但是我每部分代码都有好多的文件,所以不可能我在每个文件都加上一个函数属性。

 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

sct文件:
1.
LR_IROM1 0x08000000 0x00020000  { ; load region size_region
; Code 1
ER_IROM1 0x08000000 0x00000400  { ; load addr' = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
; Code 2
; Code 1~Code 2之间用0填充
ER_IROM2  0x08000500 FIXED { ; load addr= execution address
.ANY (my_code)
}
; RAM
RW_IRAM1 0x20000000 0x00010000  { ; RW data
.ANY (+RW +ZI)
}
}
 
在一个数据段内定义分区, 必须加入"FIXED"修饰
加入 FIXED 修饰之后可以固定段(my_code)的地址
但是现在中间部分都会放入 0x0000000 初始化
 
2.
LR_IROM1 0x08000000 0x00000400  { ; load region size_region
; Code 1
ER_IROM1 0x08000000 0x00000400  { ; load addr'= execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
; RAM
RW_IRAM1 0x20000000 0x00010000  { ; RW data
.ANY (+RW +ZI)
}
}
LR_IROM1 0x08000500 0x00010000  { ; load region size_region
; Code 2
ER_IROM2  0x08000500  { ; load addr'=execution address
.ANY (my_code)
}
}
上述方式可以定义段的位置, 而且不会出现全是0的空段.
在hex文件自动分区处理.
这样的话将数据分为两个数据段处理.

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

上述第二种方式可用。
它可以直接把代码分成两个段。第一种方式必须使用FIXED之后才能把第二个段定位,但是他中间是填充的模式(还是一个段)。
需要注意的是:
1. map文件大多是对的,但是hex不一定对。
2. 编译之后必须验证hex文件的正确性。
3. 很多现有的hex2bin的工具不能转换扩展的hex格式。
4. 建议自己写一个hex2bin的工具,把你分的段分别转换成两个文件。分开烧录(主要是升级使用),这样远程升级的代码量会变小。
 
其实上述想法主要是来源于近期对Freesacle MCU的研究。他的函数都需要指定代码段的地址。虽然麻烦,但是也有一定的方便性。
 
今天就写到这里,祝大家周末愉快!

文章评论1条评论)

登录后参与讨论

用户403664 2013-12-16 09:46

赞,欢迎回来!
相关推荐阅读
用户1156376 2014-08-18 17:23
[博客大赛]MDK下代码的分段管理 续3
继续写点分段管理的问题。 设计思想主要是设计一个通用的BSP,固化后只需要修改APP代码就可以,这适用于远程升级的系统或是进行二次开发的系统。 考虑到编译器链接的时候会把没有使用的代码段(...
用户1156376 2014-02-27 18:14
Freescale MCU SPI
Freescale S12 SPI: 0. 以下所述为查询模式使用SPI 1. SPI控制器有两个中断, 数据发送(SPTEF)和数据接收(SPIF) 2. 数据发送(SPTEF)标志...
用户1156376 2014-02-26 09:17
Freescale MCU摘记
仅用于记录Freescale的点滴记录: 1. 把AD口用作IO口的方法: 除了正常的设置外,还需要把 ATDDIEN 寄存器写为0xFF, 这样使能了数字IO。否则默认为AD输入。 ...
用户1156376 2013-12-09 18:12
[STM32]MDK下代码的分段管理
编译大型的程序时,可能某一段代码固定之后不再改变(比如BSP),而应用部分经常修改。在这种情况下,如果使用在线升级或是Bootloader的方式升级程序时,你就觉得每次升级的代码有一部分是重复的(...
用户1156376 2012-10-14 09:10
【uCOS-III移植笔记】OS启动过程
(1) 关闭系统中断 (2) CPU_Init(); 初始化CPU服务(时间戳、中断时间测量、CPU信息初始化等) (3) OSInit(); 初始化系统(系统变量、系统任务...
我要评论
1
22
关闭 站长推荐上一条 /2 下一条