реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Два проекта на одном кристалле
svl
сообщение Jul 4 2011, 12:46
Сообщение #1


Участник
*

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



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

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

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

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

Заранее спасибо.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 4 2011, 13:01
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Лучше не функции по определенным адресам размещать, а указатели на них. Вполне надежное и проверенное временем решение.
Ну, или используйте SVC.
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Jul 4 2011, 17:14
Сообщение #3


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(svl @ Jul 4 2011, 08:46) *
Здравствуйте коллеги.

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

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


Собрать их в один проект, и никакого изврата.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 4 2011, 17:42
Сообщение #4


Гуру
******

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



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

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

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

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
svl
сообщение Jul 5 2011, 10:50
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 5 2011, 11:28
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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.

Совсем не обязательно.
Go to the top of the page
 
+Quote Post
svl
сообщение Jul 5 2011, 11:40
Сообщение #7


Участник
*

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



Спасибо за помощь и Ваши рекомендации, Уважаемый aaarrr! sm.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 08:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01408 секунд с 7
ELECTRONIX ©2004-2016