一直以为 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
+关注
关注
9文章
1407浏览量
146201 -
RAM
+关注
关注
7文章
1175浏览量
112934 -
CONST
+关注
关注
0文章
42浏览量
7787
发布评论请先 登录
相关推荐
C语言之正确使用Const
Const基本解释 const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起
发表于 10-07 11:20
C语言——正确使用const
const基本解释 const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所
发表于 04-23 11:58
在while循环内添加了一个全局变量。然后在当前vi的while循环外读取全局变量。只能读取一次
一个全局变量。然后在当前vi的while循环外读取全局变量。只能读取一次,为什么啊。全局变量的前面板上数值是改变的。
发表于 08-14 15:58
labview 通过OPC modbus TCP 与施耐德258通讯 字能读能写 但是位只能读不能写
能读之后再转入写状态。我是按照网上的教程去操作的。用400003.4对应PLC当中的%MX4.4中间变量。更换其他变量后,也是只能读不能写。不知道是怎么回事。有大神知道是怎么回事吗
发表于 10-20 11:00
怎么更改const变量PIC18F47K40的值?
一个const数组变量的值。我必须声明变量为const,因为我需要使用的数组有4736个字节。问题是,在程序代码中,我需要给数组的某些元素分配一个不同的值。谢谢。
发表于 03-12 11:36
Verilog 变量声明与数据类型一
变量的值为高阻’z’。wire类型变量的使用:wire型变量的声明与赋值wire类型的变量只能由assign语句赋值,或在声明时赋初值。而且赋值的机会只有
发表于 08-10 14:01
C语言中变量的声明和定义以及extern的用法介绍
变量的声明不同于变量的定义,这一点往往容易让人混淆。 l变量的声明是告诉编译器,该变量名称已经存在,编译器认识这个名字,不会引起编译错误。 对变量进行定义之后,编译器就会给变量分配空间,链接时,链接器可以找到它们的地址。
发表于 11-21 10:59
•12次下载
变量定义和声明的区别
变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:
发表于 11-17 08:38
•7390次阅读
你会使用Linux编程const?
const 的一些强大的功能在于它在函数声明中的应用。在一个函数声明中,const 可以修饰函数的返回值,或某个参数;对于成员函数,还可以修饰是整个函数。有如下几种情况,以下会逐渐的说明用法:
发表于 05-06 16:34
•423次阅读
从STM32到CONST的全局变量
const全局变量地址 程序如下: const int globalConstDat = 12; int globalDat = 11; int main(void) { int
怎样去使用C语言中的const关键字呢
const一个注释的全局变量一个注释的局部变量,我们编译都能通过,不过使用全部变量的程序运行会报段错误,而局部变量的能够过得正确结果。对于通过指针修改const的值是一种与编译器
const 和指针变量使用
一种变量,它的值不能被改变,在整个作用域中都保持固定。例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小。为了满足这一要求,可以使用const关键字对变量加以限定
评论