嵌入式操作系统----BSP架构实现

时间:2024-03-21 13:26:23

在嵌入式系统中为了对外设进行统一管理,本文设计了一种简易的设备驱动管理架构。

一、基本概念

所谓设备驱动管理架构是指使用数组索引的方式对SOC片内外设进行统一的管理。

基本原理:

为每一种外设分配一个设备编号,功能函数通过设备编号索引相应的设备操作。

 

二、设备驱动管理架构结构体

1、将SOC片内外设进行编号

//设备编号,静态分配

#define     Device_Spi    1

#define     Device_I2C    2

#define Device_Timer  3

//设备最大数量

#define     DeviceMaxNum  20

2、自定义设备索引数组表

typedef struct

{

         u32(*pInit)();

         u32(*pRead)();

         u32(*pWrite)();

         u32(*pIoControl)();

}DeviceRegisterParam;

 

//设备操作索引表

DeviceRegisterParamDeviceRegisterList[DeviceMaxNum];

 

3、设备数组索引表

嵌入式操作系统----BSP架构实现

三、BSP函数操作接口

1、设备注册

为了便于设备管理,将所有设备进行编号,并对外设挂接相应的操作函数

设备注册主要是将设备操作函数(init\read\write\ioctl)挂接到设备索引表DeviceRegisterList[DeviceMaxNum]中相应的设备号上;

DeviceRegister(int DeviceID, DeviceRegisterParam* deviceRegisterParam)

{

         DeviceRegisterList[DeviceID].pInit= deviceRegisterParam->pInit;

DeviceRegisterList[DeviceID].pRead =deviceRegisterParam-> pRead;

DeviceRegisterList[DeviceID].pWrite = deviceRegisterParam-> pWrite;

DeviceRegisterList[DeviceID].pIoControl = deviceRegisterParam-> pIoControl;

}

2、设备初始化

应用通过配置设备的初始化参数,调用设备初始化接口,进而调用具体的设备初始化函数完成设备初始化。

DeviceInit(int DeviceID, void * pDeviceInitParam)

{

         DeviceRegisterList[DeviceID].pInit(pDeviceInitParam);

}

 

 

3、读

应用通过调用设备数据读取函数,将具体设备的数据读到指定的内存区域中。

DeviceRead(int DeviceID, void * pDeviceInitParam)

{

         If(Device> DeviceMaxNum )

{

    return False;

}

         If(NULL==  pDeviceInitParam )

{

    return False;

}

         DeviceRegisterList[DeviceID].pRead(pDeviceInitParam);

}

 

4、写

DeviceWrite(int DeviceID, void * pDeviceInitParam)

{

         If(Device> DeviceMaxNum )

{

    return False;

}

         If(NULL==  pDeviceInitParam )

{

    return False;

}

         DeviceRegisterList[DeviceID].pWrite(pDeviceInitParam);

}

 

5、IO控制

 具体的控制命令由初始化参数传递。

DeviceIOControl(int DeviceID, void * pDeviceInitParam)

{

         If(Device> DeviceMaxNum )

{

    return False;

}

         If(NULL==  pDeviceInitParam )

{

    return False;

}

         DeviceRegisterList[DeviceID].pIOControl (pDeviceInitParam);

}