编写CMD文件+读取Bitmap
这里所说的CMD文件是指在CCS的Project中添加的CMD文件。 就我目前所理解的,大概就是链接装配到Target上用到的“指令”。
首先来看看默认的CMD文件(安装MCSDK后)是什么样的 - /*
- * Linker command file
- *
- */
-
- -c
- -heap 0x41000
- -stack 0xa000
-
- /* Memory Map 1 - the default */
- MEMORY
- {
- L1PSRAM (RWX) : org = 0x0E00000, len = 0x7FFF
- L1DSRAM (RWX) : org = 0x0F00000, len = 0x7FFF
-
- L2SRAM (RWX) : org = 0x0800000, len = 0x080000
- MSMCSRAM (RWX) : org = 0xc000000, len = 0x200000
- DDR3 (RWX) : org = 0x80000000,len = 0x10000000
- }
-
- SECTIONS
- {
- .csl_vect > MSMCSRAM
- .text > MSMCSRAM
- GROUP (NEAR_DP)
- {
- .neardata
- .rodata
- .bss
- } load > MSMCSRAM
- .stack > MSMCSRAM
- .cinit > MSMCSRAM
- .cio > MSMCSRAM
- .const > MSMCSRAM
- .data > MSMCSRAM
- .switch > MSMCSRAM
- .sysmem > MSMCSRAM
- .far > MSMCSRAM
- .testMem > MSMCSRAM
- .fardata > MSMCSRAM
- platform_lib > MSMCSRAM
- }
[color=rgb(51, 102, 153) !important]复制代码
但是在一次测试(读取Bitmap图片)中发现了一些问题 为了更详细的追踪问题,我在子程序中添加了许多信息输出, 在对小尺寸图片进行测试时发现没有问题, 内存分配出问题一般是因为没有足够的空闲 对于那些零散的小块如果不足所需,也只能寻找更大的空闲区域 如果找不到就会返回失败信息
既然是在heap上分配,那么我们就需要检查CMD文件中关于MEMORY分配的布局了 显然,默认的-heap=0x41000 显然不够用
于是修改-heap 0x10000000 /* 512MB */ 够用了
关于一些段的含义,可以参考 .bss 存放全局和静态变量
.ebss 长调用的.bss(超过了64K地址限制)
.stack 存放C语言的栈
.sysmem 存放C语言的堆
.esysmem 長调用的.sysmem(超过了64K地址限制)
.text 可执行代码和常数(program)
.switch switch语句产生的常数表格(program/低64K数据空间)
.pinit Tables for global constructors (C++)(program)
.cinit 用来存放封全局和静态变量的初始化常数值(program)
.const 全局和静态的const变量初始化值和字符串常数,(data)
.econst 长.const(可定位到任何地方)(data) 始化块
我们将内存映射的MEMORY中DDR3设置得更大一些, 然后让heap等sections装入到这一段,这样就可改写CMD文件如下 - /*
- * Linker command file
- *
- */
-
- -c
- -heap 0x10000000 /* 512MB */
- -stack 0x10000
-
- /* Memory Map */
- MEMORY
- {
- L1PSRAM (RWX) : org = 0x0E00000, len = 0x7FFF
- L1DSRAM (RWX) : org = 0x0F00000, len = 0x7FFF
-
- L2SRAM (RWX) : org = 0x0800000, len = 0x080000
- MSMCSRAM (RWX) : org = 0xc000000, len = 0x200000
- DDR3 (RWX) : org = 0x80000000,len = 0x7FFFFFFF /* length=2^32-1, 4GB */
- }
-
- SECTIONS
- {
- .csl_vect > MSMCSRAM
- .text > MSMCSRAM
- GROUP (NEAR_DP)
- {
- .neardata
- .rodata
- .bss
- } load > DDR3 /*MSMCSRAM*/
- .stack > DDR3 /*MSMCSRAM*/
- .cinit > MSMCSRAM
- .cio > DDR3 /*MSMCSRAM*/
- .const > MSMCSRAM
- .data > MSMCSRAM
- .switch > MSMCSRAM
- .sysmem > DDR3 /*MSMCSRAM*/
- .far > MSMCSRAM
- .testMem > MSMCSRAM
- .fardata > MSMCSRAM
- platform_lib > MSMCSRAM
- }
[color=rgb(51, 102, 153) !important]复制代码
修改之后,测试可行
|