OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7908|回复: 13

在UCOSII中使用IAP跳转时出现问题,请大神指教,实在没头绪了

[复制链接]

10

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2013-12-3
在线时间
83 小时
发表于 2016-5-7 00:54:41 | 显示全部楼层 |阅读模式
10金钱
void iap_jump(u32 iapxaddr)
{
        if(((*(vu32*)iapxaddr)&0x2FFE0000)==0x20000000)        //检查栈顶地址是否合法.0x20000000是sram的起始地址,也是程序的栈顶地址
        {
                u3_printf("ok\r\n");
                delay_ms(10);
                jump2iap=(iapfun)*(vu32*)(iapxaddr+4);                //用户代码区第二个字为程序开始地址(复位地址)               
                MSR_MSP(*(vu32*)iapxaddr);                                        //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
                (*jump2iap)();                                                                        //跳转到APP.
        }
}
如上  这是IAP跳转程序  跳转的地址是0x08000000
裸机实验可以正常跳转,就是IAP可跳到APP,APP可以到IAP程序,但在UCOS中触发这个跳转函数时出问题,无法跳到正常地址
查阅多方资料,我觉得可能需要关闭所有中断,但找了几个方法来关闭中断都不行,没头绪了,,求各路大神指点啊


最佳答案

查看完整内容[请看2#楼]

如果是从APP跳转到BL,跳转之前关闭所有中断,记得开了哪些中断就关闭哪些中断,不要遗漏了,另外ucos使用了systick的中断,这个也要记得关闭,然后 如果是从BL跳转到APP,同样需要逐个关闭BL中使用的中断,同时还要在APP中做向量偏移 当然,如果逐个关闭太麻烦,有一个关闭总中断的函数 __set_FAULTMASK(1); 这个函数会将总中断关闭掉,然后跳转成功后再开启总中断 __set_FAULTMASK(0); 当然这样也是有弊端的,那就是虽然能 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

64

帖子

3

精华

高级会员

Rank: 4

积分
768
金钱
768
注册时间
2014-3-11
在线时间
55 小时
发表于 2016-5-7 00:54:42 | 显示全部楼层
如果是从APP跳转到BL,跳转之前关闭所有中断,记得开了哪些中断就关闭哪些中断,不要遗漏了,另外ucos使用了systick的中断,这个也要记得关闭,然后
如果是从BL跳转到APP,同样需要逐个关闭BL中使用的中断,同时还要在APP中做向量偏移
当然,如果逐个关闭太麻烦,有一个关闭总中断的函数
__set_FAULTMASK(1);
这个函数会将总中断关闭掉,然后跳转成功后再开启总中断
__set_FAULTMASK(0);
当然这样也是有弊端的,那就是虽然能够成功跳转,但是中断的开关会相互干扰,比如我在BL中开启了TIM2的中断,那么跳转到APP后,当打开总中断后TIM2同样是开启状态的,但是如果APP中,没有使用TIM2的中断,即没有TIM2对应的处理函数,那么此时就是出现HardFault_Handler

所以我通常的处理方法是这样的
1、从BL跳转到APP时,由于BL中开启的中断比较少,可能也就USART,顶多再加一个TIM,逐个关闭即可,当然为了保险我也会将总中断关闭掉,然后跳转到APP,在APP中将总中断打开
2、从APP跳转到BL时,由于APP中开启的中断太多了,逐个关闭太麻烦,而且如果后面又另外开启了其他中断,还要做调整,所以就通过直接通过软件复位来变相实现,因为BL一般都会放到0x08000000处,复位后stm32也会直接从这个地方启动,所以变相实现了跳转。
回复

使用道具 举报

10

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2013-12-3
在线时间
83 小时
 楼主| 发表于 2016-5-7 17:03:10 | 显示全部楼层
自己顶   有大神来看看咯  
汇报下最新进展
目前自己用了一个取巧的办法来跳转到IAP程序,就是使用软复位的方法,直接从0x08000000开始,预设的功能都能达到了
但此方法毕竟有不妥的地方 还请经历过的大神们来指点下
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-5-7 17:53:12 | 显示全部楼层
要不要先__disable_irq();
再改中断向量表偏移,
最后__enable_irq();
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

10

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2013-12-3
在线时间
83 小时
 楼主| 发表于 2016-5-7 20:21:02 | 显示全部楼层
xkwy 发表于 2016-5-7 17:53
要不要先__disable_irq();
再改中断向量表偏移,
最后__enable_irq();

试过了  不行,  试了好几种关中断的方法  都不行, 茫然状):
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2015-9-16
在线时间
39 小时
发表于 2016-12-21 18:13:49 | 显示全部楼层
yy21910115 发表于 2016-5-7 20:21
试过了  不行,  试了好几种关中断的方法  都不行, 茫然状):

同问。搞不定,IAP升级之后跳转APP  ,程序进不了中断
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2015-6-11
在线时间
313 小时
发表于 2016-12-22 09:29:34 | 显示全部楼层
swallow_sw 发表于 2016-12-21 18:13
同问。搞不定,IAP升级之后跳转APP  ,程序进不了中断

ucos在线程里面调用的是进程堆栈指针PSP, 你在MSP后面添加:
__set_PSP(*(vu32*)iapxaddr);在看看
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2015-9-16
在线时间
39 小时
发表于 2016-12-22 14:59:19 | 显示全部楼层
zc123 发表于 2016-12-22 09:29
ucos在线程里面调用的是进程堆栈指针PSP, 你在MSP后面添加:
__set_PSP(*(vu32*)iapxaddr);在看看

试了也不行,IAP升级之后程序跳转成功但是还是进不了中断
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2015-9-16
在线时间
39 小时
发表于 2016-12-22 20:12:20 | 显示全部楼层
秋之前 发表于 2016-12-22 16:51
如果是从APP跳转到BL,跳转之前关闭所有中断,记得开了哪些中断就关闭哪些中断,不要遗漏了,另外ucos使用 ...

感谢大神,你的方法是凑效的,BL转APP时,逐个关闭BL中使用的中断,然后就可以了,谢谢。这个问题查了好几天了,你说的够详细
回复

使用道具 举报

6

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2016-11-16
在线时间
44 小时
发表于 2017-1-3 17:16:33 | 显示全部楼层
我也试一试
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2017-9-19
在线时间
34 小时
发表于 2017-11-3 18:30:59 | 显示全部楼层
秋之前 发表于 2016-5-7 00:54
如果是从APP跳转到BL,跳转之前关闭所有中断,记得开了哪些中断就关闭哪些中断,不要遗漏了,另外ucos使用 ...

大神,佩服!  按照你说的方法,终于解决了升级ucos的问题。
大牛就是大牛!
回复

使用道具 举报

2

主题

18

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2016-10-5
在线时间
50 小时
发表于 2017-11-6 14:47:05 | 显示全部楼层
能上传一下解决后的工程文件吗  小白智能做伸手党拉
回复

使用道具 举报

15

主题

109

帖子

0

精华

高级会员

Rank: 4

积分
826
金钱
826
注册时间
2016-6-28
在线时间
160 小时
发表于 2017-11-24 11:17:19 | 显示全部楼层
你好,我现在遇到的一个问题。LPC1765的芯片IAP升级带UCOS系统的APP,APP程序已经写入了指定的位置,也能跳转成功。但跳转后直接重启。(带有独立看门狗),跳转前有关闭中断,目前没法单步调试。请个大神指教
回复

使用道具 举报

17

主题

170

帖子

0

精华

高级会员

Rank: 4

积分
562
金钱
562
注册时间
2018-7-8
在线时间
118 小时
发表于 2020-7-16 11:00:11 | 显示全部楼层
秋之前 发表于 2016-5-7 00:54
如果是从APP跳转到BL,跳转之前关闭所有中断,记得开了哪些中断就关闭哪些中断,不要遗漏了,另外ucos使用 ...

谢谢分享~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-29 20:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表