我刚刚在LinkedIn学习中观看了这段视频 查找表并提到,如果没有'const'限定符,则将在RAM中分配该数组,并且在启动期间进行初始分配,并且整个表将存储两次-分别在RAM和ROM中。
有人可以向我详细解释一下吗?为什么要存储两次?这是否意味着所有没有'const'的变量/数组都会被存储两次?切换的情况会比没有const的查找表更好吗?
谢谢。
答案 0 :(得分:4)
微控制器的闪存(除无闪存的闪存外)通常比RAM多得多。将常量数据放入RAM会很浪费。
当您使用const
关键字时,大多数工具链会将数据放在只读存储器-FLASH中的.rodata节中。某些uC类型(例如AVR)需要使用特殊的机制来访问此数据,对于大多数现代类型而言,几乎没有区别(快速的uC需要使用等待状态来减慢读写操作,因为FLASH比SRAM慢)>
您还可以通过使用属性和编译指示强制将static const
自动变量放置在ROM中
(gcc)static const char __attribute__((section(".rodata"))) x;
(各节的名称可能不同-请查看您的工具链文档)
但它仅适用于全局变量-大多数实现将自动const
变量放在RAM中的堆栈上
static const
也可以仅存储在ROM中。但是几年前,我在uC gcc分支机构中有一个糟糕的经历。为了确保这一点-检查您的工具链正在使用此变量做什么。
因此,const
对于查询表不是不必要,但是保存(通常)非常有限的资源SRAM是合乎逻辑的。