const 声明的变量不一定是只读的?

编程语言及工具

105人已加入

描述

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

编译器

声明如下(函数体外):

编译器

__I 声明如下:

编译器

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

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

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

编译器

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

编译器

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

编译器

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

编译器

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

编辑:黄飞

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分