嵌入式软件 - 为什么查找表中需要'const'? [关闭]

问题描述 投票:-1回答:1

我刚刚在LinkedIn上观看了这个关于Lookup表的视频,它提到如果没有'const'限定符,数组将被分配到RAM中并且初始分配在启动期间发生,整个表将被存储两次 - 在RAM和ROM都有。

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

提前致谢。

c memory embedded lookup lookup-tables
1个回答
4
投票

微控制器通常(除了无闪存的)闪存比RAM更多。将常量数据放入RAM中将是一种浪费。

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

您还可以使用属性和编译指示强制将static const自动变量放入ROM中

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

但它只适用于全局变量 - 大多数实现将自动const变量放在位于RAM中的堆栈上

EDIT

static const也可以仅存储在ROM中。但是几年前我和其中一个uC gcc分支机构的经历很糟糕。确保 - 检查工具链对此变量的作用。

因此const对于查找表不是必需的,但保存(通常)非常有限的资源(SRAM)是合乎逻辑的。

© www.soinside.com 2019 - 2024. All rights reserved.