1. 设备管理框架总览

    设备管理可分为三层,①设备管理框架层:从各种设备的功能提取出共同的特征,即设备抽象,用于为应用程序提供通用接口,通过这些接口调用注册到接口的设备驱动框架接口,再通过调用注册到设备驱动框架接口的设备驱动程序执行设备驱动程序。这样做的好处是,对于不同的处理器应用程序不需要做出更改,仅需要更改驱动程序即可,这对程序的可重复利用至关重要,而且有利于团队的分工协作。②设备驱动框架层:作为驱动程序与设备管理接口的中间件,起到呈上启下的作用,为各种设备如SPI、I2C、SERIAL、CAN、USB等提供了统一的接口,它为上层提供实例函数但真执行的是注册的设备驱动程序。③设备驱动层:是某设备最终执行的程序,比如某设备的SPI设备驱动程序,它将设置SPI的时钟频率、工作模式、单次访问的位宽、单线双向/双线单向功能控制,以及读取操作和写入操作、写后读、连续读等结合硬件的操作函数注册到设备驱动框架层,并在应用程序调用时实际执行。
    2.设备注册操作
    判断设备指针是否指向空地址
    根据传递的设备名称在对象容器的设备链表中查找设备对象是否存在
    将设备对象插入对象容器的设备类型链表

    设置设备驱动框架对象的参数
    3.设备解除注册操作
    判断设备指针是否为空
    判断形参传递的设备对象是否为设备类型
    判断设备对象是否为系统对象(即静态对象)
    将设备驱动框架对象从对象容器和的设备链表中删除

    4.设备查找
    如果当前线程指针不为空,则进入临界区,否则继续往下执行
    获取对象容器当中设备对象的链表头指针
    如果链表指针不为空,则遍历链表,根据链表指针的实际地址计算出设备对象地址
    取出设备对象的名称与形参传递过来的名称比对,如果名称一致则返回对象指针并退出(如果当前线程指针不为空需先退出临界区)

    若整个链表均无法找到与此名称一致的对象,则返回空地址
    5.设备对象创建
    计算设备结构体对齐后尺寸与附加对齐后尺寸之和,并分配相应的空间
    如果空间分配成功,则对设备对象各成员赋0初始化
    并将设备对象类型配置为形参传递过来的类型
    6.设备对象销毁
    判断设备指针是否为空
    判断形参传递的设备对象是否为设备类型
    判断设备对象是否为系统对象
    将设备对象从对象容器和的设备链表中删除

    释放设备对象空间
    8.设备打开
    判断设备指针是否为空
    判断形参传递过来的设备对象是否为设备类型
    若设备对象未初始化,先对其初始化
    若为独立设备且已经打开,则返回
    若设备打开函数指针指向非空,则调用设备打开函数
    打开成功则标志设备已打开,并将引用计数器加1
    9.设备关闭
    判断设备指针是否为空
    判断形参传递过来的设备对象是否为设备类型
    若设备引用计数器不为0则对其减1操作
    若设备引用计数器仍不为0则返回
    如果设备关闭函数指针不为空,则调用设备关闭函数。
    标记设备已关闭。
    10.设备读取
    判断设备指针是否为空
    判断形参传递过来的设备对象是否为设备类型
    如果设备引用计数器为零,则直接返回
    若设备读取函数指针不为空,则调用设备读取函数
    11.设备写入
    判断设备指针是否为空
    判断形参传递过来的设备对象是否为设备类型
    如果设备引用计数器为零,则直接返回
    若设备写入函数指针不为空,则调用设备写入函数。
    12.设备控制
    判断设备指针是否为空
    判断形参传递过来的设备对象是否为设备类型
    若设备控制函数指针不为空,则调用设备控制函数。
    13.注册接收完成回调函数
    判断设备指针是否为空
    判断形参传递过来的设备对象是否为设备类型
    注册设备接收完成回调函数。
    14.注册发送完成回调函数
    判断设备指针是否为空
    判断形参传递过来的设备对象是否为设备类型
    注册设备发送完成回调函数。