我正在尝试构建一个解决方案,其中将有两个项目:“引导加载程序”(在重置后开始并执行 smth)和“主应用程序”从引导加载程序获取控制。
最初我刚刚从这里复制了这个例子: https ://visualgdb.com/tutorials/arm/bootloader/
本教程的最后一部分描述了“系统调用”——将指向驻留在引导加载程序中的某个函数的指针传递给主应用程序,然后从那里调用该函数。
目的不是传递指向函数的指针,而是传递指向类对象的指针。
教程中的修改示例如下所示:
引导加载程序:
//sys.h
class SysCalls
{
public:
SysCalls();
int sum(int, int);
};
//sys.cpp
#include "sys.h"
SysCalls::SysCalls()
{
}
int SysCalls::sum(int a, int b)
{
return a + b;
}
// main.cpp
#include <sys.h>
...
SysCalls _sys;
void *g_Syscalls[] __attribute__((section(".syscalls"))) = { (void *)&_sys };
主要应用:
//main.cpp
#include <sys.h> // the same header as in bootloader
extern "C" void *g_Syscalls[];
SysCalls *_sys = (SysCalls*) g_Syscalls[0];
int main(void)
{
...
int sum = _sys->sum(1, 2);
...
我收到链接器错误:
undefined reference to `SysCalls::sum(int, int)'
这是可以预见的,但是...
有什么好的方法来构建这个,我想知道吗?一些链接器配置?或者我应该也将 sys.cpp 包含到 mainApplication 中,并以某种方式使内容不包含在最终二进制文件中?
另外,期待 - 如果谈论简单的工作人员,如显示的 sum 函数,它只使用堆栈,这只是一个链接器问题,但如果我想创建一种“系统服务”,比如使用一些堆的单例对象,那么问题是 - 如果有任何好的方法可以在将控制权从引导加载程序转移到主应用程序时冻结该对象使用的堆部分,主应用程序应该使用它......