- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一些常量数据要存储在 ROM 中,因为它的数量相当多,而且我正在使用内存受限的 ARM7 嵌入式设备。我正在尝试使用看起来像这样的结构来做到这一点:
struct objdef
{
int x;
int y;
bool (*function_ptr)(int);
some_other_struct * const struct_array; // array of similar structures
const void* vp; // previously ommittted to shorten code
}
然后我将其创建并初始化为全局变量:
const objdef def_instance = { 2, 3, function, array, NULL };
然而,尽管开头有 const
,这会占用相当多的 RAM。更具体地说,如果创建了足够多的实例,它会显着增加 RW 数据量并最终导致设备锁定。
我正在使用 uVision 和 ARM 编译器,以及 RTX 实时内核。
有人知道为什么这不起作用或知道在 ROM 中存储结构化异构数据的更好方法吗?
更新
谢谢大家的回答,很抱歉没有早点回复你们。这是目前的分数和我的一些额外观察结果。
遗憾的是,__attribute__
对 RAM 和 ROM 的影响为零,static const
也是如此。还没来得及尝试组装路线。
不过,我和我的同事发现了一些更不寻常的行为。
首先,我必须指出,为了简单起见,我没有提到我的 objdef
结构包含一个 const void*
字段。该字段有时会从定义为的字符串表中分配一个值
char const * const string_table [ROWS][COLS] =
{
{ "row1_1", "row1_2", "row1_3" },
{ "row2_1", "row2_2", "row2_3" },
...
}
const objdef def_instance = { 2, 3, function, array, NULL };//->ROM
const objdef def_instance = { 2, 3, function, array, string_table[0][0] };//->RAM
string_table
按预期在 ROM 中。关键在于:objdef
的实例被放入 ROM 中,直到 string_table
中的一个值被分配给 const void*
字段。之后结构实例被移动到 RAM。
但是当string_table
改为
char const string_table [ROWS][COLS][MAX_CHARS] =
{
{ "row1_1", "row1_2", "row1_3" },
{ "row2_1", "row2_2", "row2_3" },
...
}
const objdef def_instance = { 2, 3,function, array, NULL };//->ROM
const objdef def_instance = { 2, 3, function, array, string_table[0][0] };//->ROM
尽管有 const void*
赋值,但 objdef
的那些实例仍被放置在 ROM 中。我不知道为什么这很重要。
我开始怀疑 Dan 是对的,我们的配置在某处搞砸了。
最佳答案
我假设您有一个将 RAM 和 ROM 部分分开的分散文件。您想要做的是使用属性指定您的结构将放置在哪个部分,或者将其放置在它自己的目标文件中,然后在您希望它位于分散文件中的部分中指定。
__attribute__((section("ROM"))) const objdef def_instance = { 2, 3, function, array };
C 的“const”关键字并不会真正导致编译器将某些内容放入文本或 const 部分。它只允许编译器警告您试图修改它。获取指向 const 对象的指针、将其转换为非 const 对象并写入是完全有效的,并且编译器需要支持这一点。
关于c++ - 将结构存储在 ARM 设备的 ROM 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4962788/
在rom-sql我想启用日志记录,以便我可以看到生成的所有 sql 查询。 我怎样才能做到这一点? 因为它在下面使用续集,我想它可能会通过 sequel logger 以某种方式实现。 . 最佳答案
如何获取所有驱动器的列表以及相应的驱动器类型(可移动、本地磁盘或 cd-rom、dvd-rom 等)? 最佳答案 通过这段代码你可以获得所有驱动器及其类型描述 File[] paths; FileSy
我正在尝试通过 C 代码弹出我的 CD ROM。它不想工作。 ioctl 返回“5”I/O 错误,哪里可能有问题? #include #include #include #include #i
我在网上的几个地方找到了这个问题,但从来没有一个好的答案。让我具体回答所提出的问题。 我想构建一个只有一个应用程序的自定义 Android ROM。此应用程序不与任何硬件交互(现在)。此应用程序将在设
我正在开发基于 Renesas RL78 Controller 的汽车软件堆栈。直接进入问题,声明为 const(ROM 变量)的变量未使用定义的值进行初始化。 例如:const uint8 var_
有人知道用什么语言ROM(例如GBA ROM)编码吗?我还想知道是否有一种简单的方法可以反编译这些ROM。 最佳答案 GBA游戏可以用任何语言编程,只要可以编译为ARM汇编即可。 它们通常是用C++编
是否有一个 ROM 字节在正常操作中未使用? 我想解码地址总线,拉低 ROMCS 并将数据放入数据总线仅针对一个地址。 ROM 中是否有一个地址在 ZX Spectrum 的正常操作中从未使用过?也许
我正在尝试为自定义 ROM 制作更新程序。我可以通过以下方式从我的应用中恢复: Process p = Runtime.getRuntime().exec("su"); OutputStream os
如何检测小米MIUI ROM下运行的设备?我可以使用以下代码检测 Xiomi 设备。 String manufacturer = "xiaomi"; if (manufacturer.equalsIg
我想检查我的设备是否安装了自定义 ROM。如果任何设备上有自定义 ROM,我不希望我的应用程序运行。我如何通过代码知道这一点? 最佳答案 System.getProperty("os.version"
我完成了我的 6502 模拟器的编写,我准备开始测试它了。我找到了 nestest带有一些文档的 ROM,但我不确定加载 ROM 的正确方法是什么。作者说,模拟器应该从0xC000开始,当我加载ROM
我有一个需求是这样的:我们有定制的 Android 设备,上面安装了定制的 ROM。我需要能够通过应用为此自定义 ROM 安装更新。 我想解决这个问题的方法是通过 ftp 从服务器下载自定义 rom,
我想在我的自定义 AOSP rom 中禁用主页、菜单和后退按钮。我在互联网上搜索过,看到我可以在 out/target/product/generic/system/usr/keylayout 中找到
我正在开发一个 Android 应用程序,但我想将我的应用程序限制为只能由未运行有根/自定义 ROM 的硬件访问。我知道 Android 的前向锁定内容保护,但想在我的应用程序中仔细检查此保护。有什么
最近一直在使用闪存 ROM,我发现无论是在芯片的内部闪存内还是在外部 SPI 闪存设备中,扇区的大小通常都是这样的: 我很好奇为什么起始地址空间的扇区比后面的地址小。我怀疑使用引导加载程序之类的东西会
我需要创建一个提供一些功能的 ROM 掩码。不过,应该可以覆盖提供固件补丁的功能。因此,补丁表应该位于Flash存储器中,以后固件升级可能会被覆盖,而固件的主要部分位于mask ROM中,以后无法修改
我想在基于 ARM 的智能手机上全新安装嵌入式 Linux。为此,我需要闪存、显示器等设备驱动程序。我想知道是否可以从这些手机供应商提供的 ROM 中提取设备驱动程序? 最佳答案 不,这通常是不可能的
制作自定义 rom 是否涉及与制作应用程序相同的技能组合?他们是同一个吗? 最佳答案 没有。自定义 ROM 需要对比制作应用程序低得多的编程有很好的理解。几乎任何人都可以使用 CS、ZDE 或 Net
我做了一个前台服务来不断扫描我周围的 BLE 设备。出于某种原因,它似乎在我的安卓设备谷歌像素和三星 S9+ 上完美运行。 但最近我用中文 ROM(Oneplus 6T,小米 Poco F1)测试了该
我正在编写一个需要区分 Android Stock ROM 和其他 ROM(如 SenseUI 等)的应用。 如何在我的应用程序中执行此操作? 谢谢。 最佳答案 我发现使用 getprop 查询 ro
我是一名优秀的程序员,十分优秀!