问题描述
我正在用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()
调用的函数中声明。