C功能的内存位置

时间:2018-11-30 14:24:10

标签: c memory architecture iar

我想创建一个软件,稍后可以在我的微控制器上对某些功能(或模块)进行编程,而不必再次重新刷新整个软件(刷新将通过通信接口(例如SPI)完成)。新块将具有相同的API(例如,作为参数的5个字节,返回的1个字节)。

内存架构将如下图所示组织: https://gist.github.com/DeanCording/1541bcbba48bb088ec1503dba109f63c

总而言之,FBL和APPL块在MCU上只能编程1次。在此过程的后期,我希望可以对已创建的块(块1,块2 ...)中的某些功能进行编程或更改。

对于每个区块,我都有:

  • 闪存的2个部分(一个用于init函数,一个用于“任务”函数)。
  • RAM的1个部分,我可以放置我的静态变量。

当前,我的问题是我无法创建一个包含所有函数内容的内存块。例如,如果我想在新块中使用math.h中的函数,则链接器会将math.h函数放在我的APPL扇区中,而不是在该块专用的已分配内存扇区中。但是正如我所说,我的APPL扇区不应更改,因为它只能被编程1次。所以我想知道如何编写一些“独立”块...

非常感谢!

1 个答案:

答案 0 :(得分:0)

您必须确保至少需要一次调用标准库的所有函数,因此它们将包含在您的二进制基本代码中。

对于您的“变量”代码,您必须在块的开头具有一种跳转表。您的基本代码会在变量代码中调用该函数,并且跳转表会跳转到实际的函数入口点(或者您可以具有包装器函数),例如:

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等将全部位于变量代码的固定位置,因此可以从基本代码中调用。刷新代码块的最终版本后,他们将调用其最终版本。


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