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.

求教:有关FLASH双程序(boot&app)之间的跳转?

Other Parts Discussed in Thread: CONTROLSUITE

采用F28027开发一个项目,要求后续产品能在线升级,参考了相资料及ARM上的做法的思路

将工程分为两部分(boot与app),分别烧录在DSP片上FLASH的前后两个不同区域。

boot包括底层通讯驱与FLASH读写,app是真正最后执行的部分

即用“程序”烧写“程序”有一个问题请教?

即前一程序(boot)完成Flash烧写或自检完成后,如何跳转到后一程序(APP)?

1、程序跳转有什么指令实现?

2、APP程序开发调试中除了对CMD文件中对FLASH进行地址分配外,还需要什么特殊处理?

  • mingxi,

    1.可以采用下面的方式跳转:

    #define Update (void   (*)(void))0x3F7FF6

     

    ………………

    在需要跳转时,

    (*Update)();

    这样就跳转到上面的这个地址中去了。

    所以如果烧写完成之后,可以跳转到0x3F7FF6,然后开始执行。

    2. 其他的没什么特殊的,只要注意用户程序和boot程序之间的跳转和相关判断就可以了。另外可以划出一个段给boot,这样就可以升级代码就可以固化了。

    Eric

     

  • Hi Eric,

            感谢您的回复,思路基本明白了,问题还是具体操作上:

    例如在TI例程,的F28027.CMD文件里:

       FLASHD      : origin = 0x3F0000, length = 0x002000     /* on-chip FLASH */
       FLASHC      : origin = 0x3F2000, length = 0x002000     /* on-chip FLASH */
       FLASHA      : origin = 0x3F6000, length = 0x001F80     /* on-chip FLASH */

    我想把boot程序放在FLASHA中,将用户程序放在FLASHC中。

    1.在boot程序的project里,执行跳转判断后,如何跳到FLASHC中用户程序的main开始执行?

    2.在APP程序的prject里,除将cmd文件中SECTIONS中 Allocate 的FLASHA改成FLASHC外,还要哪些操作?

    能否帮忙分别给出boot与app两个简单的demo例程,只需实现上电后,从boot程序(FLASHA)运行一定时间后跳转到APP程序(FLASHC)执行?

  • 1. 像上面Eric提到的一样,只要你跳转到了那个地址,后面它就自动会执行到App的main();

    2. 只要对App自己使用到的flash和RAM进行指定即可,不让它与boot的flash和RAM重叠。

  • 感谢答复!但还是不明白?

    1、0x3F7FF6地址,我看TI 例程里的CMD文件是

       BEGIN       : origin = 0x3F7FF6, length = 0x000002     /* Part of FLASHA.  Used for "boot to Flash" bootloader mode. */

    在Boot程序跳转时,跳到那个地址会跳到APP程序的main么?为什么?能否具体说明?

    2、FLASH划为两块分别给boot与app能理解,但RAM如何分配?

    希望高手专家能给出例程,万分感谢!

  • 1,是的,会跳转到main(),因为该地址里存有执行C语言环境初始化以及其它功能的代码,然后就会执行这个跳转,具体请参考BOOT ROM手册或controlsuite路径下的文档和例子(以F2806x为例:C:\ti\controlSUITE\libs\utilities\boot_rom\2806x);

    2,RAM可以随意分配,只要够用且不互相冲突就可以了。

  • 感谢您的回答,但是还是有问题:

    1,我理解是该语句无法跳到APP的main(),只会跳到Boot中的main。因为两个(boot与app)工程的CMD文件都是BEGIN

       BEGIN       : origin = 0x3F7FF6, length = 0x000002     /* Part of FLASHA.  Used for "boot to Flash" bootloader mode. */

    请问谁有实际做过类似的工程呢?能否提供两个工程的文件(Boot与APP)的一个简例子

  • 是的,只能跳到一个的main(),确切地说就是boot的main,然后需要在里面判断是进行程序升级还是到app的主程序运行。

    只能有一个工程的cmd里有BEGIN,就是boot.

  • 那如果是到APP主程序运行呢,这个时候应该怎么跳转,总不至于又跳到begin里面然后又回boot的main吧,这个点不是很理解

  • 我试过copy完后跳到数据流里的入口地址结果他又返回到boot的main里面,然后接下来该如何跳到app去运行,我试过一直都是返回到boot的main里。

  • 你好,不知道你后面boot和app这个问题解决了吗?我现在遇到和你一样的问题,能讨论下吗?qq:342257828

  • 求教!!!!!!!

  • 总不会boot和app合在同一个程序里吧

  • 您的这个问题解决了吗?我现在也在做这个事情?