野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 24827|回复: 9

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

[复制链接]
发表于 2016-7-25 19:38:35 | 显示全部楼层 |阅读模式
1火花
本帖最后由 aimjoe 于 2016-7-25 19:39 编辑

问题的描述如下在STM32上电复位时,系统首先进入SystemInit()函数对系统时钟进行初始化,然后跳转到scatterload,scatterload将RW区中初始化非零的变量从FLASH复制到SRAM,接着将ZI区将需要初始化为零的变量初始化为零。然后进入mian函数。现在有个问题,就是SystemInit()函数中的局部变量是如何初始化的。因为在SystemInit()函数之后才进行变量的初始化,大家是如何理解这个问题的。

最佳答案

查看完整内容

局部变量只有在调用的时候才初始化,在不调用之前都是在ram中,值是不确定的
回复

使用道具 举报

发表于 2016-7-25 19:38:36 来自手机 | 显示全部楼层
局部变量只有在调用的时候才初始化,在不调用之前都是在ram中,值是不确定的
回复

使用道具 举报

 楼主| 发表于 2016-7-25 23:24:41 | 显示全部楼层
fire 发表于 2016-7-25 22:04
局部变量只有在调用的时候才初始化,在不调用之前都是在ram中,值是不确定的

谢谢火哥指点,明白了
回复

使用道具 举报

发表于 2016-7-26 08:48:05 | 显示全部楼层
帮顶,楼主研究的还挺深入
回复

使用道具 举报

发表于 2016-7-26 08:48:35 | 显示全部楼层
这是论坛的新功能嘛,可以打赏了,赞
回复

使用道具 举报

发表于 2016-7-26 08:56:07 | 显示全部楼层
你仔细看看,SystemInit有使用变量吗?为了避免这个问题,SystemInit是没有使用SRAM或SDRAM的,它调用的其它函数,要么是使用register,要么是使用__IO类型关键字, 这样定义的变量都是存放在CPU内部的寄存器里的。

你可以看看《MDK编译过程及文件全解》章节的内容及视频来了解下
回复

使用道具 举报

 楼主| 发表于 2016-7-27 15:27:50 | 显示全部楼层
本帖最后由 aimjoe 于 2016-7-27 15:33 编辑
flyleaf 发表于 2016-7-26 08:56
你仔细看看,SystemInit有使用变量吗?为了避免这个问题,SystemInit是没有使用SRAM或SDRAM的,它调用的其 ...

你好,火哥,SystemInit函数调用的SetSysClock()函数中有定义 __IO uint32_t StartUpCounter = 0, HSEStatus = 0;这两个变量,这两个变量有__IO修饰符修饰,而__IO是由宏#define     __IO    volatile 定义,volatile的作用是: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.所以这两个变量是通过内存寻值访问的,也就是使用了SRAM。而 register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。用这个关键字修饰的变量是存放在CPU内部的寄存器里。已经看过MDK编译过程及文件全解》,收益颇多,谢谢火哥
捕获11.PNG
QQ截图20160727152736.png
回复

使用道具 举报

发表于 2016-7-27 15:52:51 | 显示全部楼层
aimjoe 发表于 2016-7-27 15:27
你好,火哥,SystemInit函数调用的SetSysClock()函数中有定义 __IO uint32_t StartUpCounter = 0, HSESta ...

关于这个本来我是以为volatile会被定义成register类型变量的,但貌似这样解释有点问题

你尝试下把那个函数里的 __IO 变量去掉,看看整个程序还能不能正常跑,去掉__IO的话,变量肯定是作为ZI 类型的变量被分配到内部SRAM的,但这个时候确实 scatter load 函数还没执行。

实验下,把结果告诉我
回复

使用道具 举报

 楼主| 发表于 2016-7-28 08:45:30 | 显示全部楼层
flyleaf 发表于 2016-7-27 15:52
关于这个本来我是以为volatile会被定义成register类型变量的,但貌似这样解释有点问题

你尝试下把那个 ...

火哥,经过测试,将__IO去掉,系统可以正常启动,运行正常
回复

使用道具 举报

发表于 2016-7-28 09:40:28 | 显示全部楼层
aimjoe 发表于 2016-7-28 08:45
火哥,经过测试,将__IO去掉,系统可以正常启动,运行正常

那只能说明这个时候不影响了,把变量地址打印出来,估计也是被分配到栈空间
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 08:27 , Processed in 0.033159 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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