首页 > 解决方案 > 删除 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

}

标签: cmemoryarmglobal-variablesram

解决方案


无法删除具有静态生命周期的变量。

您可以尝试重新使用该区域。

  union {
    struct { // bootcode data
      int foo[100];
    };
    struct { // application data
      int var1;
      long var2;
    };
  } data;

成员的名称在引导代码和应用程​​序之间应该是唯一的。然后,您可以使用未命名的成员并访问字段而无需额外的嵌套级别。引导代码和应用程​​序都使用的数据必须放在该联合之外。这种方法的缺点是您无法初始化联合中的应用程序的数据。只有联合的第一个字段(即引导代码部分)可以被初始化。

笔记:

如果您将引导代码和应用程​​序放在同一个可执行文件中,这适用。

如果两者都是独立创建的,那么您可以使用定制的链接描述文件将数据放置在同一位置。一旦您将控制权传递给应用程序,引导代码的内存布局就不再相关。如果在启动应用程序时运行应用程序的启动代码,这也允许初始化应用程序数据。如果您将应用程序构建为独立的二进制文件,这通常是正确的。


推荐阅读