打印

IAP串口升级问题求助,APP跳转Boot怎么释放RAM资源?

[复制链接]
2317|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xingnaipeng|  楼主 | 2018-5-11 18:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
搞了好久,快崩溃了。
求助大家,
MSP430在做串口升级。分为Boot和APP两块。Boot升级成功。
APP运行成功。
但是从APP跳转回Boot进行二次升级失败。经检查,APP跳转回Boot时,二次升级造成RAM越界之类的问题导致意外复位。

故现在需要APP跳转回Boot后,做出释放RAM的资源之类的操作。

注:目前APP跳转回Boot后,会擦除APP的Flash。

相关帖子

沙发
zxq6| | 2018-5-11 21:26 | 只看该作者
跳转后,相当于复位了一次芯片,不是把所有的资源都释放的么?

使用特权

评论回复
板凳
dirtwillfly| | 2018-5-12 14:16 | 只看该作者
我估计跳转程序有问题,或者是中断向量有问题,等情况

使用特权

评论回复
地板
xingnaipeng|  楼主 | 2018-5-14 08:57 | 只看该作者
zxq6 发表于 2018-5-11 21:26
跳转后,相当于复位了一次芯片,不是把所有的资源都释放的么?

但是,硬件复位或者断电复位是正常的。说明软复位没有释放。
我用的复位方法是:asm("mov &0xFFFE, PC;");

使用特权

评论回复
5
xingnaipeng|  楼主 | 2018-5-14 08:58 | 只看该作者
dirtwillfly 发表于 2018-5-12 14:16
我估计跳转程序有问题,或者是中断向量有问题,等情况

我用的跳转方法是:asm("mov &0xFFFE, PC;");
//-----------------------------------------------------------------
// -- 中断向量表重新影射
//-----------------------------------------------------------------
#pragma vector=0*2u
__interrupt void DAC_ISR(void)
{
  asm(" br &0xF7E0;");
}
#pragma vector=1*2u
__interrupt void PORT2_ISR(void)
{
  asm(" br &0xF7E2;");
}
#pragma vector=2*2u
__interrupt void USART1TX_ISR(void)
{
  asm(" br &0xF7E4;");
}

#pragma vector=2*3u
__interrupt void USART1RX_ISR(void)
{
  asm(" br &0xF7E6;");
}


#pragma vector=2*4u
__interrupt void PORT1_ISR(void)
{
  asm(" br &0xF7E8;");
}

#pragma vector=2*5u
__interrupt void TIMERA1_ISR(void)
{
  asm(" br &0xF7EA;");  
}

#pragma vector=2*6u
__interrupt void TIMERA0_ISR(void)
{
  asm(" br &0xF7EC;");
}

#pragma vector=2*7u
__interrupt void ADC12_ISR(void)
{
  asm(" br &0xF7EE;");
}

#pragma vector=2*8u
__interrupt void USART0TX_ISR(void)
{
  asm(" br &0xF7F0;");
}

#pragma vector=2*9u
__interrupt void USART0RX_ISR(void)
{
  asm(" br &0xF7F2;");
}

#pragma vector=2*10u
__interrupt void WDT_ISR(void)
{
  asm(" br &0xF7F4;");
}

#pragma vector=2*11u
__interrupt void COMPARATORA_ISR(void)
{
  asm(" br &0xF7F6;");
}

#pragma vector=2*12u
__interrupt void TIMERB1_ISR(void)
{
  asm(" br &0xF7F8;");
}

#pragma vector=2*13u
__interrupt void TIMERB0_ISR(void)
{
  asm(" br &0xF7FA;");
}

#pragma vector=2*14u
__interrupt void NMI_ISR(void)
{
  asm(" br &0xF7FC;");
}

使用特权

评论回复
6
dirtwillfly| | 2018-5-14 10:57 | 只看该作者
xingnaipeng 发表于 2018-5-14 08:58
我用的跳转方法是:asm("mov &0xFFFE, PC;");
//---------------------------------------------------- ...

你用的什么型号的msp430?

使用特权

评论回复
7
xingnaipeng|  楼主 | 2018-5-14 11:45 | 只看该作者
dirtwillfly 发表于 2018-5-14 10:57
你用的什么型号的msp430?

F449

使用特权

评论回复
8
dirtwillfly| | 2018-5-14 13:57 | 只看该作者
9
xingnaipeng|  楼主 | 2018-5-14 15:48 | 只看该作者
搞定了,是APP的问题。

使用特权

评论回复
评论
dirtwillfly 2018-5-14 16:03 回复TA
感谢分享 
10
xingnaipeng|  楼主 | 2018-5-14 15:50 | 只看该作者
dirtwillfly 发表于 2018-5-14 13:57
参考https://bbs.21ic.com/icview-2492646-1-1.html?ordertype=1

谢谢.
一开始就是参照这个进行的,只是每次只能升级成功一次,在不断电复位的情况下,第二次升级总是会失败。

使用特权

评论回复
11
xingnaipeng|  楼主 | 2018-5-14 16:23 | 只看该作者
dirtwillfly 发表于 2018-5-12 14:16
我估计跳转程序有问题,或者是中断向量有问题,等情况

排查了好久,不断的替换。(因为APP比较大,波特率设的比较低,测试一次要10来分钟)。
最终确认了问题。
详情:
APP中有一些中断,Boot重新映射了中断。
从APP跳转回Boot进行升级时,虽然通过_DINT();来关闭总中断,然后那些在APP中的中断是重新中断映射的,所以,_DINT()对APP中的中断无效。修改为:将APP跳转回Boot进行升级时,一个一个的将所有打开的中断单独来关闭,则解决问题。
那么问题来了,APP中一些操作需要关闭总中断的命令,应该怎么办呢。

使用特权

评论回复
12
xingnaipeng|  楼主 | 2018-5-14 16:29 | 只看该作者
xingnaipeng 发表于 2018-5-14 16:23
排查了好久,不断的替换。(因为APP比较大,波特率设的比较低,测试一次要10来分钟)。
最终确认了问题。 ...

也不对啊。从APP跳转回Boot,首先会把APP的Flash擦除,APP不运行了,则APP中的所有中断也无效了。为何会有这样的问题。

使用特权

评论回复
13
chuntian2016| | 2018-5-15 18:29 | 只看该作者
这个利用boot的进行升级的还是挺复杂的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

35

帖子

1

粉丝