嵌入式软件 - 为什么在查找 table 时需要 'const'?

Embedded Software - Why is 'const' necessary in lookup table?

我刚刚在 LinkedIn Learning 上观看了这段视频,内容是关于 查找 tables 并且它提到如果没有 'const' 限定符,数组将在 RAM 中分配并且初始分配在启动期间发生并且整个 table 将存储两次 - 在 RAM 中和ROM都.

有人可以更详细地向我解释一下吗?为什么它会被存储两次?这是否意味着没有 'const' 的所有 variables/arrays 都存储了两次? switch case 会比没有 const 的 lookup tables 更好吗?

提前致谢。

微控制器(无闪存除外)通常比 RAM 多得多。将常量数据放在RAM中是一种浪费。

当您使用 const 关键字时,大多数工具链将数据放在位于只读存储器 - 闪存中的 .rodata 部分中。某些 uC 类型(例如 AVR)需要使用特殊机制来访问此数据,对于大多数现代类型几乎没有区别(快速 uC 需要使用等待状态减慢读写操作,因为 FLASH 比 SRAM 慢)

您还可以使用属性和 pragmas

强制将 static const 自动变量放入 ROM

(gcc) static const char __attribute__((section(".rodata"))) x;(部分可能有不同的名称 - 检查您的工具链文档)

但它仅适用于全局变量 - 大多数实现将自动 const 变量放在位于 RAM

中的堆栈上

编辑

static const也可以只存储在ROM中。但是几年前,我在 uC gcc 的一个分支上有过一次糟糕的经历。为确保 - 检查您的工具链正在使用此变量做什么。

所以 const 对于查找表来说 不是必需的 但是节省(通常)非常有限的资源 - SRAM 是合乎逻辑的。