OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 3700|回复: 15

关于FreeRTOS使用IAP跳转

[复制链接]

  离线 

13

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

[C] 纯文本查看 复制代码
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.
}
}
现在学习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 ...
活着才是王道!健康是一切的前提!
回复

使用道具 举报

  离线 

8

主题

689

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1669
金钱
1669
注册时间
2011-5-23
在线时间
713 小时
发表于 2015-12-7 17:07:29 | 显示全部楼层
参考我们使用的跳转。
[C] 纯文本查看 复制代码
/*
 * 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[i] = 0xFFFFFFFF;

            /* clean up interrupts flags. */
            NVIC->ICPR[i] = 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)))();
}


rbl_jump_stm32f2_f4.c

3.29 KB, 下载次数: 193

回复

使用道具 举报

  离线 

13

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

  离线 

34

主题

804

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

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

使用道具 举报

  离线 

23

主题

649

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
2975
金钱
2975
注册时间
2015-11-5
在线时间
944 小时
发表于 2015-12-7 19:49:28 | 显示全部楼层
我公司的项目也是用FreeRTOS,前段时间也弄完了IAP在线升级,没发现你所说的问题,我用的单片机是STM32F051,IAP过程比103的复杂一些,需要手动拷贝向量表到SRAM的起始地址并作映射,但这些问题都解决了,祝你好运!
生活不只有眼前的苟且,还有你看不懂的诗和永远到不了的远方!
回复

使用道具 举报

  离线 

13

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

  离线 

27

主题

87

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

[mw_shl_code=c,true]/*

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

使用道具 举报

  离线 

30

主题

185

帖子

0

精华

高级会员

Rank: 4

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

使用道具 举报

  离线 

5

主题

295

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

[mw_shl_code=c,true]/*

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

使用道具 举报

  离线 

0

主题

12

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

  离线 

12

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

  离线 

1

主题

4

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  离线 

2

主题

1029

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2950
金钱
2950
注册时间
2015-1-15
在线时间
489 小时
发表于 2017-3-3 15:53:02 | 显示全部楼层
BOOTLOADER也使用RTOS,FLASH空间很充裕啊
一分耕耘一分收获。
回复

使用道具 举报

  离线 

1

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

  离线 

1

主题

7

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

  离线 

1

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

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

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-24 06:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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