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.

程序加密问题

Expert 1250 points


产品中有两部分程序,bootloader放在FLASHA,应用程序放在FLASHD,先烧写bootloader,然后在用bootloader烧写应用程序,现在在应用程序中加密,应用程序就跑不起来了,不知道是为什么,不加密是可以运行的

  • 检查是否有程序放在没加密区,如RAMM0,M1,却又需要访问受保护的RAM和FLASH。

    Eric

  • bootloader放在FLASHA?

    请问你是把在线升级程序放在FlashA中? 是生成一个out文件,之后烧写到flashA中吗? 请问如何实现将bootloader单独生成一个out文件的?

  • 自己写的bootloader可以单独成一个工程,然后放在FlashA段中。并烧写进芯片。

    用户的程序就不要用FlashA段,在烧写的时候也不要去擦除和编程FlashA段。

    Eric

  • 谢谢,那还想请问一下程序的执行顺序,因为两个main函数了。 

  • 我想的和您的思路一样,只是有一点还不确定,bootloader单独做成一个工程烧写入flashA中,里面也会有一个main函数,但是用户所做的程序中也会有main函数。这样的话如何让编译器识别这两个main函数?

    我有个不太成熟的思路:是把自己写的在线升级程序bootloader(比如说函数名叫 ABC(void) ),放到codestart 中,在之前加一个是否需要升级程序的判断条件,如果需要更新程序则执行bootloader, 如果不需要则执行_c_int00函数。 但是ABC(void)必须写成main()才能在工程中编译过去。这是我搞不懂的地方,请您指点,万分感谢!!!

  • xiansheng

    把bootloader和用户程序分开成两个工程。bootloader占用FlashA,用户程序占用其他Flash扇区。这样子,bootloader也有自己的_c_int00,即入口地址。当然用户程序也有。可以先烧写Bootloader工程的.out,然后再烧写用户程序的.out。

    在设计程序时,如用户程序的主循环可以接收串口命令,当接收到升级命令后,则跳转到bootloader的_c_int00地址即可。

    Eric

  • Eric 您好!

    程序在执行的时候应该是先执行Bootloader工程,判断是否需要在线升级,如果不需要就跳转到用户应用程序。但是我不太清楚如何从bootloader的main函数跳转到用户应用程序的main函数中? 

  • 正常来讲,上电后可以直接跑到用户程序中,在线升级只有在用户的main程序中去判断,如果收到串口升级指令,才会跳到bootloader的入口地址,bootloaderd的_c_int00。

    但为了防止在线升级失败了,你需要重新升级,可以用户程序已经被擦除了,没用户代码可以跳转到bootloader了,所以这种情况下无法升级成功。解决方法是:上电的时候先跑到bootloader的codestart代码中,去判断升级成功与否的标志位,如果升级成功或是不需升级,则跳转到用户程序的codestart。

    Eric