Решаю вопрос о взаимодействии двух программ в памяти одного микроконтроллера, а именно загрузчика и основной программы. Основная программа должна иметь возможность вызывать функции загрузчика. Реализаций тут я вижу 3:
1. Явное указание адресов функций в загрузчике
Код
__attribute__((address(0x9D000000)))
int foo()
{
...
}
int foo()
{
...
}
Но при таком методе нужно следить за размерами функций, если их больше одной. Чтобы не налезали друг на друга и чтобы между ними не было неиспользуемых участков памяти. А это двойная компиляция (1-й раз определить размер, 2-й раз подогнать адреса) и исправления в проекте основной программы.
Либо просто, без явного указания адресов функций, компиляция с последующим определением адресов функций и исправлением в проекте основной программы.
2. То же, что и 1-й вариант, но будет всего одна функция, 1-ым параметром которой будет индекс нужной функции из какого-нибудь списка.
3. Явное указание адреса массива указателей на функции
Код
__attribute__((address(0x9D000000)))
const int (*foo)()[] = {
foo1,
foo2,
foo3
};
int foo1()
{
...
}
int foo2()
{
...
}
int foo3()
{
...
}
const int (*foo)()[] = {
foo1,
foo2,
foo3
};
int foo1()
{
...
}
int foo2()
{
...
}
int foo3()
{
...
}
но так у меня почему-то программа выпадает в exception, скорее всего из-за того, что эта константа выбивается из секции констант или я что-то неправильно делаю. Подскажите, что сделать, чтобы работало, т.к. этот вариант мне нравится больше всего.
Подскажите, как сделать наиболее грамотно?