Modelo de controlador unificado para microcontroladores de baja y alta velocidad con memoria buena y limitada

2

Estoy tratando de desarrollar un RTOS experimental. Estoy atrapado en el diseño de la capa de controlador. Quiero hacer que las bibliotecas de capas del controlador sean amigables para las otras capas, pero de nuevo me gustaría tener un alto rendimiento.   He reducido esto a una mezcla de 2 enfoques. El primero es tener una estructura para el controlador con devoluciones de llamada como elementos.  Por ejemplo:

struct peripheral_controller { 
    int32_t (*init) (struct peripheral_instance_regs *peripheral_instance_regs);
    int32_t (*isFull) (struct peripheral_instance_regs *peripheral_instance_regs);
};

El segundo enfoque es tener macros auxiliares que tomen el campo periférico_instancia_regs como argumentos.

Por ejemplo:

#define isFull(reg)
 (reg&0x01 == 1)

¿Es este el enfoque correcto? ¿Confundirá a los usuarios de mi biblioteca? El problema con las devoluciones de llamada que veo está en la rutina de interrupción, donde no querría llamar a ninguna función.

    
pregunta mindentropy

1 respuesta

1

(Consulte también ¿Existe un estándar para escribir controladores de dispositivos para microcontroladores? ; como su pregunta se relaciona únicamente con el software, puede obtener una mejor respuesta en el intercambio de pila de software.)

En C, las funciones son fuertemente preferidas a las macros siempre que sea posible. Son más fáciles de depurar, y pueden integrarse igual de bien si le preocupa la velocidad. Dice "en la rutina de interrupción donde no querría llamar a ninguna función"; ¿Para qué plataforma de destino estás escribiendo y tienes un límite de pila dura? Prohibir totalmente las funciones de los controladores de interrupción tampoco es un gran estilo. Es posible que desee invertir en una arquitectura de "mitad superior" / "mitad inferior" tal como la utiliza Linux.

Habiendo dicho eso, el estilo casi orientado a objetos (no lo llamaría "devolución de llamada") de pasar un mapa de registros periféricos no funciona bien en plataformas muy pequeñas como PIC, donde el direccionamiento indirecto es irrazonablemente caro Esos son realmente demasiado pequeños para un sistema operativo significativo con controladores.

    
respondido por el pjc50

Lea otras preguntas en las etiquetas