硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5880|回复: 7
收起左侧

[FreeRTOS] 使用IAP跳转到指定地址失败

[复制链接]

2

主题

34

回帖

40

积分

新手上路

积分
40
发表于 2016-8-11 16:41:50 | 显示全部楼层 |阅读模式
使用下面这段代码时,会出错,而且只有使用FreeRTOS时才会失败,UCOS-III使用下面这段代码不会有问题

#define APP_START_ADDR (uint32_t)0x08010200
            JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
            Jump_To_Application = (pFunction) JumpAddress;
            __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
            printf("\n\rJump_To_Application~\n\r");
            Jump_To_Application();

在FreeRTOS的用户段程序中,向量表也是对的,
#define VECT_TAB_OFFSET  0x10200
Snap2.jpg



在跟踪代码调试时,发现在还没跑到主的main函数之前,初始化ZIDATA的时候会莫名其妙的跳转到xPortSysTickHandler函数中,如下call stack,这是什么原因?谢谢!
Snap3.jpg
回复

使用道具 举报

2

主题

34

回帖

40

积分

新手上路

积分
40
 楼主| 发表于 2016-8-11 16:44:36 | 显示全部楼层
顺便说一下,如果不是用跳转的形式执行程序,是没问题的,也就是把bootloader去掉,应用程序的起始地址为0x08000000 ,就是没问题的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2016-8-11 17:37:55 | 显示全部楼层
boot代码是裸机实现的吗。而app是freertos,是这个意思不。
回复

使用道具 举报

2

主题

34

回帖

40

积分

新手上路

积分
40
 楼主| 发表于 2016-8-12 08:56:33 | 显示全部楼层
是的,bootloader是裸机,app是freertos。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2016-8-12 11:13:28 | 显示全部楼层

回 michael001 的帖子

michael001:是的,bootloader是裸机,app是freertos。 (2016-08-12 08:56) 
根据你前面的调试说明,应该是你在boot代码里面开启滴答定时器中断了,导致进入到app后进入到app代码设置的滴答定时器中断里面,你试试在跳转前,关闭全局中断试试。

下面这些代码之前加入关闭全局中断
         JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
            Jump_To_Application = (pFunction) JumpAddress;
            __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
            printf("\\n\\rJump_To_Application~\\n\\r");
            Jump_To_Application();
回复

使用道具 举报

2

主题

34

回帖

40

积分

新手上路

积分
40
 楼主| 发表于 2016-8-12 11:47:57 | 显示全部楼层
哦,好的,我试试看
回复

使用道具 举报

2

主题

34

回帖

40

积分

新手上路

积分
40
 楼主| 发表于 2016-8-12 12:00:36 | 显示全部楼层

回 eric2013 的帖子

eric2013:根据你前面的调试说明,应该是你在boot代码里面开启滴答定时器中断了,导致进入到app后进入到app代码设置的滴答定时器中断里面,你试试在跳转前,关闭全局中断试试。

下面这些代码之前加入关闭全局中断
         JumpAddress = *(__IO  .. (2016-08-12 11:13) 
好了,果然是在bootloader中开启了滴答定时器导致的,谢谢硬汉的支持!
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
发表于 2018-4-20 22:35:51 | 显示全部楼层
eric2013 发表于 2016-8-12 11:13
根据你前面的调试说明,应该是你在boot代码里面开启滴答定时器中断了,导致进入到app后进入到app代码设置 ...

虽然本贴的楼主在BOOT LOADER中关闭了系统滴答,跳转到APP中才成功。
但我这边不是这样子的。BOOT中系统滴答中断开启的,可以跳转到FREE RTOS的APP中。
如果APP1或APP2都使用或一个使用FREE RTOS,APP1和APP2之间跳转不成功。
如果BOOT LOADER也用FREE RTOS,那跳转到APP(用或不用FREE RTOS)中,都会进错误中断。
跳转之前,关闭所有中断,清除所有中断都不行。
从FREE RTOS跳转到裸机的APP中,一执行完系统滴答,就进错误中断。
以前,全用裸机,几个APP之间想怎么跳转就怎么跳转。
回复

使用道具 举报

73

主题

1198

回帖

1417

积分

至尊会员

积分
1417
发表于 2019-11-11 11:09:10
eric2013 发表于 2016-8-12 11:13
根据你前面的调试说明,应该是你在boot代码里面开启滴答定时器中断了,导致进入到app后进入到app代码设置 ...

谢谢指点,我也学到了

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-13 03:41 , Processed in 0.225510 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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