OpenEdv-开源电子网

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

关于初始化过程中函数SystemInit()变量初始化的问题

[复制链接]

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-7-14
在线时间
44 小时
发表于 2016-7-25 19:36:11 | 显示全部楼层 |阅读模式
1金钱
问题的描述如下在STM32上电复位时,系统首先进入SystemInit()函数对系统时钟进行初始化,然后跳转到scatterload,scatterload将RW区中初始化非零的变量从FLASH复制到SRAM,接着将ZI区将需要初始化为零的变量初始化为零。然后进入mian函数。现在有个问题,就是SystemInit()函数中的局部变量是如何初始化的。因为SystemInit()函数之后才进行变量的初始化,大家是如何理解这个问题的。

最佳答案

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

SystemInit()函数只是初始化CPU时钟和中断向量. 你说的那些什么scatterload,初始化RW,ZI这些,都是在__main里面做的,这是KEIL提供的C语言库. SystemInit()要用的是主堆栈,叫MSP,这个堆栈地址是保存在FLASH的头4个字节,由CPU自行加载. 至于局部变量的初始化,如果你的局部变量少,编译器会分配寄存器给你当局部变量,如果局部变量多了,会给你分配一段栈空间,如果你的局部变量有初始化值,编译器会给对应的地址赋立即数或是从FLASH中读 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

277

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1522
金钱
1522
注册时间
2014-5-16
在线时间
217 小时
发表于 2016-7-25 19:36:12 | 显示全部楼层
本帖最后由 zmingwang 于 2016-7-26 09:18 编辑

SystemInit()函数只是初始化CPU时钟和中断向量.
你说的那些什么scatterload,初始化RW,ZI这些,都是在__main里面做的,这是KEIL提供的C语言库.
SystemInit()要用的是主堆栈,叫MSP,这个堆栈地址是保存在FLASH的头4个字节,由CPU自行加载.
至于局部变量的初始化,如果你的局部变量少,编译器会分配寄存器给你当局部变量,如果局部变量多了,会给你分配一段栈空间,如果你的局部变量有初始化值,编译器会给对应的地址赋立即数或是从FLASH中读取出来赋值.
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-7-26 08:51:13 | 显示全部楼层
初始化的非零的变量和为零的变量都是存在ram的静态/全局区,变量的生命周期都是全程的,地址是固定的。
而局部变量是放到ram的栈中,地址不固定,函数运行完成后局部变量的地址就被释放,备以后用。所以没有办法初始化到具体的地址上。
以arm cortex M系列为例,局部变量使用的过程中,一般都是在通用寄存器Rx中,如果在这个函数中再调用其他函数或发生中断的时候,就会将这些Rx中的值压栈到栈中保存。所以没法事先知道局部变量会占用哪个栈地址,自然也没有办法在运行之前初始化。
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 21:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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