一直以为 const 声明的变量一定是只读的,并且也一定会存放在 flash 中,直到在 103 的 map 文件中看到了这个变量:
声明如下(函数体外):
__i 声明如下:
可以看到,虽然使用 const 修饰变量为只读,但是 mdk 编译器仍将这两个数组放在了 ram 区(全局变量),这意味着这个变量仍可写(通过指针方式修改),只是不能直接修改而已,还白白浪费了 ram 空间,因为从实现来看,根本不需要修改这个表,完全可以将其放入 flash 空间。
测试发现,是 volatile 这个关键字导致了这个现象,如果没有这个关键字修饰,则能够将其放入 flash 中,所以库函数这个代码也是挺迷的。
去除 volatile 修饰后(0x08xx xxxx 为 flash 地址区):
并且你以为这就完了?当将 const 声明的数组放在函数体中,你会发现这个数组也被放在了 ram ( 栈 )区,而不是 flash,这样你想节省栈空间的计划就泡汤了。
那该怎么办?很简单,加一个 static 即可:
但是当你加上 volatile 后,又被放入 ram 中了,并且这次不是在栈中,而是作为全局变量(map 文件可找)存在,占用了 ram 的空间。
这算不大不小坑吧,望引以为戒!
5G是怎样颠覆教育行业的
随着车市的发展和优胜劣汰,新能源车1.0时代的乱象将会减少
高精度SF6气体定量检漏仪的功能特点
token经济你理解正确了吗
京东无人仓正在开启全球智慧物流的未来
const声明的变量一定只能读吗?
GSM协会拟统一近场通信(NFC)标准
荣耀v9评测:麒麟960+4G+64G,仅2599元!最保值的手机
印度禁用中国59款APP,商务部回应
拓展高精密产品线,ITECH产品矩阵再进化 ——艾德克斯重磅新品IT2800系列高精密源测量单元发布
低端单片机如何驱动高分辨率彩屏
什么是5G 深度解析5G
如今各行各业都已应用上激光对射探测器
台积电用10nm生产A11 联发科又该头疼了!
英飞凌向尔必达提出专利侵权诉讼
太星电工全新推出夜巡侠超亮LED充电式照明灯
区块链在农业供应链中的主要好处有哪些
华为:全面的变革 逼出来的开放
粘结剂协同的9电子转移π-d共轭金属有机配位聚合物高容量储锂材料
华为平板M6上手 几乎没有任何短板