2014-02-20 2 views
3

В настоящее время я занимаюсь разработкой ОС для продуктов потребительской электроники, которые разрабатывает моя компания. Я остановился на freeRTOS в качестве основы для нашей ОС, и я старательно выполняю аппаратные функции в ОС. Тем не менее, у меня возникла проблема с запуском сторонних приложений из FreeRTOS.Запуск приложений от freeRTOS

Первоначально я считал задачу быть приложением, где в основном у вас были «myapplication.c» и «myapplication.h», содержащие все ваши приложения, необходимые функции, и код будет находиться внутри цикла for (;;) в пределах задача (действующая как основной цикл). Затем, когда пользователь решает запустить это приложение, указатель функции передается в очередь, что моя задача app_launcher затем используется для создания новой задачи с помощью сторонней задачи или приложения.

Проблема с этим подходом, однако, заключается в том, что ОС уже будет скомпилирована и размещена на микроконтроллере, а приложения, которые будут установлены и удалены по мере того, как пользователь сочтет нужным ... Поэтому очевидно, что приложения необходимо скомпилировать и выполнить из ОПЕРАЦИОННЫЕ СИСТЕМЫ. На стандартной машине unix я бы использовал что-то вроде fork, чтобы выбрать исполняемый файл и дать ему собственный процесс. Однако я не могу найти аналогичную функциональность в пределах freeRTOS. Моя другая идея приближается к языку сценариев разработки приложений, но опять же я не уверен, как запускать эти приложения ...

Итак, вопрос в том, как сделать Я получаю freeRTOS для запуска приложений от сторонних разработчиков, которые еще не запекаются в ОС?

+0

Как это связано с Lua? – lhf

+0

Я должен был полностью объяснить это. Lua - один из языков сценариев, на который я смотрю, чтобы решить эту проблему. Спасибо, что привлек мое объяснение к моему вниманию. – DevenJ

ответ

0

В связи с запросом, вот работа, которую я нашел в своей проблеме. Проблема заключалась в запуске других приложений из freeRTOS. Это было достигнуто за счет использования функции «System()» в библиотеке newlib. Таким образом, я могу разместить приложение во флэш-памяти до тех пор, пока оно не понадобится, а затем запустите его, используя предоставленные функции newlib. Это также позволяет запускать программы динамически, без жесткого кодирования кода или имени приложения, мне просто нужно предоставить System() строку, указывающую на местоположение приложения в памяти.

+0

В этом решении что-то не хватает - я не вижу как он может работать на автономной системе на базе FreeRTOS. Согласно (документации) [http: // sourceware.org/newlib /] он передает строку в командную оболочку ОС, если она доступна, и FreeRTOS не имеет оболочки. Системные вызовы, которые 'system()' вызовы являются пустыми заглушками по умолчанию, поэтому 'system()' ничего не делает, если функциональность явно не реализована. – Clifford

+0

Теперь я вижу проблему, которую вы представляете. Однако я нахожусь в проигрыше для правильного решения в этом случае. Я знаю, что это возможно (другой продукт, галька smartwatch, открыто использует freeRTOS и имеет интерфейс, подобный приложению). Однако мне кажется неясным, как это сделать. На самом деле мне просто нужно запускать параллельные программы на моем процессоре, которые могут выполняться друг другом. – DevenJ

+0

Pebble вполне может использовать FreeRTOS в качестве основы для ОС, но сам по себе не является технологией для загружаемых приложений - разработчики разработали это * поверх * FreeRTOS в качестве промежуточного слоя. Вы должны понять, что Pebble собрал более 10 миллионов долларов в качестве финансирования для проекта - с тем, что они могли бы приложить немало усилий в OS помимо простого переноса FreeRTOS. Приложения Pebble генерируются с использованием собственных инструментов компиляции Pebble, [Этот сайт] (http://pebbledev.org/wiki/Applications#pebble-app.bin) предлагает мне, что Pebble Apps использует собственный формат перемещаемого объекта. – Clifford

7

FreeRTOS (и большинство RTOS, если на то пошло) не работают как операционные системы общего назначения (GPOS), они обычно не предназначены для динамической загрузки и выполнения произвольных пользовательских приложений. В большинстве случаев вы используете RTOS, потому что вам требуется жесткий ответ в реальном времени, и выполнение стороннего кода может скомпрометировать это.

Большинство RTOS (включая FreeRTOS) - это не более статические библиотеки ссылок, где ваше встроенное приложение статически связано с RTOS и выполняется как одна многопоточная программа.

Снова много RTOS (например, FreeRTOS) не являются операционными системами в том же смысле, что и GPOS, например Linux. Обычно доступными службами RTOS являются планировщик реального времени, межпроцессорная связь (IPC), синхронизация потоков и таймеры. Средние предметы, такие как файловая система и сетевой стек, например, являются либо дополнительными расширениями, либо должны быть интегрированы из стороннего кода.

Одна из проблем, с которой вы столкнетесь с FreeRTOS, пытаясь достичь своей цели, состоит в том, что «задача» аналогична «потоку», а не «процессу» в смысле модели процесса GPOS. Задача обычно работает в том же пространстве памяти, что и другие задачи без защиты памяти между задачами. Задачи - это не отдельные программы, а потоки в одном приложении.

Если ваша цель не имеет MMU, тогда защита памяти может быть ограничена в любом случае, но вы все равно можете хотеть, чтобы сторонние приложения были концептуально независимы от ОС. Если ваш процессор не имеет MMU, то запуск произвольного стороннего динамически загружаемого кода может быть проблемой для целостности системы, безопасности и безопасности. Даже с MMU простое ядро ​​RTOS, такое как FreeRTOS, не будет использовать его.

Операционные системы с планированием в режиме реального времени, что может загрузки и выполнения кода приложения динамически как отдельные процессы включают в себя:

Также VxWorks имеет способность загружать частично связанные ob ject и динамически связывать его с уже загруженным кодом. Это не то же самое на модели процесса, но более похоже на библиотеку динамической компоновки. В этом контексте стоит упомянуть, что оболочка VxWorks может вызывать любую функцию с внешней привязкой по имени. Таким образом, вы можете загрузить объектный файл, реализующий функцию, и затем запустить эту функцию. В принципе вы могли бы реализовать ту же функциональность на FreeRTOS, но это нетривиально. Оболочка - это одно, но динамическая загрузка и привязка требуют, чтобы таблица символов приложения была резидентной.

Если вам не нужны жесткие режимы реального времени (или ваши требования в режиме реального времени «мягкие»), и у вашей цели достаточно ресурсов, вам может быть лучше, если вы используете Linux или uClinux, которые все чаще используются во встроенных системах.

Если код, который должны выполнять конечные пользователи, тесно связан с целью вашего устройства, а не с «общим назначением» в природе, тогда еще одна возможность разрешить конечным пользователям запускать код - это интегрировать интерпретатор языка сценариев, такой как как Lua. В этом случае вы просто загрузите скрипт из файловой системы и передаете его интерпретатору сценария. Для более общих целей может возникнуть необходимость Java VM.

+0

В настоящее время я разрабатываю это на ARM Cortex M4, поэтому нет MMU. Нам пришлось выбирать этот процессор из-за того, что устройство должно быть как можно более энергоэффективным, при этом оставаясь отзывчивым. Спасибо за ссылки на альтернативы ОС, я сейчас изучу их. – DevenJ

+0

Мы ищем открытый или открытый для коммерческого использования. Исключая те из вашего списка, это оставляет мне варианты linux, которые также не кажутся опцией из-за нехватки оперативной памяти. Я изучаю ее больше, но кажется, что я застрял в ОС как freeRTOS для удовлетворения наших потребностей. – DevenJ

+0

Я дам вам ответ, однако я нашел альтернативное решение, используя newlib. Спасибо за помощь! – DevenJ

Смежные вопросы