我想要创建一个软件,其中某些功能(或 block )可以稍后在我的微 Controller 上进行编程,而无需再次重新刷新整个软件(刷新将通过通信接口(interface)(例如 SPI)完成)。新 block 都将具有相同的 API(例如 5 个字节作为参数,1 个字节返回)。
内存架构将如下图所示进行组织: memory architecture
总而言之,FBL 和 APPL block 仅在 MCU 上编程 1 次。在此过程的后期,我希望能够对创建的 block ( block 1、 block 2 ...)中的某些功能进行编程或更改
对于每个 block ,我有:
- 闪存的 2 个部分(一个用于 init 函数,一个用于“任务”函数)。
- RAM 的 1 部分,我可以在其中放置静态变量。
目前,我的问题是我无法创建一个包含函数所有内容的内存块。例如,如果我想在新 block 中使用 math.h 中的函数,链接器会将 math.h 函数放置在我的 APPL 扇区中,而不是放置在专用于该 block 的已分配内存扇区中。但正如我所说,我的 APPL 扇区不应更改,因为它只会被编程 1 次。所以我想知道如何编写一些“独立” block ......
非常感谢!
最佳答案
您必须确保您需要的标准库的所有函数至少被调用一次,因此将包含在您的二进制基本代码中。
对于您的“变量”代码,您必须在 block 的开头有一种跳转表。您的基本代码调用变量代码中的函数,跳转表跳转到实际的函数入口点(或者您可以使用包装函数),例如:
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
等都将位于变量代码的固定位置,因此可以从基本代码中调用。一旦代码块的最终版本被闪现,他们就会调用他们的最终版本。
关于c - C 函数的内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53559377/