Несколько комментариев:
1) Абсолютно , а не сборка, если этого не требуют ограничения производительности или оптимизации. Следующие метрики проходят через крышу со сборкой:
- время кодировать
- время отладки
- время проверить это
- время документировать
- время, чтобы выяснить (1 год спустя), что вы делали, когда кодировали
- вероятность ошибиться
2) Я бы предпочел C ++, а не C для его инкапсуляции пространства имен и упрощения компиляции объектно-ориентированных практик. В C слишком много возможностей для глобальных переменных и коллизий пространства имен. (Java в реальном времени была бы хороша, но насколько я понимаю, ее требования все еще довольно высоки)
Или, вернее, подмножество C ++: исключать исключения, виртуальные функции, идентификацию типов во время выполнения, а также динамическое выделение памяти в большинстве случаев - в основном все, что остается неопределенным во время компиляции, поскольку для этого обычно требуется много дополнительных ресурсов во время выполнения. Это «раздувание» C ++.
Я использовал как компиляторы TI, так и IAR для C ++, для микроконтроллеров TMS320 и MSP430 (соответственно), и при надлежащих настройках оптимизации они выполняют фантастическую работу по сокращению накладных расходов, которые можно ожидать от C ++. (Особенно, если вы поможете ему с помощью разумного использования ключевого слова inline
)
Я даже использовал шаблоны для некоторых из их преимуществ во время компиляции, которые способствуют хорошему повторному использованию кода: например, написание одного файла исходного кода для обработки 8-битных, 16-битных и 32-битных CRC; и полиморфизм времени компиляции , чтобы позволить вам указать обычное поведение класса, а затем использовать его повторно, но переопределить некоторые из его функций. Опять же, у компилятора TI были чрезвычайно низкие накладные расходы с соответствующими настройками оптимизации.
Я искал компилятор C ++ для PIC Microchip; единственная найденная мной компания - IAR. ($$$ был препятствием, но я надеюсь когда-нибудь купить копию) Компиляторы Microchip C18 / C30 довольно хороши, но они C, а не C ++.
3) Особое предостережение по поводу оптимизации компилятора: это может / сделает отладку очень сложной; часто невозможно выполнить пошаговый переход к оптимизированному коду C / C ++, и в ваших окнах наблюдения могут отображаться переменные, которые не коррелируют с тем, что, как вы думаете, они должны содержать в неоптимизированном коде. (Хороший отладчик предупредит вас о том, что определенная переменная была оптимизирована из-за отсутствия или в регистр, а не в область памяти. Многие отладчики этого не делают.> :(
Также хороший компилятор позволит вам выбирать оптимизацию на уровне функций через #pragmas. Те, которые я использовал, позволяют вам указать оптимизацию на уровне файлов.
4) Взаимодействие C-кода с сборкой: обычно это сложно. Самый простой способ - создать функцию-заглушку с нужной подписью, например, uint16_t foo(uint16_t a, uint32_t b) {return 0; }
, где uint16_t
= unsigned short, мы обычно делаем число битов явным. Затем скомпилируйте его и отредактируйте сборку, которую он создает (просто оставьте части кода начала / выхода) и будьте осторожны , чтобы не загромождать любые регистры, не восстанавливая их после того, как вы это сделали.
Встроенная сборка обычно может иметь проблемы, если вы не делаете что-то очень просто как включение / отключение прерываний.
Подход, который мне нравится больше всего, - это встроенная функция компилятора / расширенный синтаксис ASM. Компилятор C Microchip основан на компиляторе GNU C и имеет « extended ASM », который позволяет вам кодировать биты встроенной сборки, но вы можете дать ему много подсказок, чтобы сказать, какие регистры / переменные вы ссылаетесь и он будет обрабатывать все сохранение / восстановление регистров, чтобы гарантировать, что ваш ассемблерный код «проигрывается» с компилятором C. TI для DSP TMS320 не поддерживает их; он имеет ограниченный набор встроенных функций, которые имеют некоторое применение.
Я использовал ассемблер для оптимизации кода, который часто выполнялся, или для вычисления sin (), cos () и arctan (). Но в противном случае я бы держался подальше от сборки и придерживался языка высокого уровня.