OpenEdv-开源电子网

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

关于FreeRTOS使用IAP跳转

[复制链接]

13

主题

296

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2066
金钱
2066
注册时间
2012-5-26
在线时间
291 小时
发表于 2015-12-7 17:07:28 | 显示全部楼层 |阅读模式
5金钱
之前做了一个IAP程序,bootloader使用裸机,APP使用ucos2系统,IAP可以互相跳转
程序如下:

[mw_shl_code=c,true]void iap_load_app(u32 appxaddr) { if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法. { jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址) __set_PSP(*(volatile unsigned int*) appxaddr); //重新设置进程PSP堆栈地址 __set_CONTROL(0); //设置为MSP __set_MSP(*(volatile unsigned int*) appxaddr); //重新设置进程MSP堆栈地址 jump2app(); //跳转到APP. } }[/mw_shl_code]
现在学习FreeRTOS,就把bootloader程序改为了FreeRTOS,但是在jump2app()跳转的时候进入到了HardFault_Handler
尝试在设置堆栈和跳转前,关闭调度器vPortEndScheduler()和挂起调度vTaskSuspendAll()都没有效果。
然后又尝试把所有任务都注释掉,就添加一个任务,就是跳转,然后启用调度,也是不行。
不打开任务和调度,就可以跳转。

感觉是堆栈没设置好,不知道各位有没有试过在FreeRTOS程序跳转或有什么思路?
谢谢!


最佳答案

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

参考我们使用的跳转。 [mw_shl_code=c,true]/* * File : rbl_jump_stm32f2_f4.c.c * This file is part of RT-Thread RTOS * COPYRIGHT (C) 2006 - 2015, RT-Thread Development Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the Lice ...
活着才是王道!健康是一切的前提!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

1041

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3696
金钱
3696
注册时间
2011-5-23
在线时间
2008 小时
发表于 2015-12-7 17:07:29 | 显示全部楼层
参考我们使用的跳转。
[mw_shl_code=c,true]/* * File : rbl_jump_stm32f2_f4.c.c * This file is part of RT-Thread RTOS * COPYRIGHT (C) 2006 - 2015, RT-Thread Development Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * Change Logs: * Date Author Notes * 2014-03-12 aozima first version. * 2015-09-22 aozima disable and clean up all interrupts. */ #include <stdint.h> #include <board.h> void jump_to_app(uint32_t app_address) { typedef void (*_func)(void); __disable_irq(); /* MCU peripherals re-initial. */ { GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_OD; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All; GPIO_InitStruct.GPIO_Pin &= ~(GPIO_Pin_13 | GPIO_Pin_14); /* SWDIO/SWCLK */ GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_Init(GPIOD, &GPIO_InitStruct); GPIO_Init(GPIOE, &GPIO_InitStruct); GPIO_Init(GPIOF, &GPIO_InitStruct); GPIO_Init(GPIOG, &GPIO_InitStruct); GPIO_Init(GPIOH, &GPIO_InitStruct); GPIO_Init(GPIOI, &GPIO_InitStruct); /* reset systick */ SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; /* disable all peripherals clock. */ RCC->AHB1ENR = (1<<20); /* 20: F4 CCMDAT ARAMEN. */ RCC->AHB2ENR = 0; RCC->AHB3ENR = 0; RCC->APB1ENR = 0; RCC->APB2ENR = 0; /* Switch to default cpu clock. */ RCC->CFGR = 0; } /* MCU peripherals re-initial. */ /* Disable MPU */ MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; /* disable and clean up all interrupts. */ { int i; for(i = 0; i < 8; i++) { /* disable interrupts. */ NVIC->ICER = 0xFFFFFFFF; /* clean up interrupts flags. */ NVIC->ICPR = 0xFFFFFFFF; } } /* Set new vector table pointer */ SCB->VTOR = app_address; /* reset register values */ __set_BASEPRI(0); __set_FAULTMASK(0); /* set up MSP and switch to it */ __set_MSP(*(uint32_t*)app_address); __set_PSP(*(uint32_t*)app_address); __set_CONTROL(0); /* ensure what we have done could take effect */ __ISB(); __disable_irq(); /* never return */ ((_func)(*(uint32_t*)(app_address + 4)))(); } [/mw_shl_code]


rbl_jump_stm32f2_f4.c

3.29 KB, 下载次数: 414

RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

13

主题

296

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2066
金钱
2066
注册时间
2012-5-26
在线时间
291 小时
 楼主| 发表于 2015-12-7 17:07:29 | 显示全部楼层
回复【5楼】aozima:
---------------------------------
谢谢!
刚才自己调试解决了,在跳转前加一句关闭所有中断就可以了
看到你的程序也是有关闭中断的语句
之前裸机和ucos2都不用也没问题,看来是原来的程序还不够完善
活着才是王道!健康是一切的前提!
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1863
金钱
1863
注册时间
2011-3-29
在线时间
139 小时
发表于 2015-12-7 17:30:50 | 显示全部楼层
用jtag仿真看看?然后,你那个栈顶地址检查不合法的,至少应该给个死循环吧?
业余程序玩家。
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2015-12-7 19:49:28 | 显示全部楼层
我公司的项目也是用FreeRTOS,前段时间也弄完了IAP在线升级,没发现你所说的问题,我用的单片机是STM32F051,IAP过程比103的复杂一些,需要手动拷贝向量表到SRAM的起始地址并作映射,但这些问题都解决了,祝你好运!
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

13

主题

296

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2066
金钱
2066
注册时间
2012-5-26
在线时间
291 小时
 楼主| 发表于 2015-12-8 08:57:51 | 显示全部楼层
回复【2楼】ofourme:
---------------------------------
栈顶地址检查是合法的,仿真看了一下MSP和PSP寄存器设置的值和裸机都是一样的
活着才是王道!健康是一切的前提!
回复

使用道具 举报

28

主题

91

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2125
金钱
2125
注册时间
2014-11-18
在线时间
215 小时
发表于 2016-5-11 21:35:38 | 显示全部楼层
aozima 发表于 2015-12-7 17:07
参考我们使用的跳转。

[mw_shl_code=c,true]/*

请问,这个从APP跳转到IAP,是怎么弄的?谢谢!
回复

使用道具 举报

33

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
587
金钱
587
注册时间
2015-1-9
在线时间
80 小时
发表于 2016-12-23 11:29:16 | 显示全部楼层
多谢楼上
回复

使用道具 举报

7

主题

333

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1838
金钱
1838
注册时间
2012-7-16
在线时间
504 小时
发表于 2017-1-5 16:54:04 | 显示全部楼层
aozima 发表于 2015-12-7 17:07
参考我们使用的跳转。

[mw_shl_code=c,true]/*

我遇到一个问题跳转APP之前加延时就无法运行,用你这个也是一样。
回复

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2013-9-26
在线时间
10 小时
发表于 2017-1-9 16:35:18 | 显示全部楼层
lison0103 发表于 2015-12-7 17:07
回复【5楼】aozima:
---------------------------------
谢谢!
刚才自己调试解决了,在跳转前加一句关闭所 ...

多谢,我就是这个问题引起的,关了中断就可以了!!谢谢
回复

使用道具 举报

12

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-1-5
在线时间
22 小时
发表于 2017-2-12 21:48:48 | 显示全部楼层
学习了,多谢
天道酬勤
回复

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2015-11-12
在线时间
29 小时
发表于 2017-2-21 13:44:36 | 显示全部楼层
为什么我的IAP 裸机, APP UCOS2跳转不行呢?该如何调试?
回复

使用道具 举报

12

主题

241

帖子

0

精华

高级会员

Rank: 4

积分
806
金钱
806
注册时间
2017-8-17
在线时间
159 小时
发表于 2017-9-22 11:39:03 | 显示全部楼层
好东西,解决问题了,收藏
回复

使用道具 举报

2

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
225
金钱
225
注册时间
2016-10-5
在线时间
48 小时
发表于 2017-11-6 15:24:10 | 显示全部楼层
你那iap用裸程序,app用ucosii可以相互跳转的工程文件能上传一份吗
回复

使用道具 举报

12

主题

241

帖子

0

精华

高级会员

Rank: 4

积分
806
金钱
806
注册时间
2017-8-17
在线时间
159 小时
发表于 2017-11-7 11:33:13 | 显示全部楼层
woshiwofei 发表于 2017-11-6 15:24
你那iap用裸程序,app用ucosii可以相互跳转的工程文件能上传一份吗

关键在于跳转前关闭并清除已用到的中断就可以相互跳转了
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2019-2-21
在线时间
7 小时
发表于 2019-7-3 22:38:39 | 显示全部楼层
aozima 发表于 2015-12-7 17:07
参考我们使用的跳转。

[mw_shl_code=c,true]/*

多谢!!!我的BootLoader程序和app程序都是freeRTOS的,按照裸机的方法也是跳转不成功,参考你的代码,搞定了
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2018-8-19
在线时间
11 小时
发表于 2019-10-17 17:54:40 | 显示全部楼层
附件无法下载 Snipaste_2019-10-17_17-53-24.png
回复

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1694
金钱
1694
注册时间
2012-5-10
在线时间
437 小时
发表于 2019-10-24 10:03:54 | 显示全部楼层
FreeRTOS 发表于 2015-12-7 19:49
我公司的项目也是用FreeRTOS,前段时间也弄完了IAP在线升级,没发现你所说的问题,我用的单片机是STM32F051 ...

freertos的iap,使用hal库确实要关闭中断,标准库我还没试过
如有技术问题,微信扫头像交流,STM32,JAVA,服务器
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-12-31
在线时间
9 小时
发表于 2020-1-6 17:39:28 | 显示全部楼层

,收藏
回复

使用道具 举报

0

主题

19

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-1-29
在线时间
5 小时
发表于 2020-6-5 17:09:14 | 显示全部楼层
aozima 发表于 2015-12-7 17:07
参考我们使用的跳转。

[mw_shl_code=c,true]/*

读写大神指导。。。时隔多年,还是有效的
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-9-29
在线时间
16 小时
发表于 2020-10-19 23:06:57 | 显示全部楼层
立个flag,后续再来研究
回复

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2020-6-27
在线时间
14 小时
发表于 2020-12-28 10:54:52 | 显示全部楼层
aozima 发表于 2015-12-7 17:07
参考我们使用的跳转。

[mw_shl_code=c,true]/*

谢谢,谢谢
回复

使用道具 举报

1

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2020-7-3
在线时间
48 小时
发表于 2021-2-23 15:21:01 | 显示全部楼层
学习一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 16:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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