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

 
 
> Технология динамической загрузки модулей для RTOS, Какие есть методы и инструменты.
AlexandrY
сообщение Dec 29 2012, 21:48
Сообщение #1


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Как-то тут проскочила мысль, что настоящая операционная система должна грузить сторонние приложения и выполнять их.

Очевидно, что это реализовать для небольших проектов и даже не с ОС совершенно элементарно.
Для этого при компиляции основного ядра делают symbol definition file и потом этот файл и файлы хидеров передают третьей стороне чтобы те могли правильно скомпилировать и слинковать свои приложения для ядра.

Но когда в ядре количество функций переваливает за тысячу, то сделать переносимые хидеры в ручную представляется проблемой.
Также желательно сделать отдельный модуль с так называемой jump table чтобы уменьшить зависимость от мелких изменений и перекомпиляций ядра. Как-то подумать о фильтрации, чтобы не все подряд сущности из ядра попадали в symbol definition file и т.д.

И тогда вопрос - заморачивается ли кто-нибудь с этим и известны ли инструменты автоматизации всего этого процесса.


Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
desh
сообщение Jan 13 2013, 07:56
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 113
Регистрация: 25-10-07
Из: Краснодар
Пользователь №: 31 725



Контики от А. Дункельса и компании поддерживает загрузку модулей через elf для AVR, MSP430, x86 и др.
Ознакомиться с исходниками можно в contiki-2.6\core\loader\.
Сайт проекта http://www.contiki-os.org/
Go to the top of the page
 
+Quote Post
SyncLair
сообщение Jan 18 2013, 19:30
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197



Цитата(desh @ Jan 13 2013, 11:56) *
Контики от А. Дункельса и компании поддерживает загрузку модулей через elf для AVR, MSP430, x86 и др.
Ознакомиться с исходниками можно в contiki-2.6\core\loader\.
Сайт проекта http://www.contiki-os.org/

для AVR он немного "испортил" эльф и сделал его 16-и битным

Цитата(neiver @ Jan 16 2013, 19:01) *
Насчёт взаимодействия загружаемого модуля и ядра, моногие ARM-ы, например, имеют команду SVC - Supervisor Call, которая вызывает соответствующий .....

Вот этот пример показывает разницу между ABI и API ибо в первом случае чётко определены параметры вызовов и поэтому любая "прикладная задача" в ОС может воспользоваться функциями. Вопрос только в с ледующем а как же быть если есть задача и библиотека, и сначала грузиться библиотека а потом задача? и функции библиотеки не определены в SVC.


И на последок:

Координальное на мой взгляд решение в ембеддед мире -- специально готовить исполняемый прикладной файл с учётом того, что уже есть на плате. То есть линкер должен знать какое состояние флеши в контроллере и готовить очередной "прикладной процесс" (понятно что прикладной в смысле не ОС которая УЖЕ в МК) с учётом того что уже есть на плате. То есть ну вот есть функция TimeDelay() по адресу А так и не зачем пихать ещё одну а делаем вызов по адресу A.

Или если совсем просто, то пусть линкер линкует старые и новые объектные файлы только старые размещает по старому с нулевого адреса а новые далее. В этом случае загрузчику остаётся только сначала сделать memcmp, а уж потом оставшийся новый код догрузить во FLASH.


--------------------
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jan 19 2013, 05:36
Сообщение #4


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (SyncLair @ Jan 19 2013, 04:30) *
То есть ну вот есть функция TimeDelay() по адресу А так и не зачем пихать ещё одну а делаем вызов по адресу A.

Это правильно, но как этого добиться от линкера? Он-то о существовании оси не знает.
Допустим, у нас есть API для уже загруженной в МК операционки:
CODE
namespace OSAPI
{
void sleep( msec );
...
...
...
TPrio getSelfPrio();
...
...
...
void sendchar( char a );
}

Совершенно разные функции, которые уже есть в оси, на которые уже все заточено (прерывания, периферия, ядро). Допустим, мы решили воспользоваться одной из функций в нашем прикладном коде (драйвер, подгружаемая библиотека, просто программа):
CODE
....
int main( void )
{
....
while( 1 )
  {
    OSAPI::sleep( 100 );
    OSAPI::sendchar( '!' );
  }
....

Вот как объяснить линкеру, что нужно подставить только адреса функций, передать и принять аргументы.
Кроме, как в заголовочнике задать адреса этих функций (точно также, как мы делаем это в одном проекте "по месту") у меня идей нет... Вопрос, как сделать это красиво? rolleyes.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jan 19 2013, 11:08
Сообщение #5


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(haker_fox @ Jan 19 2013, 07:36) *
Это правильно, но как этого добиться от линкера? Он-то о существовании оси не знает.

Вот как объяснить линкеру, что нужно подставить только адреса функций, передать и принять аргументы.

Кроме, как в заголовочнике задать адреса этих функций (точно также, как мы делаем это в одном проекте "по месту") у меня идей нет... Вопрос, как сделать это красиво? rolleyes.gif


Как это линкер не знает?

Первое.
Вы в проект вставляете файлы с объявлениями функций и процедур оси которые собираетесь использовать. Собираете, разруливаете зависимости, пишите если надо и концентрируете их в одном месте естественно руками.

Второе.
Вы подключаете к проекту symbol definition file который получаете автоматически когда компилируете ось перед загрузкой на голую платформу (не забыв галочку соответствующую поставить, естественно).

Этой информации линкеру более чем достаточно.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jan 20 2013, 08:54
Сообщение #6


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (AlexandrY @ Jan 19 2013, 20:08) *
Вы подключаете к проекту symbol definition file который получаете автоматически когда компилируете ось перед загрузкой на голую платформу (не забыв галочку соответствующую поставить, естественно).

Ага! Про symdef слышу впервые. Зато теперь все вяжется! Спасибо rolleyes.gif

QUOTE (kolobok0 @ Jan 20 2013, 10:28) *
под AVR делал так:
имеем таблицу джампов переходов. Адресс таблицы "зашит жёстко". Сам по себе вектор может указыватьна любой адресс. А чтоб вызвать из прикладной прожки - то адресс известен. получается, что из любого места позвали известный адресс джамп перехода из ядра.

Кажется, это все вручную... печально crying.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- AlexandrY   Технология динамической загрузки модулей для RTOS   Dec 29 2012, 21:48
- - a9d   Для начала ЦитатаОперационная система (Operating ...   Dec 29 2012, 22:03
|- - AlexandrY   Цитата(a9d @ Dec 30 2012, 00:03) Как видн...   Dec 30 2012, 13:41
- - haker_fox   QUOTE (AlexandrY @ Dec 30 2012, 06:48) И ...   Dec 30 2012, 13:09
- - a9d   Насколько я помню в винде адреса API функций прогр...   Dec 30 2012, 14:31
|- - AlexandrY   Цитата(a9d @ Dec 30 2012, 16:31) Наскольк...   Dec 31 2012, 12:09
- - haker_fox   Гм... чувствую благовейный ветерок) Как когда-то д...   Dec 31 2012, 06:04
- - a9d   А как планируете решать проблему с MMU ? Также как...   Dec 31 2012, 14:59
|- - AlexandrY   Цитата(a9d @ Dec 31 2012, 16:59) А как пл...   Dec 31 2012, 15:31
- - a9d   Вот об отсутствии и идет речь. Вот простой пример...   Dec 31 2012, 15:37
|- - AlexandrY   Цитата(a9d @ Dec 31 2012, 17:37) Вот об о...   Dec 31 2012, 16:50
|- - haker_fox   QUOTE (AlexandrY @ Jan 1 2013, 01:50) Сущ...   Jan 2 2013, 09:39
- - vshemm   ЦитатаКак-то тут проскочила мысль, что настоящая о...   Jan 2 2013, 20:42
|- - AlexandrY   Цитата(vshemm @ Jan 2 2013, 22:42) Про за...   Jan 3 2013, 07:51
|- - vshemm   Цитата(AlexandrY @ Jan 3 2013, 11:51) Нас...   Jan 8 2013, 16:07
|- - AlexandrY   Цитата(vshemm @ Jan 8 2013, 18:07) Боюсь,...   Jan 16 2013, 12:07
|- - kolobok0   Цитата(haker_fox @ Jan 19 2013, 09:36) .....   Jan 20 2013, 01:28
|- - AlexandrY   Цитата(kolobok0 @ Jan 20 2013, 03:28) под...   Jan 20 2013, 10:29
|- - kolobok0   Цитата(AlexandrY @ Jan 20 2013, 14:29) .....   Jan 20 2013, 16:25
||- - AlexandrY   Цитата(kolobok0 @ Jan 20 2013, 18:25) вос...   Jan 20 2013, 19:24
||- - haker_fox   QUOTE (AlexandrY @ Jan 21 2013, 03:24) Т....   Jan 21 2013, 00:58
||- - kolobok0   Цитата(AlexandrY @ Jan 20 2013, 23:24) .....   Jan 21 2013, 08:47
|- - SyncLair   Цитата(AlexandrY @ Jan 20 2013, 14:29) Дл...   Jan 22 2013, 14:30
|- - AlexandrY   Цитата(SyncLair @ Jan 22 2013, 16:30) Есл...   Jan 22 2013, 15:10
|- - SyncLair   Цитата(AlexandrY @ Jan 22 2013, 19:10) Чт...   Jan 22 2013, 18:05
- - neiver   Насчёт взаимодействия загружаемого модуля и ядра, ...   Jan 16 2013, 15:01
- - _Pasha   Цитата(neiver @ Jan 16 2013, 19:01) SVC -...   Jan 16 2013, 15:07


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

 


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


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