本帖最后由 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
结语:
自己想要提高编码能力和架构思维,还在学习中,欢迎各位读者赐教!
|