【问TI】cmd内存分配和程序本身烧写疑惑

安_然   2011-8-20 15:47 楼主

最近在看ckfa ,有以下疑惑:

1.程序是在烧写时就直接按照cmd的内存分配去放置执行程序和常量的?

2.如果我用flash api 烧写,那这个时候是怎么分配的?我在烧写的时候可以指定起始地址,比如将程序烧写在sector H中,但cmd中指定在.text 等执行程序内配在sector B 如何理解这两种分配?

工程 = 数学+物理+经济

回复评论 (7)

回复 楼主 安_然 的帖子

没有完全理解你的意思。不过注意以下几点:
1:离线运行,请使用Flash CMD文件,所有的代码要放入flash,至于具体的存放位置,可以在你的程序中进行data和code的声明,该声明直接跟cmd文件中你自己定义的内存区域(名)相连接;
2:在线debug或者是ckfa中的引导程序,请使用ram CMD文件,所有代码放入ram中,需要确定程序的begin地址,因为在ckfa过程中需要在线切换运行程序,需要跳转至其他程序运行;
3:#pragma 进行data和code的声明时,可以将code和数据编译后放置到.text以外指定的区域。
点赞  2011-8-22 11:03
多谢回答以上您讲的我明白。
就是因为明白所以才会有如下疑惑:
如果用ckfa来进行程序的擦写,那应用程序(用户程序)是怎么存放的,我看例程中是用 flash cmd 这表示我要将这个程序写入flash.
但是我的疑问是在ckfa中我看到是用这个函数来进行程序的烧写
Flash_Program(Flash_ptr,BlockBuffer1,Length,&ProgStatus);
我理解为:Flash_ptr 代表指针指向开始烧写的的地址,BLockBuffer1代表需要烧写的内容起启地址,Length烧写数据的长度。
Flash_ptr 在ckfa中为 Flash_ptr = (Uint16 *)0x003F8000
但是我在api 例程中看到它可以指向flash 块内的任何地址,并且从这个地址开始存放数据。
我想问的问题是在ckfa所传送的应用程序,如果我设置的Flash_ptr =flash D sector 的起始地址,那会这个应用程序会怎么被存储?
如果像数据一样存储:
for(i=0;i     {
        Buffer = 0x4500+i;
    }
   
    Flash_ptr = (Uint16 *)Sector[1].StartAddr+0x450;
    Length = 0x199;
    Status = Flash_Program(Flash_ptr,Buffer,Length,&FlashStatus);
那就是按着地址往下存放。
但是我的应用程序是有cmd文件的,那它是会按照上面的情况按地址往下存放,还是按照cmd存放。
工程 = 数学+物理+经济
点赞  2011-8-22 21:13
囧神
请教下我通过sci 在flash上下载的是应用程序的coff文件转化成的.bin格式的数据,是否需要在下次通过 flash bootloader的 启动引导根据coff文件内的信息去进行初始化段,把相应的内容烧写到 flash 内。

如果我将.bin 数据通过sci 存放在sector  B中,但是下次启动后是否会根据cmd说明的link 去重新分配内存而将sector B 内的内容擦掉。
工程 = 数学+物理+经济
点赞  2011-8-23 15:08

回复 板凳 安_然 的帖子

首先,你不用具体去关心你的应用程序地址,只需要生成flash CMD的文件就可以;其次,下载过程中使用的是hex文件或者a00文件,改格式的文件有具体的格式规定,就是你可以用记事本打开,查看flash中的每段flash的其实地址和数据及其长度;最后,ckfa就是通过读取hex文件中的格式信息,就可flashAPI函数把整个hex文件烧写到C2000的flash中。
点赞  2011-8-25 17:25
通过sci写到flash中的工程跟你使用jtag下载是一样的,两个过程都是将数据写到根据CMD文件定义好的地址,不会进行重新分配。具体的过程,查看我前面的解释。
点赞  2011-8-25 17:27
囧神
1.我看到ckfa读取并烧写hex文件使用的是这个库函数
Flash_Program(Flash_ptr,BlockBuffer1,Length,&ProgStatus);
我可否这样理解这个库函数如果它下载并烧写的是hex 文件,那么它会将数据写到根据CMD文件定义好的地址。
请问这个Flash_ptr 的指针地址设置有什么具体的要求吗?

2.如果这个函数烧写的只是普通的变量,那么它的分配地址,是根据
Flash_Program(Flash_ptr,BlockBuffer1,Length,&ProgStatus);
中参数所设置的地址内容去烧写。

ps:目前我在实验中看到2确实是这么做的。所以想确认下1中的想法是否正确
工程 = 数学+物理+经济
点赞  2011-8-26 16:18
顶一个,希望被 回答
工程 = 数学+物理+经济
点赞  2011-8-29 16:23
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复