c语言 - 嵌入式设计 - 外部软件使用内部软件 API



我正在使用STM32F103C8开发一个最小的游戏机问题是我想建立一个单独的项目;游戏开发库";它将包括用于控制屏幕、音频、输入等的API。。基本上是用于游戏开发的框架;game dev studio";使用来构建它的游戏,但是这些功能需要使用驻留在核心中的实际驱动程序(对游戏开发者隐藏(,我如何访问我的内部驱动程序来为一些功能提供外部API

如何在不同的bin文件之间建立链接?

首先请注意,简单地将完整的源代码以头文件的形式交给API,然后让用户将其与他们的程序链接在一起,是迄今为止最简单的解决方案。

话虽如此,但各种Cortex M上确实存在类似的解决方案,硅供应商将固件放置在不可访问的内存位置,最典型的是用于引导加载程序的驱动程序,隐藏闪存/eeprom驱动程序以及串行总线驱动程序。这依赖于那些在固定的物理内存位置编程的函数,在这些位置,函数是使用与调用它们的C代码相同的调用约定(可能是ARM EABI(编写的。

类似地,您可以使用自定义链接器脚本将API链接到固定的绝对内存位置,然后使用函数指针强制转换提供访问。下面是一些伪代码示例,使用类似gcc的语法。

内部实现,用户不可用:

void mylib_init (void) __attribute__((section(".mylib_init")));

公共API无法访问标识符mylib_init,因此必须创建它:

#define MYLIB_INIT_ADDRESS 0x12345678u // physical address of .mylib_init
typedef void mylib_init_t (void);
#define mylib_init ((mylib_init_t* const) MYLIB_INIT_ADDRESS)

// usage:
#include "public_api.h"
...
mylib_init();

您最好只使用一个二进制文件,因为一次下载两个不同的二进制文件,对不同的区域进行编程,会很痛苦。很可能(在那里做过(,但不必要的复杂。也许可以用一些方便的工具合并两个.bin文件,也许GNU s记录库可以做到这一点(?(。

最新更新