Как написать настраиваемый код Embedded C, который может работать на мультихардверной платформе - PullRequest
1 голос
/ 03 июня 2010

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

Я разработал прошивку на основе ОСРВ для ARM7. Теперь я хочу сделать его базовой прошивкой, которую можно использовать с похожими, более или менее функциональными (настраиваемыми) на разных микроконтроллерах, таких как MSP или AVR и т. Д.

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

Ответы [ 4 ]

2 голосов
/ 03 июня 2010

Есть два подхода, которые обычно используются: 1) много #ifdefs 2) написать "драйверы" и убедиться, что другой код абстрагирован

Если вы работаете на похожих платформах, 1), вероятно, будет работать лучше для вас. Если платформы очень разные, то 2), вероятно, лучшая идея. Большинство реальных решений, которые я видел, используют подход #ifdef, но это быстро приводит к запутанному лабиринту кода, который может быть трудно изменить. Я бы порекомендовал что-то промежуточное, так как трудно проектировать драйверы в 2).

Типы должны быть указаны в файле types.h или использовать явные типы, такие как uint16_t. Мы определяем все наши собственные типы на основе абсолютов (U8, U16, U32, S8 ...), поскольку встроенные типы в C зависят от реализации. Этот файл затем изменяется при изменении архитектуры.

1 голос
/ 03 июня 2010

Обычно переносимость может быть решена следующим образом:

  1. Использование драйверов для ввода-вывода, поэтому код приложения не зависит от аппаратного обеспечения.
  2. Напишите уровень абстракции для вызовов ОС, чтобы код вашего приложения можно было адаптировать к другой ОСРВ, переписав тонкий слой вызовов функций.
  3. Избегайте использования специфичных для компилятора директив и прагм или выделяйте их в несколько заголовочных файлов, которые можно заменить централизованно.
  4. Избегайте зависящих от платформы типов данных, таких как int, и используйте типы, определенные с указанным размером хранилища, где это важно (например, uint32_t).
  5. Учитывайте свой наименьший общий знаменатель при выборе способа проектирования архитектуры памяти.

Удачи.

1 голос
/ 03 июня 2010

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

Их подход включает файл заголовка конфигурации, файл C для функций драйвера для конкретной платформы и файл ассемблера для более конкретной платформыподпрограммы.Весь остальной исходный код содержит только общие функции, а затем использует общий интерфейс для функций драйвера, специфичных для платформы, и несколько # ifdef и макросов из заголовка конфигурации по мере необходимости.

0 голосов
/ 03 июня 2010

Общий ключ состоит в том, чтобы взять всю зависимую от платформы информацию и собрать ее в один или несколько заголовочных файлов. Вы можете также настроить систему на #ifdef, если не можете позволить им запускать один и тот же код. Я использую этот метод на AVR'r MSP и для запуска кода, созданного на стандартном компьютере.

...