产品中有两部分程序,bootloader放在FLASHA,应用程序放在FLASHD,先烧写bootloader,然后在用bootloader烧写应用程序,现在在应用程序中加密,应用程序就跑不起来了,不知道是为什么,不加密是可以运行的
Eric Ma:
检查是否有程序放在没加密区,如RAMM0,M1,却又需要访问受保护的RAM和FLASH。
Eric
产品中有两部分程序,bootloader放在FLASHA,应用程序放在FLASHD,先烧写bootloader,然后在用bootloader烧写应用程序,现在在应用程序中加密,应用程序就跑不起来了,不知道是为什么,不加密是可以运行的
xiansheng qian:
bootloader放在FLASHA?
请问你是把在线升级程序放在FlashA中? 是生成一个out文件,之后烧写到flashA中吗? 请问如何实现将bootloader单独生成一个out文件的?
产品中有两部分程序,bootloader放在FLASHA,应用程序放在FLASHD,先烧写bootloader,然后在用bootloader烧写应用程序,现在在应用程序中加密,应用程序就跑不起来了,不知道是为什么,不加密是可以运行的
Eric Ma:
回复 xiansheng qian:
自己写的bootloader可以单独成一个工程,然后放在FlashA段中。并烧写进芯片。
用户的程序就不要用FlashA段,在烧写的时候也不要去擦除和编程FlashA段。
Eric
产品中有两部分程序,bootloader放在FLASHA,应用程序放在FLASHD,先烧写bootloader,然后在用bootloader烧写应用程序,现在在应用程序中加密,应用程序就跑不起来了,不知道是为什么,不加密是可以运行的
xiansheng qian:
回复 Eric Ma:
谢谢,那还想请问一下程序的执行顺序,因为两个main函数了。
产品中有两部分程序,bootloader放在FLASHA,应用程序放在FLASHD,先烧写bootloader,然后在用bootloader烧写应用程序,现在在应用程序中加密,应用程序就跑不起来了,不知道是为什么,不加密是可以运行的
xiansheng qian:
回复 Eric Ma:
我想的和您的思路一样,只是有一点还不确定,bootloader单独做成一个工程烧写入flashA中,里面也会有一个main函数,但是用户所做的程序中也会有main函数。这样的话如何让编译器识别这两个main函数?
我有个不太成熟的思路:是把自己写的在线升级程序bootloader(比如说函数名叫 ABC(void) ),放到codestart 中,在之前加一个是否需要升级程序的判断条件,如果需要更新程序则执行bootloader, 如果不需要则执行_c_int00函数。 但是ABC(void)必须写成main()才能在工程中编译过去。这是我搞不懂的地方,请您指点,万分感谢!!!
产品中有两部分程序,bootloader放在FLASHA,应用程序放在FLASHD,先烧写bootloader,然后在用bootloader烧写应用程序,现在在应用程序中加密,应用程序就跑不起来了,不知道是为什么,不加密是可以运行的
Eric Ma:
回复 xiansheng qian:
xiansheng
把bootloader和用户程序分开成两个工程。bootloader占用FlashA,用户程序占用其他Flash扇区。这样子,bootloader也有自己的_c_int00,即入口地址。当然用户程序也有。可以先烧写Bootloader工程的.out,然后再烧写用户程序的.out。
在设计程序时,如用户程序的主循环可以接收串口命令,当接收到升级命令后,则跳转到bootloader的_c_int00地址即可。
Eric
产品中有两部分程序,bootloader放在FLASHA,应用程序放在FLASHD,先烧写bootloader,然后在用bootloader烧写应用程序,现在在应用程序中加密,应用程序就跑不起来了,不知道是为什么,不加密是可以运行的
xiansheng qian:
回复 Eric Ma:
Eric 您好!
程序在执行的时候应该是先执行Bootloader工程,判断是否需要在线升级,如果不需要就跳转到用户应用程序。但是我不太清楚如何从bootloader的main函数跳转到用户应用程序的main函数中?
产品中有两部分程序,bootloader放在FLASHA,应用程序放在FLASHD,先烧写bootloader,然后在用bootloader烧写应用程序,现在在应用程序中加密,应用程序就跑不起来了,不知道是为什么,不加密是可以运行的
Eric Ma:
回复 xiansheng qian:
正常来讲,上电后可以直接跑到用户程序中,在线升级只有在用户的main程序中去判断,如果收到串口升级指令,才会跳到bootloader的入口地址,bootloaderd的_c_int00。
但为了防止在线升级失败了,你需要重新升级,可以用户程序已经被擦除了,没用户代码可以跳转到bootloader了,所以这种情况下无法升级成功。解决方法是:上电的时候先跑到bootloader的codestart代码中,去判断升级成功与否的标志位,如果升级成功或是不需升级,则跳转到用户程序的codestart。
Eric