嵌入式技术william hill官网
直播中

h1654155272.9717

9年用户 1261经验值
擅长:电源/新能源
私信 关注
[问答]

请问bootload再跳转之后会重新赋值吗

因为是两个工程编译而成的,虽然Flash的地址划分开了,但是内存RAM没有分开。

bootload中定义的全局变量,通常刚上电后,如果没有对其赋值,全局变量一般是0,全局指针一般是NULL。

假如,bootload全局变量a在0x20000004的地址,APP应用的全局变量的b也在0x20000004的地址。

bootload应用先启动,经过一番运行,a变量被赋值成了10。

然后跳转到B应用,这时APP应用的b也的值也成了10,而不是一般情况下的0。

1.请问这么理解对吗?
2.有什么办法解决?

我的方法:

app的全局变量一定要赋值,那么bootload再跳转之后会重新赋值吗?

回帖(6)

刘秀英

2022-8-19 11:25:59
这时APP应用的b也的值也成了10,而不是一般情况下的0

这是你调试看到的,还是你猜的?
如果是真的,请找出问题; 如果是猜的,下次可以先验证后再做结论。

末赋值的全局变量,在GCC中叫BSS,在启动代码中会对其做清0动作。(其它编译器都有类似处理)
所以你在boot中用了全局变量a在0x20000004,
然后在APP中全局变量的b也在0x20000004的地址,他会由APP的启动代码中清为0。
如果不为0,说明你APP的启动代码没能正确清0掉BSS,此时即使不用BOOT也是会有问题的。
举报

h1654155272.9717

2022-8-19 11:26:23
感谢 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. */
举报

王凯

2022-8-19 11:26:39
你可以理解为app和BootLoader属于两个不同的程序,从不同的地址开始运行的代码。BootLoader中的变量值是不会传递到APP中去的,无论是不是全局变量。
举报

张辉

2022-8-19 11:27:00
谁运行谁对ram享有完全的主导权
举报

李桂兰

2022-8-19 11:27:06
boot和app是两个完全独立程序,不在同一时间运行,彼此间没有任何干涉,所以设计时只须干自己的事就完了
举报

李芳

2022-8-19 11:27:14
一般情况下,
虽然Flash的地址划分开了,RAM也是建议要分开的 。
建议RAM也分开。bootloader需要的RAM是很小的一块,在APP中预留出这块空间即可。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分