c - 删除 C 中的全局变量
问题描述
我正在我的 Cortex M3 芯片中进行一个更大的项目,但我的 RAM 运行不足。我提出的想法是,我需要通过删除引导加载程序代码上的全局变量来在我的 RAM 中腾出空间,以便在引导加载程序跳转到应用程序代码后清除该区域中的 RAM。我无法直接访问芯片中的引导加载程序代码,因此我必须在应用程序代码中更改这些全局变量。如何使用custom_delete()
函数或任何代码删除此全局变量。我使用 ARM 皮质 M3 (LPC1769)。
总而言之,基本上我正在运行的是:
Custom_Delete ( ? ){
??
}
int foo[1000];
int main(){
/*
Bootloader Code
*/
Custom_Delete ( foo ) // I'm trying to remove the "foo" variable once the bootloader code is executed and the application code is run.
SCB->VTOR = (APP_START_ADDRESS) & 0x1FFFFF80 // jump to application code
}
解决方案
无法删除具有静态生命周期的变量。
您可以尝试重新使用该区域。
union {
struct { // bootcode data
int foo[100];
};
struct { // application data
int var1;
long var2;
};
} data;
成员的名称在引导代码和应用程序之间应该是唯一的。然后,您可以使用未命名的成员并访问字段而无需额外的嵌套级别。引导代码和应用程序都使用的数据必须放在该联合之外。这种方法的缺点是您无法初始化联合中的应用程序的数据。只有联合的第一个字段(即引导代码部分)可以被初始化。
笔记:
如果您将引导代码和应用程序放在同一个可执行文件中,这适用。
如果两者都是独立创建的,那么您可以使用定制的链接描述文件将数据放置在同一位置。一旦您将控制权传递给应用程序,引导代码的内存布局就不再相关。如果在启动应用程序时运行应用程序的启动代码,这也允许初始化应用程序数据。如果您将应用程序构建为独立的二进制文件,这通常是正确的。
推荐阅读
- javascript - 向现有的 Rest 服务添加新参数
- spring - SpringBoot 2.1.9 -> 2.2.0 - 健康端点不再工作
- spring - 检查启动后添加特定数据 - spring boot
- javascript - 这个 punycode 包含来自哪里?
- excel - 将文本从文本框复制到剪贴板的命令按钮不起作用
- mysql - 致命错误:未捕获的 PDOException:SQLSTATE [3D000]:无效的目录名称:1046 未选择数据库
- javascript - 如何在 textarea 中打印我的单选按钮?
- html - 我在第三排按钮前面获得了额外的空间
- css - 如何将离子卡悬停在离子列表中
- css - Angular Kendo Grid 不可滚动,并允许高度适合行内容?