你好,
我写了一个bootloader,使用spi-flash实现在线升级,bootloader放在sectorB-C,APP放在sectorE-J,内部flash读写使用ti提供的库,升级是通过ccs的hex2000工具转换而来。
目前实现的流程:
主函数接收到升级文件后存入spi-flash,然后暖启动重新进入bootloader;
进入bootloader的实现流程如下:首先是时钟 spi以及内部flash等的初始化,然后初始化FLASH API,擦除内部flash
①相关外设初始化,包括禁看门狗,禁中断等→②初始化Flash api→③擦除内部flash→④从spi-flash读取本次升级文件的长度→⑤读取存入spi-flash的文件,并依次写入内部flash
问题:
第一次升级没有问题;
当进行第二次升级时,bootloader虽然会被调用,但会跑飞(),而且发现同样一个函数,如果单步运行,没有问题,而一旦全速运行,这个函数还没执行完就已经跑飞了;
下一次重新用仿真器烧录程序后,同样的也是第一次没问题,第二次跑飞。
当然如果bootloder中取消第三步和第五步,不管怎么运行都没有问题。
起初怀疑是不是bootloader这段代码被修改导致,但对比内存中的这段代码,并无任何差异。
请问一下:
①用仿真器烧录程序和单板重新上下电或者暖启动 对dsp而言有什么去区别?
②造成bootloader跑飞的可能原因有哪些?
Green Deng:
你好,你的情况我想到一点,flash API函数必须运行在ram中,不知道你是否有将bootloader程序搬运到ram中运行的步骤?
,
user6441275:
你好,
这一步操作是有的
代码中:
BootMemCopy(&bootRamfuncsLoadStart, &bootRamfuncsLoadEnd, &bootRamfuncsRunStart);//ok
cmd中:
LOAD = BOOT_FLASH, RUN = RAMLS0123, LOAD_START(_bootRamfuncsLoadStart), LOAD_END(_bootRamfuncsLoadEnd), RUN_START(_bootRamfuncsRunStart), PAGE = 0
每次升级第一次执行bootloader没有问题,升级第二次执行bootloader时,程序就跑飞了,这时候如果重新用仿真器烧录,再次升级又可以成功,当然第二次也跑飞了
,
Green Deng:
这个就比较奇怪了,我暂时没有什么想法。建议你可以去英文E2E上咨询一下这个问题,英文E2E上应该会有这方面的专家来帮助你解决这个问题:e2e.ti.com/…/171
,
user6441275:
好的,多谢!