我正在使用一个STM32F103C8来开发一个最小的游戏控制台,问题是我想要构建一个单独的项目,其中包括一个“游戏开发库”,它将包括用于控制屏幕、音频、输入等的API。基本上,每个“游戏开发工作室”都使用一个游戏开发框架来构建它的游戏,但是这些函数需要使用驻留在核心中的实际驱动程序(隐藏在游戏开发人员面前),如何访问我的内部驱动程序来为某些函数提供外部API。
如何在不同的bin文件之间建立链接?
发布于 2022-10-03 08:56:34
首先,请注意,简单地以头文件的形式将完整的源代码交给API,然后让用户将其与他们的程序链接在一起,是目前为止最简单的解决方案。
尽管如此,在不同的Cortex M上确实存在类似的解决方案,在这里,硅厂商将固件放置在不可访问的内存位置--最典型的是引导加载器的驱动程序,隐藏flash/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记录库可以做到(?)
https://stackoverflow.com/questions/73921021
复制相似问题