Перейти к содержанию
    

Два проекта на одном кристалле

Здравствуйте коллеги.

 

Есть две программы, А и Б.

Программа А представляет собой не только загрузчик, но и содержит различные "полезные" функции; криптография, PRNG, CRC, etc.

Загрузчик по какому нибудь комбинаторному состоянию, загружает проект (программа Б) в память и передает ей управление, стандартная операция, тут вопросов нет.

Вопрос в следующем, как из программы Б, вызвать эти "полезные" функции программы А?

 

У Кейла примеров и описаний данного изврата не нашел, а может плохо искал...

Про сохранение стека, счетчик команд, размещение функции по указанному адресу и т.д. это понятно, но не достаточно.

Язык С, компилятор Keil, чип Cortex-M4.

 

Может кто сталкивался с такой задачей?

 

Заранее спасибо.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про сохранение стека, счетчик команд, размещение функции по указанному адресу и т.д. это понятно, но не достаточно.

Лучше не функции по определенным адресам размещать, а указатели на них. Вполне надежное и проверенное временем решение.

Ну, или используйте SVC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте коллеги.

 

Есть две программы, А и Б.

 

Заранее спасибо.

 

Собрать их в один проект, и никакого изврата.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Собрать их в один проект, и никакого изврата.

Никчемный "совет" никак не относящийся к заданному вопросу :(.

Вполне надежное и проверенное временем решение.

Я бы сказал естественное. Например, в startup сразу после таблицы векторов. Точка входа может быть и одной общей.

Ну, или используйте SVC.

Что для вызова функции ничем принципиально не отличается от предыдущего варианта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Лучше не функции по определенным адресам размещать, а указатели на них. Вполне надежное и проверенное временем решение.

Я бы сказал естественное. Например, в startup сразу после таблицы векторов. Точка входа может быть и одной общей.

Спасибо за ответ.

 

Т.е. взять стартап программы Б, создать в нем AREA и прописать импорт имен функций по адресам расположенных в программе А?

 

Вот стартап дефолтный.

startup_MK60N512MD100.zip

 

Ну, или используйте SVC.

Это как я понимаю, при условии использования RTX.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Т.е. взять стартап программы Б, создать в нем AREA и прописать импорт имен функций по адресам расположенных в программе А?

И получите ошибку.

 

В программе A создаете по определенному адресу (скажем, 0x100) таблицу указателей на функции. Например, в стартапе:

    IMPORT func1
    IMPORT func2
    IMPORT func3
    ...
    DCD func1
    DCD func2
    DCD func3

 

В программе B объявляете константный указатель на структуру с нужным значением адреса, затем вызываете функции через этот указатель:

struct
{
    void (*func1)(void);
    int (*func2)(int, int);
    int (*func3)(void);
} * const bfuncs = (void*)0x100;

...

X = bfuncs->func2(1, 2);

 

 

Это как я понимаю, при условии использования RTX.

Совсем не обязательно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...