Я пытаюсь создать решение, в котором будет два проекта: «загрузчик» (запуск после сброса и выполнение чего-либо) и «mainApplication», получающий элемент управления из загрузчика.
Первоначально я только что воспроизвел пример отсюда:
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 и сделать так, чтобы содержимое не было каким-либо образом включено в окончательный двоичный файл?
Кроме того, с нетерпением жду - если говорить о простом персонале, таком как показанная функция суммы, который использует только стек, то это только проблема компоновщика, но если я хочу создать некий «системный сервис», скажем, одиночный объект с некоторой кучей использования, тогда возникает вопрос - есть ли хороший способ заморозить часть кучи, используемой этим объектом, при передаче управления из загрузчика, где он был создан, в главное приложение, которое должно его использовать ...