svl.soft 0 4 июля, 2011 Опубликовано 4 июля, 2011 · Жалоба Здравствуйте коллеги. Есть две программы, А и Б. Программа А представляет собой не только загрузчик, но и содержит различные "полезные" функции; криптография, PRNG, CRC, etc. Загрузчик по какому нибудь комбинаторному состоянию, загружает проект (программа Б) в память и передает ей управление, стандартная операция, тут вопросов нет. Вопрос в следующем, как из программы Б, вызвать эти "полезные" функции программы А? У Кейла примеров и описаний данного изврата не нашел, а может плохо искал... Про сохранение стека, счетчик команд, размещение функции по указанному адресу и т.д. это понятно, но не достаточно. Язык С, компилятор Keil, чип Cortex-M4. Может кто сталкивался с такой задачей? Заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 56 4 июля, 2011 Опубликовано 4 июля, 2011 · Жалоба Про сохранение стека, счетчик команд, размещение функции по указанному адресу и т.д. это понятно, но не достаточно. Лучше не функции по определенным адресам размещать, а указатели на них. Вполне надежное и проверенное временем решение. Ну, или используйте SVC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slavka012 0 4 июля, 2011 Опубликовано 4 июля, 2011 · Жалоба Здравствуйте коллеги. Есть две программы, А и Б. Заранее спасибо. Собрать их в один проект, и никакого изврата. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 4 июля, 2011 Опубликовано 4 июля, 2011 · Жалоба Собрать их в один проект, и никакого изврата. Никчемный "совет" никак не относящийся к заданному вопросу :(. Вполне надежное и проверенное временем решение. Я бы сказал естественное. Например, в startup сразу после таблицы векторов. Точка входа может быть и одной общей. Ну, или используйте SVC. Что для вызова функции ничем принципиально не отличается от предыдущего варианта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
svl.soft 0 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба Лучше не функции по определенным адресам размещать, а указатели на них. Вполне надежное и проверенное временем решение. Я бы сказал естественное. Например, в startup сразу после таблицы векторов. Точка входа может быть и одной общей. Спасибо за ответ. Т.е. взять стартап программы Б, создать в нем AREA и прописать импорт имен функций по адресам расположенных в программе А? Вот стартап дефолтный. startup_MK60N512MD100.zip Ну, или используйте SVC. Это как я понимаю, при условии использования RTX. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 56 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба Т.е. взять стартап программы Б, создать в нем 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. Совсем не обязательно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
svl.soft 0 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба Спасибо за помощь и Ваши рекомендации, Уважаемый aaarrr! :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться