Rabbit Semiconductor es una empresa estadounidense que diseña y comercializa la familia de microcontroladores y módulos de microcontroladores Rabbit . Para el desarrollo, ofrece Dynamic C , un dialecto no estándar de C con estructuras propias para la multitarea.
Rabbit Semiconductor fue adquirido en 2006 por Digi International por 49 millones de dólares. [1] [2] Antes de la compra, Rabbit Semiconductor era una división de Z-World, Inc. Z-World desarrollaba y fabricaba productos controladores integrados, así como entornos de desarrollo de software integrados.
La familia de procesadores Rabbit comparte muchas características con los procesadores Zilog Z80/Z180 . Por ejemplo, los registros de un procesador Rabbit 2000/3000 son casi iguales a los registros de un procesador Z80/Z180. El procesador Rabbit 4000 se expande para incluir el uso de registros de 32 bits. El conjunto de instrucciones de los procesadores Rabbit también se parece mucho al conjunto de instrucciones de la familia Z80/Z180. Si bien los códigos de operación de muchas instrucciones son los mismos entre los procesadores Rabbit 2000/3000 y los procesadores Z80/Z180, las dos familias de procesadores no son compatibles a nivel binario. Al igual que con la familia Z80/Z180, los procesadores Rabbit son procesadores CISC .
La familia de procesadores Rabbit tiene características únicas. Por ejemplo, la familia Z80/Z180 desactiva las interrupciones una vez que una rutina de servicio de interrupciones atiende una interrupción. Sin embargo, los procesadores Rabbit permiten que las interrupciones afecten a las rutinas de servicio de interrupciones según las prioridades (un total de 4).
Rabbit Semiconductor afirma que el conjunto de instrucciones de los procesadores Rabbit está optimizado para el código C. [3]
Quizás la característica más destacable del microcontrolador Rabbit es su entorno de desarrollo. Dynamic C, un producto de Rabbit Semiconductor, tiene añadidos, eliminaciones e inconsistencias en comparación con el estándar ANSI-C.
El IDE Dynamic C viene con amplias bibliotecas de código abierto y código de muestra publicado bajo la licencia MPL o la licencia ISC . [4] [5]
Dynamic C sigue el estándar ISO/ANSI C cuando es factible y deseable. Debido a que el estándar no tiene en cuenta las necesidades especiales de los sistemas embebidos, es necesario apartarse del estándar en algunas áreas y deseable en otras. El estándar no tiene en cuenta cuestiones importantes de los sistemas embebidos, como la memoria de solo lectura y el lenguaje ensamblador embebido. Por este motivo, los compiladores prácticos destinados a sistemas embebidos no cumplen completamente con el estándar, sino que lo utilizan como guía.
Como ejemplo de una adición, Dynamic C tiene un mecanismo de encadenamiento para encadenar fragmentos de código de diferentes subrutinas a un número arbitrario de cadenas. Esta extensión permite el uso no solo de variables inicializadas, sino de cualquier código arbitrario para ejecutar antes de que un programa comience a ejecutarse en la función principal.
Como ejemplo de eliminación, a partir de la versión 10.23, Dynamic C no admite variables de ámbito de bloque ni campos de bits . La cadena de herramientas de desarrollo no incluye un preprocesador ni un enlazador independientes, lo que puede complicar el proceso de transferencia de programas existentes al compilador. A partir de la versión 10.64, se admite el ámbito de bloque para las variables.
Como ejemplo de inconsistencia, Dynamic C trata implícitamente todas las variables globales inicializadas como si se hubieran declarado con el const
calificador. Además, todas const
las variables residen en la memoria flash. Las versiones anteriores de Dynamic C no verificaban el uso de la const
palabra clave en los parámetros: era posible pasar una const
variable como parámetro a una función que no lo esperaba, lo que potencialmente conducía a intentos de escritura en la memoria flash. A partir de la última versión de Dynamic C, el compilador producirá un error cuando el usuario intente modificar una const
variable directamente y producirá una advertencia si el usuario descarta el const
calificador al pasar un parámetro a una función.
Una característica destacable de Dynamic C es la inclusión de construcciones del lenguaje para simplificar la multitarea. Estas construcciones, la costate
sentencia y la slice
instrucción, implementan una forma de multitarea cooperativa y preventiva, respectivamente. Como ejemplo, considere el siguiente programa que hace parpadear dos LED con diferentes frecuencias:
void main () { while ( 1 ) { // Crea 2 costate que alternarán nuestros LED. costate { led1on (); waitfor ( DelayMs ( 100 )); led1off (); waitfor ( DelayMs ( 50 )); } costate { led2on (); waitfor ( DelayMs ( 200 )); led2off (); waitfor ( DelayMs ( 50 )); } } }
Cuando se ejecuta este código, se ejecutará la primera declaración y se encenderá el primer LED. La declaración dará paso a la segunda declaración mientras espera 100 milisegundos. La segunda declaración se ejecutará de manera similar. Mientras ambas declaraciones esperan que transcurra el tiempo, el bucle while esperará , pero este tiempo de espera podría utilizarse para realizar otras tareas. Para obtener más información, consulte el Manual del usuario de Dynamic C.