【问题标题】:Embedded Software - Why is 'const' necessary in lookup table? [closed]嵌入式软件 - 为什么查找表中需要“const”? [关闭]
【发布时间】:2018-09-16 17:20:50
【问题描述】:

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

有人可以更详细地向我解释一下吗?为什么它会被存储两次?这是否意味着所有没有“const”的变量/数组都会被存储两次? switch case 会比没有 const 的查找表更好吗?

提前致谢。

【问题讨论】:

  • const 由于 C 而不是必需的。这取决于编译器和处理器。您使用的是什么处理器和编译器?
  • 您在教科书中找不到的 const 限定词有什么不清楚的地方?从不起眼的在线“教程”或 YT 视频中学习 C 是个坏主意。
  • 可能的答案很简单,如果您声明一个没有const 的查找表(或任何数据结构)并为其提供初始数据,那么系统必须同时拥有初始数据的副本并为查找表提供单独的空间。这是因为,由于表不是const,编译器必须考虑到某些东西可能会改变它的事实(除非它可以通过检查所有代码来证明不是这样)。因此,要创建请求的表,编译器必须为程序安排表空间,并且必须用初始数据填充该空间。为此,……
  • …初始数据必须可用。所以一定有它的副本在某个地方。相反,如果表是用const定义的,那么初始数据本身就可以充当表。包含初始数据的表只有一个副本,并且它只是读取,从不修改,因此不需要单独的初始数据副本。
  • @EricPostpischil 谢谢。太清楚了!

标签: c memory embedded lookup lookup-tables


【解决方案1】:

微控制器通常(除了无闪存的)闪存比 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 是合乎逻辑的。

【讨论】:

  • 全局变量是永久的。在自动变量的情况下,堆栈内存在函数退出时被回收,因此它们在 SRAM 上没有那么贪婪。
  • 谢谢。 @P__J__ 1)我仍然感到困惑的是,当不使用“const”时,为什么数组同时存储在 RAM 和 ROM 中?你能解释一下吗? 2)关于全局变量部分 - 如果它是一个局部变量,它可能会溢出堆栈,因为它需要在每次调用时分配,对吗?我想使用静态限定符可以解决这个问题。除非问题是别的。
  • @ShantanuMhapankar SRAM 中的初始化变量也必须存在于 ROM 中,因为它的数据必须从某处复制。至于将static 限定符用于自动变量,这与使其成为全局变量的内存使用相同,是的,初始化的自动变量将需要在每次函数调用时从 ROM 复制其数据。局部变量static 的作用是它与全局变量保持在同一内存空间中,但对函数是私有的。
  • @WeatherVane 不那么贪心,但如果你有 1k SRAM 堆栈也非常有限
  • 有趣的 DV。是我写错了什么还是有人很沮丧
猜你喜欢
  • 2016-06-20
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 2010-11-06
  • 1970-01-01
  • 2012-10-25
相关资源
最近更新 更多