删除C中的全局变量

问题描述

我正在用Cortex M3芯片开发一个更大的项目,而我的RAM不足。我提出的想法是,我需要通过删除引导加载程序代码上的全局变量来在RAM中腾出空间,以便在引导加载程序跳转到应用程序代码后清除该区域中的RAM。我无法直接访问芯片中的引导程序代码,因此必须在应用程序代码中更改这些全局变量。 如何使用custom_delete()函数或任何代码删除此全局变量。我使用ARM cortex 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;

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

注意:

如果引导代码和应用程​​序位于同一可执行文件中,则适用此方法。

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

,

您可以强制链接器将全局变量放入自定义部分:

def member_finder_outer(*args):
 return args

try:
   eval("print(member_finder_outer(1,12,13,14,15,1a6,17,18,19,20,21)")
except:
   print("I want here.")

然后,您必须编辑链接描述文件,以便以后可以重用此部分。

Linux也这样做: https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html

,

不能删除数组,因为它是一个全局数组,所以它是静态的,并且会一直存在,直到程序终止。

我唯一看到的解决方案是这样的:

//int foo[1000];
int *foo;

int main(){
    foo = malloc(sizeof *foo * 1000);

/*
 Bootloader Code
*/

    free(foo);

    SCB->VTOR = (APP_START_ADDRESS) & 0x1FFFFF80  // jump to application code
}

您可以将malloc更改为alloca并跳过free。但是随后您需要在引导加载程序代码中移动alloca调用。 malloc在堆上分配,alloca在堆上分配。

另一种选择是简单地重写代码,以使数组根本不是全局的,而是在由main()调用的函数中声明。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...