|
|
  |
Два проекта на одном кристалле |
|
|
|
Jul 4 2011, 12:46
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-12-07
Пользователь №: 33 465

|
Здравствуйте коллеги.
Есть две программы, А и Б. Программа А представляет собой не только загрузчик, но и содержит различные "полезные" функции; криптография, PRNG, CRC, etc. Загрузчик по какому нибудь комбинаторному состоянию, загружает проект (программа Б) в память и передает ей управление, стандартная операция, тут вопросов нет. Вопрос в следующем, как из программы Б, вызвать эти "полезные" функции программы А?
У Кейла примеров и описаний данного изврата не нашел, а может плохо искал... Про сохранение стека, счетчик команд, размещение функции по указанному адресу и т.д. это понятно, но не достаточно. Язык С, компилятор Keil, чип Cortex-M4.
Может кто сталкивался с такой задачей?
Заранее спасибо.
|
|
|
|
|
Jul 4 2011, 17:42
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (ar__systems @ Jul 4 2011, 20:14)  Собрать их в один проект, и никакого изврата. Никчемный "совет" никак не относящийся к заданному вопросу  . QUOTE (aaarrr @ Jul 4 2011, 16:01)  Вполне надежное и проверенное временем решение. Я бы сказал естественное. Например, в startup сразу после таблицы векторов. Точка входа может быть и одной общей. QUOTE Ну, или используйте SVC. Что для вызова функции ничем принципиально не отличается от предыдущего варианта.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 5 2011, 10:50
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 20-12-07
Пользователь №: 33 465

|
Цитата Цитата(aaarrr @ Jul 4 2011, 16:01)  Лучше не функции по определенным адресам размещать, а указатели на них. Вполне надежное и проверенное временем решение.
Цитата(zltigo @ Jul 4 2011, 20:42)  Я бы сказал естественное. Например, в startup сразу после таблицы векторов. Точка входа может быть и одной общей. Спасибо за ответ. Т.е. взять стартап программы Б, создать в нем AREA и прописать импорт имен функций по адресам расположенных в программе А? Вот стартап дефолтный.
startup_MK60N512MD100.zip ( 4.35 килобайт )
Кол-во скачиваний: 99Цитата(aaarrr @ Jul 4 2011, 16:01)  Ну, или используйте SVC. Это как я понимаю, при условии использования RTX.
|
|
|
|
|
Jul 5 2011, 11:28
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(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. Совсем не обязательно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|