Jump to content
    

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

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

 

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

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

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

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

 

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

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

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

 

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

 

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

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

 

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

 

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

startup_MK60N512MD100.zip

 

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

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

 

Share this post


Link to post
Share on other sites

Т.е. взять стартап программы Б, создать в нем 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.

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...