我想创建一个软件,稍后可以在我的微控制器上对某些功能(或模块)进行编程,而不必再次重新刷新整个软件(刷新将通过通信接口(例如SPI)完成)。新块将具有相同的API(例如,作为参数的5个字节,返回的1个字节)。
内存架构将如下图所示组织: https://gist.github.com/DeanCording/1541bcbba48bb088ec1503dba109f63c
总而言之,FBL和APPL块在MCU上只能编程1次。在此过程的后期,我希望可以对已创建的块(块1,块2 ...)中的某些功能进行编程或更改。
对于每个区块,我都有:
当前,我的问题是我无法创建一个包含所有函数内容的内存块。例如,如果我想在新块中使用math.h中的函数,则链接器会将math.h函数放在我的APPL扇区中,而不是在该块专用的已分配内存扇区中。但是正如我所说,我的APPL扇区不应更改,因为它只能被编程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;
}
在这里,功能f1
,f2
等将全部位于变量代码的固定位置,因此可以从基本代码中调用。刷新代码块的最终版本后,他们将调用其最终版本。