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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Технология динамической загрузки модулей для RTOS, Какие есть методы и инструменты.
desh
сообщение Jan 13 2013, 07:56
Сообщение #16


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

Группа: Свой
Сообщений: 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
AlexandrY
сообщение Jan 16 2013, 12:07
Сообщение #17


Ally
******

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



Цитата(vshemm @ Jan 8 2013, 18:07) *
Боюсь, что семантические отличия исключительно ваши. Мы вообще обсуждаем динамическую загрузку
модулей (см. топик). В данном контексте лоадер - это код, который готовит некоторые данные для
работы (данные - это как код и как собственно data). Лоадер пользуется внешним апи, типа чтения
данных, выделения памяти и т.д. Реализация этого апи находится вне текущей абстракции, а "файловые
системы", "живые юзеры" вообще тут никаким боком.


Это вы описали компьютерный взгляд на лоадер.
Если во встраиваемой системе нет даже элементарной файловой системы, вы не можете так просто отмахнуться от API вне"текущей абстракции"
Это качественное отличие.
Я в начале заострил внимание на задачах интеграции лоадера в готовые проекты,
а сами реализации непосредственно конвертеров elf в bin особого внимания не требуют поскольку есть известные исходники.
Go to the top of the page
 
+Quote Post
neiver
сообщение Jan 16 2013, 15:01
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Насчёт взаимодействия загружаемого модуля и ядра, моногие ARM-ы, например, имеют команду SVC - Supervisor Call, которая вызывает соответствующий обработчик прерывания, которому передаётся аргумент команды - номер системного вызова. Параметры ему можно мередавать через регистры. И никаких JUMP-таблиц или таблиц символов.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 16 2013, 15:07
Сообщение #19


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



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

Кроме того, что JMP-таблица будет в теле обработчика SVC sm.gif
Проблема-то в невозможности на всех архитектурах создать модель с относительными переходами и вызовами.

Сообщение отредактировал _Pasha - Jan 16 2013, 15:10
Go to the top of the page
 
+Quote Post
SyncLair
сообщение Jan 18 2013, 19:30
Сообщение #20


Местный
***

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


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

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


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
kolobok0
сообщение Jan 20 2013, 01:28
Сообщение #23


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(haker_fox @ Jan 19 2013, 09:36) *
..есть API для уже загруженной в МК операционки...мы решили воспользоваться одной из функций в нашем прикладном коде...нужно подставить только адреса функций, передать и принять аргументы..


под AVR делал так:
имеем таблицу джампов переходов. Адресс таблицы "зашит жёстко". Сам по себе вектор может указыватьна любой адресс. А чтоб вызвать из прикладной прожки - то адресс известен. получается, что из любого места позвали известный адресс джамп перехода из ядра.

под stm32 сейчас делаю более навороченную модель - там собственно уже всё динамически вяжется. и собственно в загрузчике почти ничего уже и нетsm.gif
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jan 20 2013, 08:54
Сообщение #24


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

Группа: Свой
Сообщений: 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
сообщение Jan 20 2013, 10:29
Сообщение #25


Ally
******

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



Цитата(kolobok0 @ Jan 20 2013, 03:28) *
под stm32 сейчас делаю более навороченную модель - там собственно уже всё динамически вяжется. и собственно в загрузчике почти ничего уже и нетsm.gif


А вот интересно , какой смысл у такой организации софта.

Вижу три варианта: для себя, для коллег в своей организации, для сторонних разработчиков.

Чтобы делать это для себя тут я вижу оправдание только в некоей эстетике, не относящейся к объективной необходимости.
Чтобы делать для коллег, то наверно это вызвано технологическими особенностями процесса разработки, а не потребностью приложения как такового.
Для сторонних разработчиков такой подход вызовет потребность создания огромного объема документации, проблемы с тех поддержкой. Для самих сторонних разработчиков вызовет проблемы с отладкой.

А где положительные стороны такого подхода? Я не могу увидеть.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Jan 20 2013, 16:25
Сообщение #26


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(AlexandrY @ Jan 20 2013, 14:29) *
..какой смысл у такой организации софта....


востребованность из практики. плюсы очевидны:
- меньше времени на загрузку.
- апдэйт софта без спец. режимов, кнопок и на ран-тайме.
- повышение надёжности. т.к. ошибки могут быть везде и в канал связи и в осях и в библиотеках.

Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jan 20 2013, 19:24
Сообщение #27


Ally
******

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



Цитата(kolobok0 @ Jan 20 2013, 18:25) *
востребованность из практики. плюсы очевидны:
- меньше времени на загрузку.
- апдэйт софта без спец. режимов, кнопок и на ран-тайме.
- повышение надёжности. т.к. ошибки могут быть везде и в канал связи и в осях и в библиотеках.


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

В малых встраиваемых системах время загрузки вообще ничтожно. Килобайт или мегабайт вы грузите никто не заметит. Разница будет в долях секунды. Некоторая периферия гораздо дольше инициализируется.

Апдейт софта проще сделать когда апдейтится все. Иначе головная боль с совместимостью версий софта платформы и загружаемого приложения.
Проще после загрузки вытеснить весь старый софт новым, либо старый софт оставить в качестве начального загрузчика не используя его для приложения.

Повышению надежности тоже неоткуда взяться, хотя бы из-за того что разработчик стороннего приложения обладает меньшей информацией о платформе и минимальными возможностями по отладке.

Т.е. я как бы совсем не понял ваших аргументов.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jan 21 2013, 00:58
Сообщение #28


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

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



QUOTE (AlexandrY @ Jan 21 2013, 03:24) *
Т.е. я как бы совсем не понял ваших аргументов.

Мне кажется, что динамическая загрузка (запуск) модулей (совсем как в "настоящих" осях) упрощает отлдаку приложения. Вместо того, чтобы постоянно перезагружать всю прошивку, даже если она в RAM, проще выгрузить и загрузить новую версию модуля. Хотя да, аргументация, конечно слабовата с моей стороны. Больше сил уйдет на написание загрузчика, планировщика, что там еще... менеджера памяти.

Гм, мне кажется это имеет место быть на платформах с MMU. А то толку отлаживаться - модуль обратится к чужой памяти, а процессор и не чухнет, даст перезаписать ядро оси, и ку-ку rolleyes.gif Но для MMU уже есть Linux, Win CE...

Что же получается, бессмысленно это, что ли?


Хотя нет. У меня есть один проектик, который работает круглые сутки, и управляет неким процессом. Сбои там, конечно, не нужны, но небольшие простои - не страшно. Так вот, чтобы постоянно не останавливать систему, некоторые модули, включающие определенные алгоритмы от друг друга не зависящие, можно и перезагружать в рантайме. Даже если и будет нарушение адресного пространства, то не страшно. Зато шанс обновиться "наживую".


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Jan 21 2013, 08:47
Сообщение #29


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(AlexandrY @ Jan 20 2013, 23:24) *
...мало относящемся к загрузке сторонних приложений.


именно так. для сторонних приложений нужно озабачиваться бОльшей секьюрностью, которую по идее надо поддерживать на уровне железа. либо "условно сторонних"

Цитата(AlexandrY @ Jan 20 2013, 23:24) *
...или мегабайт вы грузите никто не заметит. Разница будет в долях секунды...


как бы Вы поспешили я так понимаешь. мегабайты через какой-нить вяложующий протокол и вся ваша прыть с крутым камнем идёт лесом.

Цитата(AlexandrY @ Jan 20 2013, 23:24) *
...Апдейт софта проще сделать...


я Вам больше скажу - просче вообще ничего не делать. я так понимаю это уже выход за техническую плоскость...

Цитата(AlexandrY @ Jan 20 2013, 23:24) *
..Иначе головная боль с совместимостью версий софта...


для меня - это пройденный этап. с точки зрения исполнения - пара-тройка экранов на сях...

Цитата(AlexandrY @ Jan 20 2013, 23:24) *
...я как бы совсем не понял ваших аргументов.


и вас вылечим sm.gif
я собственно не спорю. скорее всего я не прав. человек спрашивал я ответил... тащить кого то в колхоз - честно слово времени нет вообще...
Go to the top of the page
 
+Quote Post
SyncLair
сообщение Jan 22 2013, 14:30
Сообщение #30


Местный
***

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



Цитата(AlexandrY @ Jan 20 2013, 14:29) *
Для сторонних разработчиков такой подход вызовет потребность создания огромного объема документации, проблемы с тех поддержкой. Для самих сторонних разработчиков вызовет проблемы с отладкой.

Если вы предоставляете систему сборки и бинарый файл ОСи то ничего он не создаёт!

Цитата(haker_fox @ Jan 21 2013, 04:58) *
Хотя нет. У меня есть один проектик, который работает круглые сутки, и управляет неким процессом.

У меня тоже есть пример когда. "Обновление ПО контроллера без остановки контроллера." В этом случае мне бы как раз помогло обновлять только то что хочу. Ну например: загрузил вверсию 2 а работает версия 1, далее перезапустил процесс на новую версию.


Цитата(kolobok0 @ Jan 21 2013, 12:47) *
как бы Вы поспешили я так понимаешь. мегабайты через какой-нить вяложующий протокол и вся ваша прыть с крутым камнем идёт лесом.

Поддерживаю аргумент -- вот Дункельс и пляшет с обновлением по всяким там Mesh сетям.


--------------------
Go to the top of the page
 
+Quote Post

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

 


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


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