Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Взаимодействие двух программ
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
theBMV
Добрый день!
Решаю вопрос о взаимодействии двух программ в памяти одного микроконтроллера, а именно загрузчика и основной программы. Основная программа должна иметь возможность вызывать функции загрузчика. Реализаций тут я вижу 3:

1. Явное указание адресов функций в загрузчике
Код
__attribute__((address(0x9D000000)))
int foo()
{
  ...
}

Но при таком методе нужно следить за размерами функций, если их больше одной. Чтобы не налезали друг на друга и чтобы между ними не было неиспользуемых участков памяти. А это двойная компиляция (1-й раз определить размер, 2-й раз подогнать адреса) и исправления в проекте основной программы.
Либо просто, без явного указания адресов функций, компиляция с последующим определением адресов функций и исправлением в проекте основной программы.

2. То же, что и 1-й вариант, но будет всего одна функция, 1-ым параметром которой будет индекс нужной функции из какого-нибудь списка.

3. Явное указание адреса массива указателей на функции
Код
__attribute__((address(0x9D000000)))
const int (*foo)()[] = {
  foo1,
  foo2,
  foo3
};

int foo1()
{
  ...
}

int foo2()
{
  ...
}

int foo3()
{
  ...
}

но так у меня почему-то программа выпадает в exception, скорее всего из-за того, что эта константа выбивается из секции констант или я что-то неправильно делаю. Подскажите, что сделать, чтобы работало, т.к. этот вариант мне нравится больше всего.

Подскажите, как сделать наиболее грамотно?
Valentine Loginov
Я думаю смогу помочь Вам с решением проблемы, пишите в личку, обменяемся контактами!
theBMV
Думаю, что разобрался. Надо использовать space(prog) и разместить табличку где-нибудь в конце:
Код
const int (*foo)()[] = {
  foo1,
  foo2,
  foo3
}__attribute__(space(prog), (address(0x9D000F00)));
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.