OpenEdv-开源电子网

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

IAP升级中 在APP程序中定义大数组对升级有什么影响???

[复制链接]

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
917
金钱
917
注册时间
2018-7-18
在线时间
384 小时
发表于 2021-4-12 11:28:08 | 显示全部楼层 |阅读模式
10金钱
问题是这样一种情况 :
         APP升级的程序中定义了一个超大数组 然后IAP就跳转失败了数组大概100K   然后我把数组减小了 50K  跳转成功了  但是跳转过来在main函数中初始化外设的时候就硬错误中断了    再把数组减小到10K的时候  就能正常运行  
想问一下为什么会这样 单片机F429 RAM有256K  应该是足够的!!!

最佳答案

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

你的定义数组的地址可能不符合中断向量表偏移地址的设置要求,因为你的数组是编译器分配的,而中断向量表要求偏移地址必须是0x200整数倍。推荐你使用__attribute__((at(addr)))去设置数组地址。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1827
金钱
1827
注册时间
2019-7-23
在线时间
282 小时
发表于 2021-4-12 11:28:09 | 显示全部楼层
你的定义数组的地址可能不符合中断向量表偏移地址的设置要求,因为你的数组是编译器分配的,而中断向量表要求偏移地址必须是0x200整数倍。推荐你使用__attribute__((at(addr)))去设置数组地址。
回复

使用道具 举报

5

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1827
金钱
1827
注册时间
2019-7-23
在线时间
282 小时
发表于 2021-4-12 14:38:23 | 显示全部楼层
有没有重新设置中断向量表偏移地址,APP有没有改成对应的地址,是否使用了操作系统
回复

使用道具 举报

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
917
金钱
917
注册时间
2018-7-18
在线时间
384 小时
 楼主| 发表于 2021-4-12 17:12:02 | 显示全部楼层
tw1157727586 发表于 2021-4-12 14:38
有没有重新设置中断向量表偏移地址,APP有没有改成对应的地址,是否使用了操作系统

中断向量表偏移设置了 APP也改了对应的地址 数组空间改小之后 程序能正常跳转的
使用了操作系统 FreeRTOS
回复

使用道具 举报

5

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1827
金钱
1827
注册时间
2019-7-23
在线时间
282 小时
发表于 2021-4-13 09:00:42 | 显示全部楼层
操作系统下线程使用的PSP,中断是MSP   无操作系统下 中断和应用都使用MSP。 所以你需要设置PSP才行。不然会出问题
回复

使用道具 举报

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
917
金钱
917
注册时间
2018-7-18
在线时间
384 小时
 楼主| 发表于 2021-4-13 13:38:39 | 显示全部楼层
tw1157727586 发表于 2021-4-13 09:00
操作系统下线程使用的PSP,中断是MSP   无操作系统下 中断和应用都使用MSP。 所以你需要设置PSP才行。不然 ...


非常感谢!!!

if (((*(__IO uint32_t*)APPLICATIONADDRESS) & 0x2FFE0000 ) == 0x20000000)
        {
                /* Jump to user application */
                JumpAddress = *(__IO uint32_t*) (APPLICATIONADDRESS + 4);
                Jump_To_Application = (pFunction) JumpAddress;
                /* Initialize user application's Stack Pointer */
                __set_PSP(*(__IO uint32_t*) APPLICATIONADDRESS);
                __set_CONTROL(0);
                __set_MSP(*(__IO uint32_t*) APPLICATIONADDRESS);
                HAL_Delay(10);        
                Jump_To_Application();
        }        


我的跳转程序是这样写的  有没有什么问题呢?
回复

使用道具 举报

5

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1827
金钱
1827
注册时间
2019-7-23
在线时间
282 小时
发表于 2021-4-14 09:15:50 | 显示全部楼层
你的跳转缺少初始化APP的堆栈指针。不重新初始化会造成你的程序运行逻辑混乱,导致出问题
回复

使用道具 举报

5

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1827
金钱
1827
注册时间
2019-7-23
在线时间
282 小时
发表于 2021-4-14 09:17:07 | 显示全部楼层
你的跳转缺少初始化APP的堆栈指针。不重新初始化会造成你的程序运行逻辑混乱,导致出问题
回复

使用道具 举报

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
917
金钱
917
注册时间
2018-7-18
在线时间
384 小时
 楼主| 发表于 2021-4-14 09:23:01 | 显示全部楼层
tw1157727586 发表于 2021-4-14 09:10
你的定义数组的地址可能不符合中断向量表偏移地址的设置要求,因为你的数组是编译器分配的,而中断向量表要 ...

这个没怎么理解 中断向量表设置的是FLASH,数组是RAM中的 它们怎么会有关联呢
回复

使用道具 举报

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
917
金钱
917
注册时间
2018-7-18
在线时间
384 小时
 楼主| 发表于 2021-4-14 09:24:45 | 显示全部楼层
tw1157727586 发表于 2021-4-14 09:15
你的跳转缺少初始化APP的堆栈指针。不重新初始化会造成你的程序运行逻辑混乱,导致出问题

我看一些其他说的 __set_PSP 是初始化的APP的堆栈指针的   是我理解错了吗
请问 APP得到堆栈指针应该怎么初始化呢?
谢谢!!!
回复

使用道具 举报

5

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1827
金钱
1827
注册时间
2019-7-23
在线时间
282 小时
发表于 2021-4-14 09:37:06 | 显示全部楼层
wwhh 发表于 2021-4-14 09:23
这个没怎么理解 中断向量表设置的是FLASH,数组是RAM中的 它们怎么会有关联呢

这个是中断偏移寄存器要求的,和你使用flash还是ram是没的关系的
享受技术
回复

使用道具 举报

5

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1827
金钱
1827
注册时间
2019-7-23
在线时间
282 小时
发表于 2021-4-14 09:37:40 | 显示全部楼层
wwhh 发表于 2021-4-14 09:24
我看一些其他说的 __set_PSP 是初始化的APP的堆栈指针的   是我理解错了吗
请问 APP得到堆栈指针应该怎 ...

参考原子代码
享受技术
回复

使用道具 举报

5

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1827
金钱
1827
注册时间
2019-7-23
在线时间
282 小时
发表于 2021-4-14 09:43:16 | 显示全部楼层
wwhh 发表于 2021-4-13 13:38
非常感谢!!!

if (((*(__IO uint32_t*)APPLICATIONADDRESS) & 0x2FFE0000 ) == 0x20000000)

仔细看了一下,没什么大问题
享受技术
回复

使用道具 举报

5

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1827
金钱
1827
注册时间
2019-7-23
在线时间
282 小时
发表于 2021-4-14 09:45:10 | 显示全部楼层
你要确保你写入的程序数据绝对正确,如果中间出错了,你的程序也可能发生未知错误
回复

使用道具 举报

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
917
金钱
917
注册时间
2018-7-18
在线时间
384 小时
 楼主| 发表于 2021-4-14 11:09:28 | 显示全部楼层
tw1157727586 发表于 2021-4-14 09:45
你要确保你写入的程序数据绝对正确,如果中间出错了,你的程序也可能发生未知错误

程序应该是没有什么问题的   我只要把数组改小就能运行  改大就不行
回复

使用道具 举报

5

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1827
金钱
1827
注册时间
2019-7-23
在线时间
282 小时
发表于 2021-4-14 13:09:22 | 显示全部楼层
wwhh 发表于 2021-4-14 11:09
程序应该是没有什么问题的   我只要把数组改小就能运行  改大就不行

我说的是你单片机接收的数据数据对不对,有没有错误检查什么的。
享受技术
回复

使用道具 举报

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
917
金钱
917
注册时间
2018-7-18
在线时间
384 小时
 楼主| 发表于 2021-4-14 14:49:11 | 显示全部楼层
tw1157727586 发表于 2021-4-14 13:09
我说的是你单片机接收的数据数据对不对,有没有错误检查什么的。

程序现在是通过STLINK下载至单片机的     不是接收的
回复

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12995
金钱
12995
注册时间
2012-11-26
在线时间
3790 小时
发表于 2021-4-14 14:55:12 | 显示全部楼层
wwhh 发表于 2021-4-14 14:49
程序现在是通过STLINK下载至单片机的     不是接收的

直接单独直接调试app试试,看直接调试时会不会出问题,要是也出问题,那就是app本身就有问题。如果调试时没问题,那就是iap哪个过程中出了问题。先确定下app能不能单独运行
学无止境
回复

使用道具 举报

12

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
917
金钱
917
注册时间
2018-7-18
在线时间
384 小时
 楼主| 发表于 2021-4-14 14:58:41 | 显示全部楼层
jermy_z 发表于 2021-4-14 14:55
直接单独直接调试app试试,看直接调试时会不会出问题,要是也出问题,那就是app本身就有问题。如果调试时 ...

APP单独是可以运行的   已经运行过很长时间的了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 03:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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