This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

我想把程序中的cinit段分开放在两个FLASH扇区中,该如何操作

你好:

        我现在的程序是想实现在应用编程(IAP),把负责在应用编程(IAP)部分代码放在扇区A中,把用户代码部分放在扇区B,C,D中。需要更新用户代码时,将B、C、D扇区的通过FLASH API擦除,然后重新烧写扇区B,C,D。

       这就需要通过CMD文件将两部分代码分开存储。我现在的问题是怎么讲.cinit段代码分开存储的不同的FLASH中?

      我现在的做法是自己定义了一个IAP_page0的段,将在应用编程(IAP)部分的.cinit段放在IAP_page0段,存储在扇区A中,将用户代码的.cinit段存储在扇区D中。CMD文件的配置如下:

IAP_page0:
{
.\Debug\DSP2823x_ECanB_IAP.obj(.cinit) 
} LOAD = FLASHA PAGE = 0

.cinit              : > FLASHD      PAGE = 0

      但是,我现在遇到的问题是IAP_page0:段中存放的.cinit不能对对应的.ebss段进行初始化,导致程序无法正常运行。请问有什么方案可以实现上述要求。

  • 怎么没有人回答,管理员在吗?

  •    你的IAP代码,存储到扇区A中是可以的,但执行是不行的,不知道你的用户代码和IAP代码是如何切换。它们是用同一个工程来编译的吗?还是2个独立的工程?

       按我的理解,平时都是用户代码在执行,收到上位机发送的烧写命令以后才会跳转到IAP代码执行,那你的IAP代码存储在flash的扇区A里执行的话是不能擦除、编程的,会冲突吧, 只能在ram中执行对flash的erase、program等操作。

        所以你的IAP代码在执行前应该全部移到ram中去,相应的IAP代码中的那些变量也应该定义在ram里面。

    假设你这两部分代码是用一个工程编译的,IAP部分的代码和变量都指定到特定的ram地址段上,最好是保持连续的几个小块,编译完成后你可以用ccs将out文件中的数据提取出来,把涉及到IAP代码的全部代码和数据提取出来----提取出来的就是IAP代码、变量对应的机器码,是常数,用几个const类型数组-------有几个小块就用几个数组--------存储起来,这几个数组都定义通过这个工程的cmd文件指定到flash的扇区A上去,   

    那么你这个工程正常情况下是用户代码在执行,收到指令就把那几个数组赋值到对应的ram地址上-------对应的ram地址是指这个工程cmd文件中IAP代码各个代码块、变量块分配的地址,    复制完成以后  跳转到iap代码中某个合适的地址开始执行。

    当然IAP代码和用户代码放在一个工程中编译是不好的,   应该独立成2个工程,  

    IAP工程的CMD文件中所有的代码和变量都分配到ram上------最好在一个连续的块上面,例如28335的0x3f8000到0x3f8fff,长度是0x1000,   IAP这个工程编译以后生成out文件,用ccs加载这个out文件,提取从0x3f8000到0x3f8fff之间所有的数据---------------这就是IAP工程的机器码,    提取出来整理好。

    用户代码工程中定义一个const类型数组,将上面提取出来的数据存储在这个const数组中,在用户代码的cmd文件中将这个数组指定到flash的扇区A上,用户代码指定到扇区B,C,D上去。

    在ABCD这4个扇区之外,你还要定义一些逻辑分段-----IAP_INTERFACE,指定到这4个扇区之外,当平时用户代码在执行时,收到外部的烧录命令,就开始将那个const数组的内容复制到ram中去,然后跳转到某一个地址------IAP工程的c-int00地址-----上开始执行。     这些复制数据,跳转的代码都要指定到IAP_INTERFACE段上来,它是不擦除的,避免更新失败以后失去更新程序的能力,当然还有对用户代码完整性的检查-----不完整需要跳转到等待烧录的分支去,  这种功能的代码也是在IAP_INTERFACE段上的。

    写的比较乱,没办法了。