搜索
bottom↓
回复: 14

请教:在IAP程序中定义的内存(全局变量或者静态变量),在APP程序中该内存会被释放嘛?

[复制链接]

出0入0汤圆

发表于 2020-6-17 17:19:48 | 显示全部楼层 |阅读模式
本帖最后由 擦鞋匠 于 2020-6-17 17:47 编辑

我在做Bootloader(程序升级)遇到如下问题:
在IAP程序中定义的内存(全局变量或者静态变量),在APP程序中该内存会被释放嘛?为什么?
不吝赐教,不胜感激!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入54汤圆

发表于 2020-6-17 17:38:17 | 显示全部楼层
全局变量不叫申请,应该叫定义吧。
全部变量在链接阶段会直接分配个固定地址的,对全局变量的访问就是访问该地址的RAM。

不知道你说的APP程序中释放是什么意思。你是要做bootloader升级吗?

出40入42汤圆

发表于 2020-6-17 17:45:03 | 显示全部楼层
没有MMU(memory manage unit)的单片机,我觉得一般ram都是随便访问读写的

出0入0汤圆

 楼主| 发表于 2020-6-17 17:48:31 | 显示全部楼层
lusson 发表于 2020-6-17 17:38
全局变量不叫申请,应该叫定义吧。
全部变量在链接阶段会直接分配个固定地址的,对全局变量的访问就是访问 ...

是程序升级,感谢大神回复!

出0入54汤圆

发表于 2020-6-17 17:50:53 | 显示全部楼层
擦鞋匠 发表于 2020-6-17 17:48
是程序升级,感谢大神回复!

bootloader和APP的RAM空间你可以看成完全不相干的2个东西。
即bootloader中使用的和APP使用的可以完全没关系。
一般bootloader和APP也是2个工程。

你可以具体说一下你的担心点,比如举个例子,因为感觉对你的问题还不是特别清楚。

出0入0汤圆

发表于 2020-6-17 17:59:48 | 显示全部楼层
两者没有影响的,可以认为没有对方。反而需要保留部分RAM的内容,还需要特殊的技巧。

出0入0汤圆

 楼主| 发表于 2020-6-17 18:37:30 | 显示全部楼层
lusson 发表于 2020-6-17 17:50
bootloader和APP的RAM空间你可以看成完全不相干的2个东西。
即bootloader中使用的和APP使用的可以完全没 ...

首先,非常感谢大神的耐心回复。

我使用的是IAR + MSP430F5单片机(TI单片机似乎对RAM是特别吝啬,我这款单片机是16KRAM,竟然是这个系列RAM最大的了)。
我将升级程序的工程叫做IAP(我看很多开发板都这么称呼),还有一个是正常运行的工程叫做APP。这两个工程是独立的。

在IAP工程里,我定义了一个全局变量,大概占用200~300字节(还有就是局部变量,我认为这个没有影响)。
在APP工程里,我的RAM几乎完全耗尽(勉强算是够用)。

我担心APP工程分配的地址会“绕开”IAP工程分配的地址,那么APP程序分配的地址肯定不够用,这样RAM就会溢出。
另外:在IAP工程里配置的堆和栈(通过IAR软件设置)和APP工程配置的堆和栈(通过IAR软件设置),如果两者配置值不一样,最终运行程序到底以哪个为准?

出0入475汤圆

发表于 2020-6-17 18:42:27 来自手机 | 显示全部楼层
很简单的验证:你IAP随便定义一个最大的RAM消耗全局变量,几乎耗尽芯片的,然后你app定一个一半的或者随意的ram消耗的,你看看你是不是能够正常运行嘛:)

出0入8汤圆

发表于 2020-6-17 20:06:04 | 显示全部楼层
在工程配置里设,各自的内存占用范围
剩下的交给编译器

出0入54汤圆

发表于 2020-6-17 20:31:10 | 显示全部楼层
擦鞋匠 发表于 2020-6-17 18:37
首先,非常感谢大神的耐心回复。

我使用的是IAR + MSP430F5单片机(TI单片机似乎对RAM是特别吝啬,我这 ...

不会影响,你是2个工程,相当于都是可以用全16KB RAM

出0入0汤圆

发表于 2020-6-17 20:36:40 | 显示全部楼层
"我担心APP工程分配的地址会“绕开”IAP工程分配的地址,那么APP程序分配的地址肯定不够用,这样RAM就会溢出。"  没明白这句话,可以截图说明下吗

出0入0汤圆

 楼主| 发表于 2020-6-18 08:51:12 | 显示全部楼层
lusson 发表于 2020-6-17 20:31
不会影响,你是2个工程,相当于都是可以用全16KB RAM

我大概明白了。
再次向大神表示感谢!

出0入0汤圆

发表于 2020-6-18 09:32:55 | 显示全部楼层
得看你Bootloader里面跳转的时候是怎么操作的,以cortex-m为例,一般情况下在boot跳转到app的时候会先把APP固件的前4个字节赋值给MSP,这就导致之前boot运行中所有存储在栈里面的信息没了,其次会跳转到app程序中的Reset_handler,以IAR编译器为例,Reset_handler会执行__iar_program_start(),这里面分为了好几个阶段,其中就包括初始化全局变量(包括ZI、data)。所以采用这种方式进行跳转,APP开始工作时,相当于整个RAM从来没有被别人使用过,你可以当作无boot来处理。

出0入0汤圆

发表于 2020-6-18 09:46:14 | 显示全部楼层
指定bootloader里面需要保留的变量地址,在app startup那段里面不要初始化那段ram

出10入46汤圆

发表于 2020-6-18 09:50:08 | 显示全部楼层
两个独立程序,分开独立运行。 之间没有任何关系
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 08:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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