Rabbit Semiconductor — американская компания, которая разрабатывает и продает семейство микроконтроллеров и модулей микроконтроллеров Rabbit . Для разработки она предоставляет Dynamic C — нестандартный диалект C с фирменными структурами для многозадачности.
В 2006 году компания Rabbit Semiconductor была приобретена компанией Digi International за 49 миллионов долларов. [1] [2] До покупки Rabbit Semiconductor была подразделением Z-World, Inc. Z-World разрабатывала и производила встраиваемые контроллеры, а также среды разработки встроенного программного обеспечения.
Семейство процессоров Rabbit имеет много общих черт с процессорами Zilog Z80/Z180 . Например, регистры процессора Rabbit 2000 /3000 почти такие же, как регистры процессора Z80/Z180. Процессор Rabbit 4000 расширяется, включая использование 32-битных регистров. Набор инструкций процессоров Rabbit также очень похож на набор инструкций семейства Z80/Z180. Хотя коды операций многих инструкций одинаковы для процессоров Rabbit 2000/3000 и процессоров Z80/Z180, эти два семейства процессоров несовместимы на двоичном уровне. Как и в случае с семейством Z80/Z180, процессоры Rabbit являются CISC- процессорами.
Семейство процессоров Rabbit имеет уникальные особенности. Например, семейство Z80/Z180 отключает прерывания , как только прерывание обслуживается процедурой обслуживания прерываний. Однако процессоры Rabbit разрешают прерываниям прерывать процедуры обслуживания в соответствии с приоритетами (всего 4).
Rabbit Semiconductor утверждает, что набор инструкций процессоров Rabbit оптимизирован для кода C. [3]
Возможно, наиболее примечательной особенностью микроконтроллера Rabbit является его среда разработки. Dynamic C, продукт Rabbit Semiconductor, имеет дополнения, удаления и несоответствия по сравнению со стандартом ANSI-C.
Dynamic C IDE поставляется с обширными библиотеками с открытым исходным кодом и примерами кода, выпущенными по лицензии MPL или ISC . [4] [5]
Динамический C следует стандарту ISO/ANSI C, когда это возможно и желательно. Поскольку стандарт не учитывает особые потребности встраиваемых систем, необходимо отступать от стандарта в некоторых областях и желательно в других. Стандарт не учитывает важные вопросы встраиваемых систем, такие как память только для чтения и встроенный язык ассемблера. По этой причине практические компиляторы, предназначенные для встраиваемых систем, не полностью соответствуют стандарту, но используют его в качестве руководства.
В качестве примера дополнения, Dynamic C имеет механизм цепочки для связывания фрагментов кода из разных подпрограмм в произвольное количество цепочек. Это расширение позволяет использовать не только инициализированные переменные, но и любой произвольный код для выполнения до того, как программа начнет выполнение в основной функции.
В качестве примера удаления, начиная с версии 10.23 Dynamic C не поддерживает переменные области действия блока или битовые поля . В набор инструментов разработки не входят отдельный препроцессор и компоновщик, что может усложнить процесс переноса существующих программ в компилятор. Начиная с версии 10.64 поддерживается область действия блока для переменных.
В качестве примера несоответствия можно привести Dynamic C, который неявно обрабатывает все инициализированные глобальные переменные, как если бы они были объявлены с const
квалификатором. Кроме того, все const
переменные находятся во флэш-памяти. Более ранние версии Dynamic C не проверяли использование const
ключевого слова в параметрах — можно было передать const
переменную в качестве параметра функции, которая ее не ожидала, что потенциально приводило к попыткам записи во флэш-память. Начиная с последней версии Dynamic C, компилятор выдаст ошибку, если пользователь попытается изменить переменную const
напрямую, и выдаст предупреждение, если пользователь отбросит const
квалификатор при передаче параметра функции.
Одной из примечательных особенностей Dynamic C является включение языковых конструкций для упрощения многозадачности. Эти конструкции, costate
оператор и slice
оператор, реализуют форму кооперативной и вытесняющей многозадачности соответственно. В качестве примера рассмотрим следующую программу, которая мигает двумя светодиодами с разной частотой:
void main () { while ( 1 ) { // Создаем 2 оператора costate, которые будут переключать наши светодиоды. costate { led1on (); waitfor ( DelayMs ( 100 )); led1off (); waitfor ( DelayMs ( 50 )); } costate { led2on (); waitfor ( DelayMs ( 200 )); led2off (); waitfor ( DelayMs ( 50 )); } } }
При запуске этого кода будет выполнен первый costatement, и загорится первый светодиод. Costatement затем уступит второму оператору, ожидая 100 миллисекунд. Второй costatement будет выполнен аналогичным образом. Пока оба costatement ждут истечения своего времени, цикл while будет busy-wait , но это время ожидания потенциально может быть использовано для выполнения других задач. Для получения дополнительной информации см. Руководство пользователя Dynamic C.