C函数的内存布局
Memory placements of C-function
我想创建一个软件,稍后可以在我的微控制器上对某些功能(或块)进行编程,而无需再次重新刷新整个软件(闪存将通过通信接口完成,例如 SPI)。新块都将具有相同的 API(例如 5 个字节作为参数,返回 1 个字节)。
内存架构将如下图所示组织:
memory architecture
总而言之,FBL 和 APPL 块将仅在 MCU 上编程 1 次。在此过程的后期,我希望有可能在创建的块(BLOCK 1,BLOCK 2 ...)中编程或更改某些功能
对于每个块,我有:
- 2 段 flash(一段用于 init 函数,一段用于 "task" 函数)。
- 1 段 RAM,我可以在其中放置我的静态变量。
目前,我的问题是我无法创建包含函数所有内容的单个内存块。例如,如果我想在我的新块中使用来自 math.h 的函数,链接器会将 math.h 函数放在我的 APPL 扇区中,而不是在专用于该块的已分配内存扇区中。但正如我所说,我的 APPL 扇区不应该改变,因为它只会被编程 1 次。所以我想知道如何编写一些 "independents" 块...
非常感谢!
您必须确保您需要的标准库的所有函数至少被调用一次,因此将包含在您的二进制基本代码中。
对于您的 "variable" 代码,您必须在块的开头有一种跳转 table。您的基本代码调用变量代码中的函数,跳转 table 跳转到实际函数输入点(或者您可以有包装函数),例如:
char f1(int a, int b) { return _f1(a,b)}
char f2(int a, int b) { return _f2(a,b)}
char _f1(int a, int b) { return 0;} /* function not yet developed */
char _f2(int a, int b) { return 0;} /* function not yet developed */
并且在曾经开发的代码中:
char f1(int a, int b) { return _f1(a,b)}
char f2(int a, int b) { return _f2(a,b)}
char _f1(int a, int b) {
/* lots of complex stuff */
return result;
}
char _f2(int a, int b) {
/* lots of complex stuff */
return result;
}
这里,f1
、f2
等函数都在可变代码的固定位置,可以从基本代码中调用。一旦代码块的最终版本被闪现,他们就调用他们的最终版本。
注意:我不确定如何处理放置在基本代码区域中的标准库中的可变代码调用函数。变量块的链接器必须复制加载变量代码中的函数,或者必须知道它在基本代码区域中的绝对位置。您应该查看 linker/loader 文档。
我想创建一个软件,稍后可以在我的微控制器上对某些功能(或块)进行编程,而无需再次重新刷新整个软件(闪存将通过通信接口完成,例如 SPI)。新块都将具有相同的 API(例如 5 个字节作为参数,返回 1 个字节)。
内存架构将如下图所示组织: memory architecture
总而言之,FBL 和 APPL 块将仅在 MCU 上编程 1 次。在此过程的后期,我希望有可能在创建的块(BLOCK 1,BLOCK 2 ...)中编程或更改某些功能
对于每个块,我有:
- 2 段 flash(一段用于 init 函数,一段用于 "task" 函数)。
- 1 段 RAM,我可以在其中放置我的静态变量。
目前,我的问题是我无法创建包含函数所有内容的单个内存块。例如,如果我想在我的新块中使用来自 math.h 的函数,链接器会将 math.h 函数放在我的 APPL 扇区中,而不是在专用于该块的已分配内存扇区中。但正如我所说,我的 APPL 扇区不应该改变,因为它只会被编程 1 次。所以我想知道如何编写一些 "independents" 块...
非常感谢!
您必须确保您需要的标准库的所有函数至少被调用一次,因此将包含在您的二进制基本代码中。
对于您的 "variable" 代码,您必须在块的开头有一种跳转 table。您的基本代码调用变量代码中的函数,跳转 table 跳转到实际函数输入点(或者您可以有包装函数),例如:
char f1(int a, int b) { return _f1(a,b)}
char f2(int a, int b) { return _f2(a,b)}
char _f1(int a, int b) { return 0;} /* function not yet developed */
char _f2(int a, int b) { return 0;} /* function not yet developed */
并且在曾经开发的代码中:
char f1(int a, int b) { return _f1(a,b)}
char f2(int a, int b) { return _f2(a,b)}
char _f1(int a, int b) {
/* lots of complex stuff */
return result;
}
char _f2(int a, int b) {
/* lots of complex stuff */
return result;
}
这里,f1
、f2
等函数都在可变代码的固定位置,可以从基本代码中调用。一旦代码块的最终版本被闪现,他们就调用他们的最终版本。
注意:我不确定如何处理放置在基本代码区域中的标准库中的可变代码调用函数。变量块的链接器必须复制加载变量代码中的函数,或者必须知道它在基本代码区域中的绝对位置。您应该查看 linker/loader 文档。