OpenEdv-开源电子网

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

请问stm32做IAP升级时RAM区可以重叠吗?

[复制链接]

2

主题

9

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2017-2-13
在线时间
6 小时
发表于 2017-2-13 17:23:17 | 显示全部楼层 |阅读模式
1金钱
    因为做以太网升级,所以需要用到的RAM比较大,我现在 bootloader程序和app程序用的ram区是一样的(完全重叠),程序基本能够正常运行,但是有时候在做内存比较时就出问题了,明明相同的数据比较结果却不一样,比较的变量一个是局部的一个是全局的,后来把那个全局的定义成局部的就没问题了。根据这个情况所以想在此确认下  RAM区可以重叠吗?最好可以详细分析下。谢谢了

最佳答案

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

可以重叠,不过在APP代码里面,先对RAM全部清零,再做其他工作
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165558
金钱
165558
注册时间
2010-12-1
在线时间
2118 小时
发表于 2017-2-13 17:23:18 | 显示全部楼层
可以重叠,不过在APP代码里面,先对RAM全部清零,再做其他工作
回复

使用道具 举报

头像被屏蔽

227

主题

293

帖子

0

精华

禁止发言

积分
1006
金钱
1006
注册时间
2012-2-9
在线时间
69 小时
发表于 2017-2-13 18:14:39 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2017-2-13 18:15:08 | 显示全部楼层
你的思路不对。IAP升级的话,如果你ROM够大的话,是完全可以预留第二个工作程序的内存的,完全可以一边下一边写进去flash,对ram的需求不高,当然,系统的实时性会收到影响,看需求衡量。
至于你说的问题,如果你app程序还要根据需要返回到 bootloader运行的话,就别共用ram,毕竟 bootloader一般对ram需求很低,基本可以大胆的减少 bootloader程序的栈大小
回复

使用道具 举报

4

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2015-3-9
在线时间
9 小时
发表于 2017-2-14 01:01:21 | 显示全部楼层
一个是引导程序,一个是app程序,其实在stm32上引导程序本质上还是一段应用程序而已,我不明白你怎么比较,因为当引导程序运行得时候,对RAM的操作是独占得,当引导程序跳转应用程序后,应用程序对RAM也是独占的,你比较什么?
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2017-2-14 08:40:26 | 显示全部楼层
我的工程boot与API不对开始16字节初始化,这样多个工程就可以共享ram中的内容。以下是我API跳转到boot并进入升级的方式。
// API go to Boot
#include "absacc.h"
u32 BootFlag __at(0x20000000);
#define BOOTFLAG 0XA5A5A5A5

GLOBAL void JumpToBootLoader(void)
{
        NVIC_SETPRIMASK();          //关闭总中断  
        BootFlag = BOOTFLAG;
        Stm32f103Reset();
}




boot部分对BootFlag进行判断。
QQ截图20170214083550.jpg
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2017-2-13
在线时间
6 小时
 楼主| 发表于 2017-2-14 10:54:02 | 显示全部楼层
dengxiaojun12 发表于 2017-2-13 18:14
全局变量在堆中,局部变量在栈中,怎么一样的?

全局变量a[]={0x11,0x22,0x33};
局部变量b[]={0x11,0x22,0x33};
如果用 memcmp(a,b,sizeof(a));比较是相等的吧。
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2017-2-13
在线时间
6 小时
 楼主| 发表于 2017-2-14 10:56:38 | 显示全部楼层
憨厚诚实大叔 发表于 2017-2-13 18:15
你的思路不对。IAP升级的话,如果你ROM够大的话,是完全可以预留第二个工作程序的内存的,完全可以一边下一 ...

ROM有分区啊,下载升级没问题,就是用一个包256字节来下载的。  现在是问 RAM是否需要分区,lwip占用的RAM还是比较大的。
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2017-2-13
在线时间
6 小时
 楼主| 发表于 2017-2-14 10:58:26 | 显示全部楼层
tuy0326 发表于 2017-2-14 01:01
一个是引导程序,一个是app程序,其实在stm32上引导程序本质上还是一段应用程序而已,我不明白你怎么比较, ...

比较是在APP程序里比较两个数组,用memcmp();只是这个全局变量在bootloader程序中也有定义,而且一模一样。
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2017-2-14 11:55:27 | 显示全部楼层
AngryCat 发表于 2017-2-14 10:58
比较是在APP程序里比较两个数组,用memcmp();只是这个全局变量在bootloader程序中也有定义,而且一模一样 ...

2个不同工程定义的全局变量,即使名字一样,他们在RAM的位置基本是不一样的。如果有标记需要让APP和bootloader都要读取的话,需要用内部ROM或者外挂设备
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2017-2-13
在线时间
6 小时
 楼主| 发表于 2017-2-14 14:16:49 | 显示全部楼层
憨厚诚实大叔 发表于 2017-2-14 11:55
2个不同工程定义的全局变量,即使名字一样,他们在RAM的位置基本是不一样的。如果有标记需要让APP和bootl ...

标记我用eeprom,我就是怕它两个定义一样会有干扰,毕竟我的ram区是完全重叠的。   不知道跳转过程中会不会把ram重新初始化。
回复

使用道具 举报

21

主题

387

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1043
金钱
1043
注册时间
2016-9-8
在线时间
213 小时
发表于 2017-2-14 15:16:05 | 显示全部楼层
shop60994719.taobao.com
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-24 07:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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