有时候我们需要将一些 S T M 32 STM32 STM32单片机上面的 A P I API API接口生成 B I N BIN BIN文件的形式给别人进行调用,下面介绍的方法可以使得生成的 B I N BIN BIN文件尽可能的小且方便调用。这里假设我们生成 A P I API API接口 B I N BIN BIN文件的工程布局如图1所示,其中 a p i . c api.c api.c文件里面就是我们准备给别人使用的 A P I API API接口。
![](https://img-blog.csdnimg.cn/direct/42a7b4d55d454d72898bcf6043894ece.png)
a p i . c api.c api.c文件源码如下所示,这里假设只有两个 A P I API API接口(在实际应用中可以扩展为多个接口,这里只是一个示例,没有限制说只能是两个 A P I API API接口),为了实现使得生成的 B I N BIN BIN文件尽可能的小且方便调用,这里额外的定义了一个用来存储每个接口的函数指针的结构体并定义了一个对应的结构体变量且初始化为每一个 A P I API API接口的函数指针,然后我们将这个结构体变量放到 A P I API API接口对应的 B I N BIN BIN文件存放的存储区域的起始地址(这里假设从地址 0 x 20008000 0x20008000 0x20008000开始存放),这样就可以实现使得生成的 B I N BIN BIN文件尽可能的小且方便调用。
#include "api.h"
typedef const struct
{
int (*user_api1)(int para1, int para2);
float (*user_api2)(float para1, float para2);
}API_ADDRESS;
int api1(int para1, int para2)
{
int result=0;
result=para1+para2;
return result;
}
float api2(float para1, float para2)
{
float result=0;
result=para1-para2;
return result;
}
API_ADDRESS my_api_address __attribute__((section("BIN_FILE_START")))=
{
api1,
api2
};
为了实现以上目的需要用到 s c t sct sct文件,这里的工程对应的 s c t sct sct文件如下所示:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM 0x08000000 0x00080000
{
ER_IROM 0x08000000 0x00080000
{
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM 0x20000000 0x00008000
{
.ANY (+RW +ZI)
}
}
LR_API 0x20008000 0x00008000
{
ER_API 0x20008000 0x00008000
{
*.o(BIN_FILE_START, +First)
api.o(+RO)
}
}
生成的两个 B I N BIN BIN文件如图2所示,图2中红圈中的 B I N BIN BIN文件就是 A P I API API接口对应的 B I N BIN BIN文件,这个 B I N BIN BIN文件的内容如图3所示,最前面两个字的内容就是我们这里定义的两个 A P I API API接口的函数指针。
![](https://img-blog.csdnimg.cn/direct/b1cabe3edefb4433b4848bb2683cdc24.png)
![](https://img-blog.csdnimg.cn/direct/76decbf3c41a497098f6183237d1f913.png)
假设现在已经拿到了 B I N BIN BIN文件并且将 B I N BIN BIN文件下载到了对应的存储空间区域,此时如果需要调用 B I N BIN BIN文件里面的 A P I API API接口我们可以这样操作,定义一个指向前面定义的存储每个接口的函数指针的结构体的指针变量且赋值为 B I N BIN BIN文件下载区域的起始地址(这里是地址 0 x 20008000 0x20008000 0x20008000),然后对每个接口的调用就很简单了,可以像是调用普通的函数一样调用。工程在这里。
API_ADDRESS *p_my_api_address=0x20008000;
p_my_api_address->api1(1,2);
p_my_api_address->api1(10.0,2.0);