c - C 函数的内存布局

标签 c memory architecture iar

我想要创建一个软件,其中某些功能(或 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;
}

这里,函数f1f2等都将位于变量代码的固定位置,因此可以从基本代码中调用。一旦代码块的最终版本被闪现,他们就会调用他们的最终版本。

<小时/> 注意:我不确定如何处理放置在基本代码区域中的标准库中的变量代码调用函数。变量 block 的链接器必须重复加载变量代码中的函数,或者必须知道其在基本代码区域中的绝对位置。您应该检查链接器/加载器文档。

关于c - C 函数的内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53559377/

相关文章:

快速排序中的计数比较 : Wrong answer

c - 如何始终使错误的 C 程序出现段错误?

r - 意外的 R 内存管理行为

multithreading - 如何可视化多线程进程?

c# - 如何在 Web 服务器和站点服务器之间建立双向通信?

web-services - 为什么在 "ENTERPRISE"应用程序中使用 SOAP over JSON 和自定义数据格式?

c++ - vsnprintf 来自数组中的确切值

c - 使用 "while loop"而不是使用 "for loop"删除链表中的节点时出现错误

linux - vm_area_struct 中的 start_data、end_data 和类似字段 : vm_start, vm_end

c++ - 编译器在处理 volatile 内存位置时必须遵循哪些规则?