全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 存储技术 >

const声明的变量一定只能读吗?

时间:2023-10-07 09:23

人气:

作者:admin

标签: Flash  RAM  const 

导读:一直以为 const 声明的变量一定是只读的,并且也一定会存放在 FLASH 中,直到在 103 的 map 文件中看到了这个变量...

一直以为 const 声明的变量一定是只读的,并且也一定会存放在 FLASH 中,直到在 103 的 map 文件中看到了这个变量:

wKgaomUgsyCAVtmeAACXYb5Ah-M693.jpg

声明如下(函数体外):

wKgZomUgsyGAQHEXAACMSPBygJ0689.jpg

__I 声明如下:

wKgZomUgsyCAWdcnAACXF7CHJh4577.jpg

可以看到,虽然使用 const 修饰变量为只读,但是 MDK 编译器仍将这两个数组放在了 RAM 区(全局变量),这意味着这个变量仍可写(通过指针方式修改),只是不能直接修改而已,还白白浪费了 RAM 空间,因为从实现来看,根本不需要修改这个表,完全可以将其放入 FLASH 空间。

测试发现,是 volatile 这个关键字导致了这个现象,如果没有这个关键字修饰,则能够将其放入 FLASH 中,所以库函数这个代码也是挺迷的。

去除 volatile 修饰后(0x08xx xxxx 为 FLASH 地址区):

wKgZomUgsyGAXxrhAAEUB8_PCNw895.jpg

并且你以为这就完了?当将 const 声明的数组放在函数体中,你会发现这个数组也被放在了 RAM ()区,而不是 FLASH,这样你想节省栈空间的计划就泡汤了。

wKgaomUgsyCAZId8AAFHv4g6qNA355.jpg

那该怎么办?很简单,加一个 static 即可:

wKgZomUgsyCAS6QcAAFJiGOd-Bo615.jpg

但是当你加上 volatile 后,又被放入 RAM 中了,并且这次不是在栈中,而是作为全局变量(map 文件可找)存在,占用了 RAM 的空间。

wKgaomUgsyGAMkmaAAFsNQjA4dM015.jpg

这算不大不小坑吧,望引以为戒!






审核编辑:刘清

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信