如果将固件区单独分为一个区,可以让无论程序运行在A区或者B区时,都可以调用固件区的模块,这样就相当于可以将固件区的空间复用,提高了空间利用率。
固件区与APP区分开的可行性原理
对于一些嵌入式软件的初学者来说可能会有一些困惑,如果这些模块都不和APP在同一个project中编译,如何被app调用。任何一个函数都是以二进制的方式存储在Flash上的,如果用相同的编译器和编译参数,在同一MCU平台上,无论该函数被放置在什么地址,或者是被那个target或是project编译,其最后存储的二进制代码都是一样的。因此一个嵌入式APP软件只要知道一个函数的类型声明和在Flash位置,就可以直接调用该函数。
如何将函数放在Flash的固定区域
首先我们说一下如何将一个函数甚至是一个模块放在Flash的固定位置。由于笔者一般都是用keil,因此以下的方法都是基于keil环境:
方法一:
如果只有一个函数,我们可以在函数声明的时候在函数末尾加上__attribute__((section(“.ARM.__at_0xXXXXXXXX”)))的语句,将某个函数编译后固定存放在Flash的固定位置。
void function(void) __attribute__((section(".ARM.__at_0xXXXXXXXX")));
void function(void)
{
...
}
方法二:
如果要将几个函数一起放在一块区域内,那就不太可能使用方法一了,我们没法提前知道这些函数的长度,就算知道这些函数的长度,还要手动