嵌入式软件-为什么在查询表中必须使用“ const”?

时间:2018-09-16 17:20:51

标签: c memory embedded lookup lookup-tables

我刚刚在LinkedIn学习中观看了这段视频 查找表并提到,如果没有'const'限定符,则将在RAM中分配该数组,并且在启动期间进行初始分配,并且整个表将存储两次-分别在RAM和ROM中。

有人可以向我详细解释一下吗?为什么要存储两次?这是否意味着所有没有'const'的变量/数组都会被存储两次?切换的情况会比没有const的查找表更好吗?

谢谢。

1 个答案:

答案 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是合乎逻辑的。