硬汉嵌入式论坛

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

[有问必答] 关于固件升级IAP和APP的SRAM分配问题

[复制链接]

2

主题

4

回帖

10

积分

新手上路

积分
10
发表于 2025-7-11 16:54:16 | 显示全部楼层 |阅读模式
假设我按照下面的方式去分配了一个IAP和一个APP的空间,那在上电的时候,程序先执行IAP,然后跳转到APP后那IAP中定义的变量还会存在RAM里吗?
如果APP里有跟IAP里同名的变量会发生什么吗?
RAM的空间两个程序是怎么使用的,会不会IAP用了200k的SRAM,跳转到APP后就只能用剩下的24K了。(假设一共有224K)
RAM也要像flash那样先在keil5里分好吗。

iap


app




回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2025-7-11 17:36:24 | 显示全部楼层
本帖最后由 昨夜风又起 于 2025-7-11 18:01 编辑

不会的,变量在ram中的地址由编译阶段决定的。程序跳转后,会进入复位中断,清除RAM。
变量名字只是给人看的,编译器会把它编译成地址,而且跳转后,会清除RAM。

评分

参与人数 1金币 +10 收起 理由
zt20 + 10 赞一个!

查看全部评分

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-12 09:32:50 | 显示全部楼层
实际上这是两个独立的程序,互不影响。进入APP后已经与BOOT无关了,RAM空间全部由APP操作

评分

参与人数 1金币 +10 收起 理由
zt20 + 10 赞一个!

查看全部评分

回复

使用道具 举报

0

主题

71

回帖

71

积分

初级会员

积分
71
发表于 2025-7-12 10:19:44 | 显示全部楼层
我有这样的需求,就是在 RAM 保存某个标志,让 app 和 bootloader 都可以读写它。
比方说,在 app 运行时,接到串口命令,要更新 app。这时要跳转到 bootloader 接收新代码。
在跳转前,写特殊的标志到 RAM 某个地方。bootloader 运行起来先查看这个标志,以确定是否有更新要求。
如果有就接收新代码,没有就跳到 app 。
这样能做到吗?
回复

使用道具 举报

0

主题

49

回帖

49

积分

初级会员

积分
49
发表于 2025-7-12 16:37:48 | 显示全部楼层
imliyucai 发表于 2025-7-12 10:19
我有这样的需求,就是在 RAM 保存某个标志,让 app 和 bootloader 都可以读写它。
比方说,在 app 运行时 ...

可以,不仅可以 bl 写 ram 传参数给 app,app 还可以反过来传参数给 bl

譬如,我的几个开源项目,在 app 里面写 ram 标记,重启的时候指定重启到 bl 状态,还是 app 状态

标记是 4 位的 uint32_t 类型,就放在 ram 的最开头,bl 和 app 的连接脚本不使用 ram 的开头 4 字节即可(定义内存从 0x20000004 开始即可):

https://github.com/dukelec/cdbus_bridge

且 bl 想要跳转到 app 的时候,如果 bl 已经初始化了 usb 等高阶模块,deinit 又麻烦又不保险,则是通过 bl 传参数给 bl 自身,bl 想跳转 app 的时候自己先重启,然后再在刚启动的时候直接跳转 app
回复

使用道具 举报

0

主题

71

回帖

71

积分

初级会员

积分
71
发表于 2025-7-14 09:16:31 | 显示全部楼层
dukelec 发表于 2025-7-12 16:37
可以,不仅可以 bl 写 ram 传参数给 app,app 还可以反过来传参数给 bl

譬如,我的几个开源项目,在 a ...

谢谢大佬指点。我先去学习你的代码。
回复

使用道具 举报

3

主题

17

回帖

26

积分

新手上路

积分
26
发表于 2025-7-21 10:49:57 | 显示全部楼层
imliyucai 发表于 2025-7-12 10:19
我有这样的需求,就是在 RAM 保存某个标志,让 app 和 bootloader 都可以读写它。
比方说,在 app 运行时 ...

也可以考虑在flash中写入对应的标志位吧,写入更新命令后直接复位单片机进入boot程序,boot程序再去flash中读取标志位进行判断是否更新完成
回复

使用道具 举报

0

主题

71

回帖

71

积分

初级会员

积分
71
发表于 2025-7-22 13:39:15 | 显示全部楼层
extero 发表于 2025-7-21 10:49
也可以考虑在flash中写入对应的标志位吧,写入更新命令后直接复位单片机进入boot程序,boot程序再去flash ...

本来就是考虑在 Flash 里写标志的,但是 Flash 需要擦除,而且是整个 sector 擦除,非常麻烦。我还想了很多办法,来避免或减少擦除。但效果难以让我满意。
按照上面大佬的指点,现在用 SRAM 来写标志,确实可行,这就方便多了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-11 23:57 , Processed in 0.062071 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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