硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1194|回复: 5
收起左侧

划水贴,尝试写设备抽象层,让代码有稳固的依赖

[复制链接]

10

主题

37

回帖

67

积分

初级会员

积分
67
发表于 2024-12-29 19:54:42 | 显示全部楼层 |阅读模式
本帖最后由 LY_Bear 于 2024-12-31 09:43 编辑

背景:

我看高手的代码大多有个抽象层让自己的代码有一个较为稳定的API依赖;
一直想提高自己的编码能力的我也想尝试编写一个关于uart的抽象层头文件。
.C文件就需要用户根据不同需求自己实现。

代码:
[C] 纯文本查看 复制代码
#ifndef __DEV_OASL_UART_H__
#define __DEV_OASL_UART_H__

#ifdef __cplusplus
extern "C"
{
#endif

/*---------------------------INC---------------------------*/
#include<stdint.h>

/*---------------------------MACRO---------------------------*/
#define DEV_UART_MODE_MASK (0xF)
#define DEV_UART_PORT_MASK (0xF)
#define DEV_UART_TIMEOUT_MASK (0xFFFFFF)

/*---------------------------TYPEDEF---------------------------*/
typedef enum {
    DEV_UART_PORT_0 = 0u,
    DEV_UART_PORT_1,
    DEV_UART_PORT_2,
    DEV_UART_PORT_3,
    DEV_UART_PORT_4,
    DEV_UART_PORT_5,
    DEV_UART_PORT_6,
    DEV_UART_PORT_7,
    DEV_UART_PORT_MAX
} dev_uart_port_t;

typedef enum
{
    DEV_UART_MODE_POLL = 0u,
    DEV_UART_MODE_IRQ,
    DEV_UART_MODE_DMA,
    DEV_UART_MODE_MAX
}dev_uart_mode_t;

typedef struct {
    union
    {
        struct {
            uint32_t port: 4;   // uart port;
            uint32_t mode : 4;   // uart mode;
            uint32_t timeout : 24;    // read/write timeout(only when mode is DEV_UART_MODE_POLL); unit: ms
        }uart_cfg;
        uint32_t uart_reg;
    };
    void           *private_uart;
} dev_uart_t;

/*---------------------------DECLARE---------------------------*/
int dev_uart_init(dev_uart_t *uart, dev_uart_port_t port, dev_uart_mode_t mode);
int dev_uart_deinit(dev_uart_t *uart);

int dev_uart_read(dev_uart_t *uart, uint8_t *buf, size_t size);
int dev_uart_write(dev_uart_t *uart, const uint8_t *buf, size_t size);

#ifdef __cplusplus
}
#endif


#endif// end of header


结语:
自己想要提高编码能力和架构思维,还在学习中,欢迎各位读者赐教!


评分

参与人数 1金币 +10 收起 理由
CheneyY + 10 赞一个!

查看全部评分

回复

使用道具 举报

11

主题

702

回帖

735

积分

金牌会员

积分
735
发表于 2024-12-30 09:24:02 | 显示全部楼层
只有头文件?继续。。。。
回复

使用道具 举报

10

主题

37

回帖

67

积分

初级会员

积分
67
 楼主| 发表于 2024-12-30 10:08:00 | 显示全部楼层
hqgboy 发表于 2024-12-30 09:24
只有头文件?继续。。。。

头文件只规定一个对设备的抽象接口,C文件是根据你使用的平台不同而定的。
接口规定好了,每个人的实现可以不同;还需要根据具体硬件资源来实现才行。
有这样一个头文件,在此基础上构建的代码就不用再根据不同硬件改动。
移植在此之上构建的代码,只需要实现这些接口即可。

新手之言,如有不妥,欢迎指正和讨论。
回复

使用道具 举报

10

主题

75

回帖

120

积分

初级会员

积分
120
发表于 2024-12-30 13:32:13 | 显示全部楼层
可参考CMSIS-Driver里的USART Interface
回复

使用道具 举报

10

主题

37

回帖

67

积分

初级会员

积分
67
 楼主| 发表于 2024-12-31 08:38:41 | 显示全部楼层
egoistaw 发表于 2024-12-30 13:32
可参考CMSIS-Driver里的USART Interface

有一定的参考价值!
回复

使用道具 举报

5

主题

19

回帖

34

积分

新手上路

积分
34
发表于 2025-1-14 11:26:03 | 显示全部楼层
编写进度如何了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 07:33 , Processed in 0.044120 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表