Herramientas de usuario

Herramientas del sitio

Traducciones de esta página:

desarrollo:firmware:hisio

¡Esta es una revisión vieja del documento!


HISIO

Módulo para el manejo de Dio, Pwm, Pwd, Adc, Wdt, Ccu. Eeprom y Flash también estan soportados pero no serán implementados en una primera versión.

Introducción

Configuración

El estándar define un lenguaje de configuración llamado DIL (Driver Implementation Language). Sin embargo sería necesario un nuevo parser por lo que se propone extender el OIL para la configuración de drivers. Como por ejemplo:

https://github.com/ciaa/Firmware/blob/feature/hisio/examples/hisio_example/etc/hisio_example.oil#L52

Inicialización y Desinicialización

Los drivers tienen una interfaz para inicialización <Driver>_InitSync y <Driver>_DeInitSync las cuales permiten proveer un puntero con la configuración. Esto puede ser útil si por ejemplo en el archivo de configuración se desean configurar dos opciones, por ejemplo:

   DIO MyDioConfigWithLed {
      ERRORHOOK = TRUE;

      PIN Led1 {
         PIN = 7;
         PORT = 3;
         DIRECTION = OUTPUT_INIT_LOW;
      }
   }
      
   DIO MyDioConfigWithSensor {
      ERRORHOOK = TRUE;

      PIN Sen1 {
         PIN = 7;
         PORT = 3;
         DIRECTION = INPUT;
      }
   }

para luego hacer Dio_InitSync(&MyDioConfigWithLed) ó Dio_InitSync(&MyDioConfigWithSensor) según en una configuracón un puerto sea entrada o salida.

La ventaja esta clara, se pueden cargar más de una configuración y luego en runtime decidir cual se activa. Contra es algo más complejo y necesita más memoria y más tiempo de ejecución. Si nos alcanza con soportar una única configuración no se podria hacer algo asi y se inicializaria con Dio_InitSync(NULL_PTR). Este tema aplica igualmente a cada uno de los drivers.

TODO: hay que decidir que prefefirmos.

Interfaces como macros

La interfaz por ejemplo a un puerto podria ser por ejemplo:

Dio_SetSync(Led1, HIGH);

donde Led1 es el nombre como ha sido indicado en la configuración. Esto se puede implementar como macro de la siguiente forma

#define Led1 1

#define Dio_SetSync(pin, state) Dio_SetSync_ ## (pin) (state)

#define Dio_SetSync_1(state)  ...

donde … es el código para setear en bit en el estado deseado.

Esto tiene ventajas y desventajas:

  • pro: menor overhead posible
  • contra: no se puede referenciar la función Dio_SetSync como puntero
  • contra: no se puede hacer myvar = 1; Dio_SetSync(myvar, HIGH);

A largo plazo se podría hacer opcional esta funcionalidad y ofrecerla si el usuario asi lo configura. Esto tendria solo pros ya que seria el usuario quien decide. Dado que en nuestro caso queremos generar código de ladder a largo plazo creo es mejor no soportar esta funcionalidad.

TODO: hay que decidir que prefefirmos.

Reglas de programación

Generación

Los drivers serán generados en base a la configuración. Para la generación se utiliza php y un parser que ya fue testeado en el RTOS.

¿Cómo agregar un nuevo archivo para ser generado?

Estructura de dicrectorios

Se denomina template a un archivo .h/.c.php que va a ser utilizado para generar a un archivo con el mismo nombre pero sin la extension final .php.

  • gen: directorio donde van los templates de los archivos a generar
  • gen/inc: directorio donde van los header templates
  • gen/inc/<ARCH>/<CPUTYPE>/<CPU>: directorio donde van los header templates.
  • gen/src: directorio donde van los source templates
  • gen/src/<ARCH>/<CPUTYPE>/<CPU>: directorio donde van los source templates.

ARCH, CPUTYPE y CPU estan definidos en el makefile, es importante siempre utilizar el comun denominador. Si una función puede ser utilizada por todos los ARCH debe ir en gen/src. Si por todos los CPUTYPES debe ir en gen/src/<ARCH>, etc.

Archivos

Los siguientes archivos existen para los sigueintes fines:

  • IODriver.h: contiene las definiciones y declaraciones generales. Este es el archivo incluido por los usuarios
  • Prefijos:
    • Dio_
    • Pwm_
    • Pwd_
    • Adc_
  • Posfijo [_Internal][_Arch][_Cfg].c/h.php:
    • _Internal es un archivo de uso solo interno, no es incluido por el usuario
    • _Arch es un archivo dependiente de la arch.
    • _Cfg es un archivo generado, depende de la configuracion

Drivers

Dio

Configuración

  • Contine:
    • Nombre: PIN
    • Tipo: Número
    • Descripción: define el pin del micro en que esta salida entrada aplica
    • Nombre: PORT
    • Tipo: Número
    • Descripción: define el puerto del micro en que esta salida entrada aplica
    • Nombre: DIRECTION
    • Tipo: una opción de [UNUSED (default), INPUT, OUTPUT_INIT_LOW, OUTPUT_INIT_HIGH]
    • Descripción: indica como será utilizado este pin
    • Nombre: INVERTED
    • Tipo: una opción de [FLASE (default), TRUE]
    • Descripción: Indica si el pin esta o no invertido
    • Nombre: NOTIFICATION
    • Tipo: no soportado en una primera versión
  • Nombre: PORT
  • Tipo: Estructura
  • Descripción: define un puerto
  • Contiene:
    • Nombre: PORT
    • Tipo: Número
    • Descripción: indica en que puerto se mapea

API

  • Dio_InitSync
  • Dio_GetVersionOfDriver
  • Dio_GetSync
  • Dio_SetSync
  • Dio_GetPortSync
  • Dio_SetPortSync
  • Dio_SetPortMaskedSync

Pwm

Configuración

  • Nombre: PWM
  • Tipo: Estructura
  • Descripción: define un PWM
  • Contine:
    • Nombre: PIN
    • Tipo: Número
    • Descripción: define el pin del micro
    • Nombre: PORT
    • Tipo: Número
    • Descripción: define el puerto del micro
    • Nombre: FREQUENCY
    • Tipo: Número
    • Descripción: define la frequencia
    • Nombre: PHASE
    • Tipo: Número [0x0000, 0xFFFF] desfazaje entre 0 y 100%
    • Descripción:
    • Nombre: INVERTED
    • Tipo: una opción de [FLASE (default), TRUE]
    • Descripción: Indica si la senial esta o no invertida
    • Nombre: NOTIFICATION
    • Tipo: no soportado en una primera versión

API

  • Pwm_InitSync
  • Pwm_GetVersionOfDriver
  • Pwm_GetSync
  • Pwm_SetSync
  • Pwm_GetFrequencySync
  • Pwm_SetFrequencySync
  • Pwm_SetAllSync

Pwd

Configuración

  • Nombre: PWD
  • Tipo: Estructura
  • Descripción: define un PWD
  • Contine:
    • Nombre: PIN
    • Tipo: Número
    • Descripción: define el pin del micro
    • Nombre: PORT
    • Tipo: Número
    • Descripción: define el puerto del micro
    • Nombre: FREQUENCY
    • Tipo: Número
    • Descripción: define la frequencia
    • Nombre: INVERTED
    • Tipo: una opción de [FLASE (default), TRUE]
    • Descripción: Indica si la senial esta o no invertida
    • Nombre: NOTIFICATION
    • Tipo: no soportado en una primera versión

API

  • Pwd_InitSync
  • Pwd_GetVersionOfDriver
  • Pwd_GetSync
  • Pwd_GetStateSync
  • Pwd_GetFrequencySync
  • Pwd_StartSampleSync
  • Pwd_StartSampleAllSync
  • Pwd_StopSampleSync

Adc

Configuración

  • Nombre: ADC
  • Tipo: Estructura
  • Descripción: define un Adc
  • Contine:
    • Nombre: PIN
    • Tipo: Número
    • Descripción: define el pin del micro
    • Nombre: PORT
    • Tipo: Número
    • Descripción: define el puerto del micro
    • Nombre: FREQUENCY
    • Tipo: Número
    • Descripción: define la frequencia
    • Nombre: RESOLUTION
    • Tipo: número
    • Descripción: Indica si la resolución del adc en bits

API

  • Adc_InitSync
  • Adc_GetVersionOfDriver
  • Adc_GetSync
  • Adc_GetStateSync
  • Adc_StartSampleSync
  • Adc_StartSampleAllSync
  • Pwd_StopSampleSync
desarrollo/firmware/hisio.1450955457.txt.gz · Última modificación: 2015/12/24 08:10 por mcerdeiro