Возможность использования одного и того же кода на встроенных платформах и платформах Windows. - PullRequest
2 голосов
/ 07 октября 2011

У нас есть программа, написанная на VBA, которая работает на Windows машинах.

У нас есть очень похожая программа, написанная на ANSI C, использующая Keil IDE и компилятор, работающий на STR9x uP.

Мы планировали переписать код VBA в .NET с использованием C #.

Какова возможность записи общего кода в C ++ дляиспользоваться на обеих системах?Очевидно, что .NET Framework будет недоступен, но это не является большой проблемой.Мне интересно, в частности, насколько трудоемким вы считаете процесс компиляции.

Это своего рода теоретический вопрос, я знаю, но спасибо за любые мысли.

Ответы [ 2 ]

2 голосов
/ 09 октября 2011

Очевидно, что .NET Framework был бы за пределами

Не обязательно верно.При наличии достаточных ресурсов ПЗУ и ОЗУ (256 КБ / 64 КБ соответственно) на вашем устройстве будет работать .NET Micro Framework .Однако это не обязательно является хорошей причиной для его использования;уже есть два других широко используемых переносимых языка, доступных как для вашей встроенной цели, так и для Windows: C и C ++.Целевой ресурс, необходимый как для C, так и для C ++, минимален - код запуска C / C ++ во время выполнения может иметь размер не более 1 КБ кода, почти все доступные ресурсы могут использоваться вашим кодом приложения, а не средой выполнения.

Хитрость в использовании общего кода на обеих платформах - абстракция .Это будет включать как минимум аппаратную абстракцию и, возможно, абстракцию ОС , если ваша цель использует ядро ​​или планировщик любого типа, например RTOS или библиотеку потоков.

I 'Мы рекомендуем разработать встроенную цель с архитектурой слоя , имеющей по крайней мере слой устройства и прикладной уровень и, как уже упоминалось, возможно, систему уровень , который имеет дело с IPC, синхронизацией и планированием, если используется.У вас могут быть другие интерфейсы более высокого уровня, такие как сеть или файловая система, которые в равной степени выиграли бы от абстракции.Обратите внимание, что стандартные API, такие как BSD-сокеты или stdio, уже считаются абстракцией, поэтому, если ваша цель использует их, у вас будет меньше работы в Windows (небольшие различия между BSD-сокетами и Winsock могут все еще потребовать некоторой работы)

Уровень приложений не будет иметь никаких ОС или аппаратных зависимостей, кроме тех, которые доступны через уровни устройства и системы.Затем вы должны реализовать устройство и системные слои в Windows как симуляцию или переназначение для служб или устройств, доступных в Windows.Некоторые RTOS уже включают симуляторы Windows для тестирования и разработки, но определение собственного уровня API OS, который вы можете портировать между несколькими собственными RTOS и GPOS, позволит переносить код вашего приложения на разные цели как для моделирования, так и для выполнения в реальном времени.быстро.

Если различия в платформах незначительны и локализованы и могут не оправдать уровень абстракции, тогда может быть уместна целевая специфическая условная компиляция.Компиляторы поддерживают предопределенные макросы для архитектуры, ОС или кода, специфичного для компилятора, который можно использовать как для этого локализованного кода, так и для того, чтобы сделать сам код уровня абстракции распространенным там, где существует значительное сходство.

2 голосов
/ 07 октября 2011

Я делаю это в качестве общей практики. Я думаю, что лучший вопрос, чем «возможно ли это» - «как мне структурировать свой код, чтобы он мог работать как во встроенной системе, так и на ПК».

Я предпочитаю писать код на C и структурировать каждый файл как класс c ++, используя статические переменные, чтобы сделать глобальные переменные приватными для модуля. Создайте функции получения и установки для доступа к закрытым переменным. Также используйте указатели функций, которые я установил при инициализации модуля, для методов, которые модуль должен вызывать вне модуля.

Также легко выполнить рефакторинг из вышеприведенного структурированного кода c в класс в c # или c ++.

Вы также можете использовать C ++ напрямую, но его неправильное использование во встроенной системе может вызвать проблемы.

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

Я использую этот код для повторного использования модулей для таких вещей, как протоколы связи. Но что более важно, я использую это для тестирования. Мне нравится использовать gtest для модульного тестирования модулей. Я также могу переписать драйверы и смоделировать оборудование на ПК, чтобы иметь возможность запускать его на ПК.

...