Notas de estudio del kernel de RT-Thread: comprensión del modelo de dispositivo rt_device

RT-Thread Kernel Study Notes-Objeto kernel rt_object

RT-Thread Kernel Study Notes-Kernel Object Management

RT-Thread Kernel Study Notes-API de operación de objetos del kernel

RT-Thread notas de estudio del kernel: inicialización de objetos del kernel organización de listas vinculadas

Notas de estudio del kernel de RT-Thread comprensión en profundidad de la estructura de la lista vinculada de objetos del kernel

Notas de estudio del kernel de RT-Thread: comprensión del modelo de dispositivo rt_device

RT-Thread Kernel Study Notes: comprensión de los hilos zombies desaparecidos

 

Prefacio

  • Recientemente, estaba mirando el código fuente del kernel, evitando temporalmente métodos de implementación más complicados, como la programación de tareas y la administración de memoria, y descubrí que la implementación del marco del dispositivo rt_device es muy simple.
  • rt_device, el marco de administración de dispositivos (modelo), proporciona API de interfaz de operación de dispositivos estándar. Algunos periféricos se pueden abstraer en dispositivos para operaciones de administración unificadas, como LCD, Touch, Sensor, etc.

 

La estructura de rt_device

  • rt_device se deriva del objeto del kernel, por lo que algunas operaciones están operando en el objeto del kernel. Las últimas notas estudiaron la administración de objetos del kernel, y ahora encuentro que es fácil de entender mirando el archivo device.c.

device.png

rt_device_class_type.png

 

Uso de rt_device

  • El PIN, CAN, Serial, I2C, SPI, PM, etc. de RT-Thread se resumen en un modelo de dispositivo. Estos modelos de dispositivos se pueden derivar de rt_device.

Modelo de dispositivo de clavija: la estructura es la siguiente:

/* pin device and operations for RT-Thread */
struct rt_device_pin
{
    struct rt_device parent; /* 派生于rt_device */
    const struct rt_pin_ops *ops; /* 设备特有的操作接口,还可以根据需要增加其他成员 */
};
  • Por lo tanto, los usuarios pueden derivar el marco de dispositivo que desean, agregar interfaces de operación de dispositivo específicas: operaciones y atributos específicos: miembros de estructura.
  • El dispositivo específico debe registrarse en el contenedor del kernel y aquí se llama a la interfaz de registro de rt_device.

Tal como:

/* 使用时,需要把设备名称、操作接口等,传入 */
int rt_device_pin_register(const char *name, const struct rt_pin_ops *ops, void *user_data)
{
    _hw_pin.parent.type         = RT_Device_Class_Miscellaneous; /* 设备类型,为了区分设备种类 */
    _hw_pin.parent.rx_indicate  = RT_NULL; /* 接收回调,串口、CAN一般会有 */
    _hw_pin.parent.tx_complete  = RT_NULL; /* 发送回调,串口、CAN一般会有 */

#ifdef RT_USING_DEVICE_OPS
    _hw_pin.parent.ops          = &pin_ops;
#else
    _hw_pin.parent.init         = RT_NULL; /* 以下标准的rt_device设备操作接口,根据需要实现 */
    _hw_pin.parent.open         = RT_NULL;
    _hw_pin.parent.close        = RT_NULL;
    _hw_pin.parent.read         = _pin_read;
    _hw_pin.parent.write        = _pin_write;
    _hw_pin.parent.control      = _pin_control;
#endif

    _hw_pin.ops                 = ops;  /* 操作接口,设备的特有操作接口 */
    _hw_pin.parent.user_data    = user_data; /* 不是必要的用户数据 */

    /* register a character device */
    rt_device_register(&_hw_pin.parent, name, RT_DEVICE_FLAG_RDWR);  /* 设备注册接口:注册为具体设备 */

    return 0;
}
  • Marco de equipo de acoplamiento de equipo específico
/* 具体设备的OPS 实现 */
const static struct rt_pin_ops _stm32_pin_ops =
{
    stm32_pin_mode,
    stm32_pin_write,
    stm32_pin_read,
    stm32_pin_attach_irq,
    stm32_pin_dettach_irq,
    stm32_pin_irq_enable,
};

/* 实际设备的注册方法 */
rt_device_pin_register("pin", &_stm32_pin_ops, RT_NULL);
  • Una vez registrado el dispositivo, puede verlo a través de: list_device

 

otro

  • Antes de rt_device_read rt_device_write y otras operaciones, necesita: rt_device_open
  • rt_device_open Es mejor que las operaciones de rt_device_close aparezcan en pares, porque hay un recuento de referencia dentro de rt_device. Por ejemplo, si abre dos veces y cierra una vez, el recuento es 1, no hay un cierre real.
  • Generalmente, a través de rt_device_find, a través del nombre del dispositivo, se busca el dispositivo y se puede obtener el identificador de operación del dispositivo, que es el puntero de la estructura del dispositivo, de modo que las operaciones de la interfaz de operación del dispositivo se puedan operar más o el dispositivo se puede operar a través de la interfaz de operación estándar del dispositivo.
  • Hay muchos tipos de dispositivos en RT-Thread, que pueden derivar varios modelos de dispositivos (marcos), de modo que se pueden registrar y montar muchos dispositivos, y se pueden implementar fácilmente operaciones como el control de lectura y escritura, como el control de hardware, sensores etc.

 

para resumir

  • El dispositivo se deriva del objeto del kernel: rt_object, familiarizado con el objeto del kernel, es propicio para estar familiarizado con el funcionamiento de rt_device
  • Continúe estudiando el núcleo de RT-Thread, continúe aprendiendo y gane mucho.

Supongo que te gusta

Origin blog.csdn.net/tcjy1000/article/details/114046629
Recomendado
Clasificación