c - 嵌入式软件 - 为什么查找表中需要“const”?
问题描述
我刚刚在 LinkedIn Learning 上观看了这个关于查找表的视频,它提到如果没有“const”限定符,数组将在 RAM 中分配,并且在启动期间进行初始分配,整个表将被存储两次 - 在RAM 和 ROM 都有。
有人可以更详细地向我解释一下吗?为什么它会被存储两次?这是否意味着所有没有“const”的变量/数组都会被存储两次?switch case 会比没有 const 的查找表更好吗?
提前致谢。
解决方案
微控制器通常(除了无闪存的)比 RAM 更多的 FLASH。将常量数据放在 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 是合乎逻辑的。
推荐阅读
- python - 打包后,module1 无法从同一个项目中“导入 module2”
- ios - 从Background(home)返回时iOS崩溃
- java - Appium 没有启动正确的应用程序
- unix - 删除以 – 开头的文件夹(短划线)
- visual-studio-code - 如何隐藏部分 UI?
- spring - Spring Traverson 和 OAuth2RestTemplate
- excel - 使用输入框作为密码框选择工作表 VBA EXCEL
- google-cloud-platform - 如何在 Compute Engine Google Cloud 中使用 96 个 CPU?
- swift - 在 Swiftui 中是否有一种简单的方法可以通过捏合来放大图像?
- php - 有人可以帮我将此 sql 查询转换为 laravel db 查询吗?