这里所说的CMD文件是指在CCS的Project中添加的CMD文件。
就我目前所理解的,大概就是链接装配到Target上用到的“指令”。
这里有一篇博文可以参考
《ccs中的cmd》http://blog.csdn.net/sphone89/article/details/6623555
首先来看看默认的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 = <span class="hljs-number">0x0800000</span>, <span class="hljs-built_in">len</span> = <span class="hljs-number">0x080000</span>
MSMCSRAM (RWX) : org = <span class="hljs-number">0xc000000</span>, <span class="hljs-built_in">len</span> = <span class="hljs-number">0x200000</span>
DDR3 (RWX) : org = <span class="hljs-number">0x80000000</span>,<span class="hljs-built_in">len</span> = <span class="hljs-number">0x10000000</span>
}
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
}一般简单的测试,添加默认的CMD文件就可以了,详细步骤参见
CCS+C6678LE开发记录03:常规入门HeloWorld
http://blog.csdn.net/fengyhack/article/details/41945029
但是在一次测试(读取Bitmap图片)中发现了一些问题
为了更详细的追踪问题,我在子程序中添加了许多信息输出,以下是一个示例
在对小尺寸图片进行测试时发现没有问题,
当图片尺寸太大时就会出现“内存分配失败”的错误
我特意找来一张6k*4k的超大图片测试,的确有问题
内存分配出问题一般是因为没有足够的空闲
malloc函数在heap上分配连续的内存,参考
《C语言中内存分配》http://blog.csdn.net/youoran/article/details/10990815,
对于那些零散的小块如果不足所需,也只能寻找更大的空闲区域
如果找不到就会返回失败信息
既然是在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 = <span class="hljs-number">0x0800000</span>, <span class="hljs-built_in">len</span> = <span class="hljs-number">0x080000</span>
MSMCSRAM (RWX) : org = <span class="hljs-number">0xc000000</span>, <span class="hljs-built_in">len</span> = <span class="hljs-number">0x200000</span>
DDR3 (RWX) : org = <span class="hljs-number">0x80000000</span>,<span class="hljs-built_in">len</span> = <span class="hljs-number">0x7FFFFFFF</span> <span class="hljs-comment">/* length=2^32-1, 4GB */</span>
}
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
}
修改之后,测试可行
但是这样做似乎效率很低,我在测试一张1024*768大小的RGB图片时,读取数据用了了3分多钟!