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

声明如下(函数体外):

__I 声明如下:

可以看到,虽然使用 const 修饰变量为只读,但是 MDK 编译器仍将这两个数组放在了 RAM 区(全局变量),这意味着这个变量仍可写(通过指针方式修改),只是不能直接修改而已,还白白浪费了 RAM 空间,因为从实现来看,根本不需要修改这个表,完全可以将其放入 FLASH 空间。
测试发现,是 volatile 这个关键字导致了这个现象,如果没有这个关键字修饰,则能够将其放入 FLASH 中,所以库函数这个代码也是挺迷的。
去除 volatile 修饰后(0x08xx xxxx 为 FLASH 地址区):

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

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

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

这算不大不小坑吧,望引以为戒!
审核编辑:刘清
-
FlaSh
+关注
关注
10文章
1715浏览量
154665 -
RAM
+关注
关注
8文章
1398浏览量
119799 -
CONST
+关注
关注
0文章
45浏览量
8680
原文标题:坑!const 声明的变量一定只能读吗?
文章出处:【微信号:emOsprey,微信公众号:鱼鹰谈单片机】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
变量的声明和定义有什么区别和联系
C和C++中const的用法比较
在while循环内添加了一个全局变量。然后在当前vi的while循环外读取全局变量。只能读取一次
labview 通过OPC modbus TCP 与施耐德258通讯 字能读能写 但是位只能读不能写
Verilog 变量声明与数据类型一
变量定义和声明的区别
从STM32到CONST的全局变量
const 和指针变量使用
const 声明的变量不一定是只读的?

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