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