Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Два проекта на одном кристалле
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
svl
Здравствуйте коллеги.

Есть две программы, А и Б.
Программа А представляет собой не только загрузчик, но и содержит различные "полезные" функции; криптография, PRNG, CRC, etc.
Загрузчик по какому нибудь комбинаторному состоянию, загружает проект (программа Б) в память и передает ей управление, стандартная операция, тут вопросов нет.
Вопрос в следующем, как из программы Б, вызвать эти "полезные" функции программы А?

У Кейла примеров и описаний данного изврата не нашел, а может плохо искал...
Про сохранение стека, счетчик команд, размещение функции по указанному адресу и т.д. это понятно, но не достаточно.
Язык С, компилятор Keil, чип Cortex-M4.

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

Заранее спасибо.
aaarrr
Цитата(svl @ Jul 4 2011, 16:46) *
Про сохранение стека, счетчик команд, размещение функции по указанному адресу и т.д. это понятно, но не достаточно.

Лучше не функции по определенным адресам размещать, а указатели на них. Вполне надежное и проверенное временем решение.
Ну, или используйте SVC.
ar__systems
Цитата(svl @ Jul 4 2011, 08:46) *
Здравствуйте коллеги.

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

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


Собрать их в один проект, и никакого изврата.
zltigo
QUOTE (ar__systems @ Jul 4 2011, 20:14) *
Собрать их в один проект, и никакого изврата.

Никчемный "совет" никак не относящийся к заданному вопросу sad.gif.
QUOTE (aaarrr @ Jul 4 2011, 16:01) *
Вполне надежное и проверенное временем решение.

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

Что для вызова функции ничем принципиально не отличается от предыдущего варианта.
svl
Цитата
Цитата(aaarrr @ Jul 4 2011, 16:01) *

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

Цитата(zltigo @ Jul 4 2011, 20:42) *
Я бы сказал естественное. Например, в startup сразу после таблицы векторов. Точка входа может быть и одной общей.


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

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

Вот стартап дефолтный.
Нажмите для просмотра прикрепленного файла

Цитата(aaarrr @ Jul 4 2011, 16:01) *
Ну, или используйте SVC.

Это как я понимаю, при условии использования RTX.
aaarrr
Цитата(svl @ Jul 5 2011, 14:50) *
Т.е. взять стартап программы Б, создать в нем 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);



Цитата(svl @ Jul 5 2011, 14:50) *
Это как я понимаю, при условии использования RTX.

Совсем не обязательно.
svl
Спасибо за помощь и Ваши рекомендации, Уважаемый aaarrr! sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.