完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
因为是两个工程编译而成的,虽然Flash的地址划分开了,但是内存RAM没有分开。 bootload中定义的全局变量,通常刚上电后,如果没有对其赋值,全局变量一般是0,全局指针一般是NULL。 假如,bootload全局变量a在0x20000004的地址,APP应用的全局变量的b也在0x20000004的地址。 bootload应用先启动,经过一番运行,a变量被赋值成了10。 然后跳转到B应用,这时APP应用的b也的值也成了10,而不是一般情况下的0。 1.请问这么理解对吗? 我的方法: app的全局变量一定要赋值,那么bootload再跳转之后会重新赋值吗? |
|
相关推荐
6个回答
|
|
这时APP应用的b也的值也成了10,而不是一般情况下的0
这是你调试看到的,还是你猜的? 如果是真的,请找出问题; 如果是猜的,下次可以先验证后再做结论。 末赋值的全局变量,在GCC中叫BSS,在启动代码中会对其做清0动作。(其它编译器都有类似处理) 所以你在boot中用了全局变量a在0x20000004, 然后在APP中全局变量的b也在0x20000004的地址,他会由APP的启动代码中清为0。 如果不为0,说明你APP的启动代码没能正确清0掉BSS,此时即使不用BOOT也是会有问题的。 |
|
|
|
感谢 app的启动文件会重新初始化data和bss
.section .text.Reset_Handler .weak Reset_Handler .type Reset_Handler, %function Reset_Handler: /* Copy the data segment initializers from flash to SRAM */ movs r1, #0 b LoopCopyDataInit CopyDataInit: ldr r3, =_sidata ldr r3, [r3, r1] str r3, [r0, r1] adds r1, r1, #4 LoopCopyDataInit: ldr r0, =_sdata ldr r3, =_edata adds r2, r0, r1 cmp r2, r3 bcc CopyDataInit ldr r2, =_sbss b LoopFillZerobss /* Zero fill the bss segment. */ |
|
|
|
你可以理解为app和BootLoader属于两个不同的程序,从不同的地址开始运行的代码。BootLoader中的变量值是不会传递到APP中去的,无论是不是全局变量。
|
|
|
|
谁运行谁对ram享有完全的主导权
|
|
|
|
boot和app是两个完全独立程序,不在同一时间运行,彼此间没有任何干涉,所以设计时只须干自己的事就完了
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
792 浏览 0 评论
4507 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2564 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
2939 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
31587 浏览 11 评论
73015 浏览 21 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 05:10 , Processed in 0.759693 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号