首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >嵌入式软件体系结构- DAL和HAL的区别是什么?

嵌入式软件体系结构- DAL和HAL的区别是什么?
EN

Software Engineering用户
提问于 2018-06-28 17:07:29
回答 1查看 1.2K关注 0票数 3

当谈到嵌入式软件时,我想知道硬件抽象层(HAL)和数据抽象层(DAL)之间的区别。但我的缩写可能错了..。

我的理解是,在HAL级别,您使用mcu的寄存器,而在DAL级别不使用。我编写了一个快速示例,说明我个人如何在HAL和DAL级别实现UART驱动程序:

代码语言:javascript
运行
复制
/***************************************************************************************************************************
 * HAL
 ***************************************************************************************************************************/


#define UART_PARITY (*((volatile unsigned long *) 0x0000123))
#define T0IR        (*((volatile unsigned long *) 0x0000124))
#define U0THR       (*((volatile unsigned long *) 0x0000125))
#define UART_BDR    (*((volatile unsigned long *) 0x0000126))

typedef enum{
    UART_HAL_STATUS_SUCCESS,
    UART_HAL_STATUS_ERROR
} uart_hal_status_t;

typedef struct{

} uart_hal_t;

/* Write some values to registers. */
uart_hal_status_t UART_HAL_init(p_baudrate, p_parity, p_device)
{
    /* Calculates which exact value needs to be written to register to have desired baudrate. */
    unsigned long x = ((p_baudrate/2)*PLL*SMTH);
    UART_BDR = x;

    /* Write values to registers. */
    if (p_parity == 0)
    {
        UART_PARITY = 1<<8;
    }
    else
    {
        UART_PARITY = 0<<8;
    }

    /* Set some additional register values. */
    VICSoftIntClr = 0x20;
    T0IR =0xFF;
    VICVectAddr =0x00000000;

    return UART_HAL_STATUS_SUCCESS;
}

uart_hal_status_t UART_HAL_read_char(uart_hal_t p_uart_dev)
{
    //read registers
}

/***************************************************************************************************************************
 * DAL
 ***************************************************************************************************************************/

#include <uarth_hal.h>
#include <inttypes.h>

/**
 * Parity types.
 */
typedef enum{
    PARITY_ODD,
    PARITY_EVEN
} parity_t;

/**
 *  Return values.
 */
typedef enum{
    UART_DAL_STATUS_SUCCESS,
    UART_DAL_STATUS_ERROR
}uart_dal_status_t;

/**
 * Physical UART devices.
 */
typedef enum{
    UART_DEV_0,
    UART_DEV_1,
    UART_DEV_2
} uart_dev_t;


/**
 * Publicly accessible configuration structure.
 */
typedef struct{
    int32_t baudrate;
    parity_t parity;

    uart_dev_t device;
} UART_cfg_t;

/**
 * Wannabe opaque structure.
 */
typedef struct{
    UART_cfg_t config;

    uart_hal_t hal_device; 

    void *rx_buffer;
    uint32_t rx_buffer_nr_unread_chars;
    uint32_t rx_buffer_size;
} UART_t;

/**
 * This function initializes the UART port at the DAL level
 */
uart_dal_status_t UART_DAL_init(UART_t *p_uart_dev, UART_cfg_t *p_uart_cfg)
{
    if ((p_uart_dev == NULL) || (p_uart_cfg == NULL))
    {
        return UART_DAL_STATUS_ERROR;
    }

    UART_HAL_init(p_uart_cfg->baudrate, p_uart_cfg->parity, p_uart_cfg->device);

    p_uart_dev->config = *(p_uart_cfg);

    return UART_DAL_STATUS_SUCCESS;
}

uart_dal_status_t UART_DAL_read_data(UART_t *p_uart_dev)
{
    for (uint32_t i = 0; i < p_uart_dev->rx_buffer_nr_unread_chars; i++)
    {
        UART_HAL_read_char(p_uart_dev->hal_device);
    }

    return UART_DAL_STATUS_SUCCESS;
}

/***************************************************************************************************************************
 * main
 ***************************************************************************************************************************/

#include <uart_dal.h>

int main (int p_argc, char *p_argv[])
{
    UART_t l_uart_dev;

    UART_cfg_t l_uart_cfg = 
    {
        .baudrate = 9600,
        .parity = PARITY_ODD,
        .device = UART_DEV_0
    };

    uart_dal_status_t l_status = UART_DAL_init(&l_uart_dev, &l_uart_cfg);
    if (l_status != UART_DAL_STATUS_SUCCESS)
    {
        return -1;
    }

    while(1);

    return 0;
}

为了澄清,我创建了所有这些值并注册了名称。

EN

回答 1

Software Engineering用户

发布于 2019-03-05 13:44:02

  • 硬件抽象层:使用外围设备(UART,SPI,Timer,.)在不同的平台上使用相同的API。
  • DBAL =数据库抽象层:使用具有不同实现的相同API的数据存储(SQL,.)。
  • DAL =数据访问层:简化原始数据库访问的软件块(SQL请求)。

由于嵌入式系统中的数据库比计算机软件简单,所以DBAL和DAL经常被压缩。

为了用一个复杂的例子来增加它的趣味性:假设您有一个带有SPI接口的外部闪存,您想要在其中存储数据:

  • DBAL将实现一个简单的数据库映射:例如key/value,其中包含一个与物理地址相关联的键,并使用正确的地址调用DAL。
  • DAL将通过SPI使用HAL对Flash内存执行简单的写/读内存操作。

设想情况:

有关DBAL/DAL:https://stackoverflow.com/questions/2838661/what-is-the-difference-between-database-abstraction-layer-data-access-layer的详细信息,请参阅

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/373300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档