CCS+C6678LE开发记录04:编写CMD文件+读取Bitmap

原文链接:http://www.cnblogs.com/fengyhack/p/10603594.html

这里所说的CMD文件是指在CCS的Project中添加的CMD文件。

就我目前所理解的,大概就是链接装配到Target上用到的“指令”。

这里有一篇博文可以参考

ccs中的cmdhttp://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 = 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
}
一般简单的测试,添加默认的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 = 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
}


修改之后,测试可行


但是这样做似乎效率很低,我在测试一张1024*768大小的RGB图片时,读取数据用了了3分多钟!




本文原创,博文地址

http://blog.csdn.net/fengyhack/article/details/42103445

转载于:https://www.cnblogs.com/fengyhack/p/10603594.html

原文链接:加载失败,请重新获取